FreeCAD

Форк
0
/
MakeBottle.py 
135 строк · 3.7 Кб
1
#! python
2
# -*- coding: utf-8 -*-
3
# (c) 2008 Werner Mayer LGPL
4

5

6
import Part, math
7
import FreeCAD, FreeCADGui
8
App=FreeCAD
9
Gui=FreeCADGui
10
from FreeCAD import Base
11

12
def makeBottle(myWidth=50.0, myHeight=70.0, myThickness=30.0):
13
	aPnt1=Base.Vector(-myWidth/2.,0,0)
14
	aPnt2=Base.Vector(-myWidth/2.,-myThickness/4.,0)
15
	aPnt3=Base.Vector(0,-myThickness/2.,0)
16
	aPnt4=Base.Vector(myWidth/2.,-myThickness/4.,0)
17
	aPnt5=Base.Vector(myWidth/2.,0,0)
18

19
	aArcOfCircle = Part.Arc(aPnt2,aPnt3,aPnt4)
20
	aSegment1=Part.LineSegment(aPnt1,aPnt2)
21
	aSegment2=Part.LineSegment(aPnt4,aPnt5)
22

23
	aEdge1=aSegment1.toShape()
24
	aEdge2=aArcOfCircle.toShape()
25
	aEdge3=aSegment2.toShape()
26
	aWire=Part.Wire([aEdge1,aEdge2,aEdge3])
27

28
	aTrsf=Base.Matrix()
29
	aTrsf.rotateZ(math.pi) # rotate around the z-axis
30

31
	aMirroredWire=aWire.copy()
32
	aMirroredWire.transformShape(aTrsf)
33
	myWireProfile=Part.Wire([aWire,aMirroredWire])
34

35
	myFaceProfile=Part.Face(myWireProfile)
36
	aPrismVec=Base.Vector(0,0,myHeight)
37
	myBody=myFaceProfile.extrude(aPrismVec)
38

39
	myBody=myBody.makeFillet(myThickness/12.0,myBody.Edges)
40

41
	neckLocation=Base.Vector(0,0,myHeight)
42
	neckNormal=Base.Vector(0,0,1)
43

44
	myNeckRadius = myThickness / 4.
45
	myNeckHeight = myHeight / 10
46
	myNeck = Part.makeCylinder(myNeckRadius,myNeckHeight,neckLocation,neckNormal)
47
	myBody = myBody.fuse(myNeck)
48

49
	faceToRemove = 0
50
	zMax = -1.0
51

52
	for xp in myBody.Faces:
53
		surf = xp.Surface
54
		if type(surf) == Part.Plane:
55
			z = surf.Position.z
56
			if z > zMax:
57
				zMax = z
58
				faceToRemove = xp
59

60
	# This doesn't work for any reason
61
	myBody = myBody.makeThickness([faceToRemove],-myThickness/50 , 1.e-3)
62
	myThreading = Part.makeThread(myNeckHeight/10, myNeckRadius*0.06, myHeight/10, myNeckRadius*0.99)
63
	myThreading.translate(Base.Vector(0,0,myHeight))
64
	myCompound = Part.Compound([myBody, myThreading])
65

66
	return myCompound
67

68
def makeBoreHole():
69
	# create a document if needed
70
	if App.ActiveDocument is None:
71
		App.newDocument("Solid")
72

73
	Group = App.ActiveDocument.addObject("App::DocumentObjectGroup","Group")
74
	Group.Label="Bore hole"
75

76
	V1 = Base.Vector(0,10,0)
77
	V2 = Base.Vector(30,10,0)
78
	V3 = Base.Vector(30,-10,0)
79
	V4 = Base.Vector(0,-10,0)
80
	VC1 = Base.Vector(-10,0,0)
81
	C1 = Part.Arc(V1,VC1,V4)
82
	# and the second one
83
	VC2 = Base.Vector(40,0,0)
84
	C2 = Part.Arc(V2,VC2,V3)
85
	L1 = Part.LineSegment(V1,V2)
86
	# and the second one
87
	L2 = Part.LineSegment(V4,V3)
88
	S1 = Part.Shape([C1,C2,L1,L2])
89

90
	W=Part.Wire(S1.Edges)
91
	F=Part.Face(W)
92
	P=F.extrude(Base.Vector(0,0,5))
93

94
	# add objects with the shape
95
	Wire=Group.newObject("Part::Feature","Wire")
96
	Wire.Shape=W
97
	Face=Group.newObject("Part::Feature","Face")
98
	Face.Shape=F
99
	Prism=Group.newObject("Part::Feature","Extrude")
100
	Prism.Shape=P
101

102
	c=Part.Circle(Base.Vector(0,0,-1),Base.Vector(0,0,1),2.0)
103
	w=Part.Wire(c.toShape())
104
	f=Part.Face(w)
105
	p=f.extrude(Base.Vector(0,0,7))
106
	P=P.cut(p)
107

108
	# add first borer
109
	Bore1=Group.newObject("Part::Feature","Borer_1")
110
	Bore1.Shape=p
111
	Hole1=Group.newObject("Part::Feature","Borer_Hole1")
112
	Hole1.Shape=P
113

114
	c=Part.Circle(Base.Vector(0,-11,2.5),Base.Vector(0,1,0),1.0)
115
	w=Part.Wire(c.toShape())
116
	f=Part.Face(w)
117
	p=f.extrude(Base.Vector(0,22,0))
118
	P=P.cut(p)
119

120
	# add second borer
121
	Bore2=Group.newObject("Part::Feature","Borer_2")
122
	Bore2.Shape=p
123
	Hole2=Group.newObject("Part::Feature","Borer_Hole2")
124
	Hole2.Shape=P
125

126
	App.ActiveDocument.recompute()
127

128
	# hide all objects except of the final one
129
	Gui.ActiveDocument.getObject(Wire.Name).hide()
130
	Gui.ActiveDocument.getObject(Face.Name).hide()
131
	Gui.ActiveDocument.getObject(Prism.Name).hide()
132
	Gui.ActiveDocument.getObject(Bore1.Name).hide()
133
	Gui.ActiveDocument.getObject(Hole1.Name).hide()
134
	Gui.ActiveDocument.getObject(Bore2.Name).hide()
135
	Gui.ActiveDocument.ActiveView.fitAll()
136

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.