Arch: Optimized Arch panel waves generation
This commit is contained in:
@@ -357,14 +357,16 @@ class _Panel(ArchComponent.Component):
|
||||
obj.addProperty("App::PropertyDistance","Offset","Arch", QT_TRANSLATE_NOOP("App::Property","The offset between this panel and its baseline"))
|
||||
obj.addProperty("App::PropertyLength","WaveLength","Arch", QT_TRANSLATE_NOOP("App::Property","The length of waves for corrugated elements"))
|
||||
obj.addProperty("App::PropertyLength","WaveHeight","Arch", QT_TRANSLATE_NOOP("App::Property","The height of waves for corrugated elements"))
|
||||
obj.addProperty("App::PropertyDistance","WaveOffset","Arch", QT_TRANSLATE_NOOP("App::Property","The horizontal offset of waves for corrugated elements"))
|
||||
obj.addProperty("App::PropertyAngle","WaveDirection","Arch", QT_TRANSLATE_NOOP("App::Property","The direction of waves for corrugated elements"))
|
||||
obj.addProperty("App::PropertyEnumeration","WaveType","Arch", QT_TRANSLATE_NOOP("App::Property","The type of waves for corrugated elements"))
|
||||
obj.addProperty("App::PropertyBool","WaveBottom","Arch", QT_TRANSLATE_NOOP("App::Property","If the wave also affects the bottom side or not"))
|
||||
obj.addProperty("App::PropertyArea","Area","Arch", QT_TRANSLATE_NOOP("App::Property","The area of this panel"))
|
||||
obj.addProperty("App::PropertyEnumeration","FaceMaker","Arch",QT_TRANSLATE_NOOP("App::Property","The facemaker type to use to build the profile of this object"))
|
||||
obj.addProperty("App::PropertyVector","Normal","Arch",QT_TRANSLATE_NOOP("App::Property","The normal extrusion direction of this object (keep (0,0,0) for automatic normal)"))
|
||||
obj.Sheets = 1
|
||||
self.Type = "Panel"
|
||||
obj.WaveType = ["Curved","Trapezoidal"]
|
||||
obj.WaveType = ["Curved","Trapezoidal","Spikes"]
|
||||
obj.FaceMaker = ["None","Simple","Cheese","Bullseye"]
|
||||
obj.setEditorMode("VerticalArea",2)
|
||||
obj.setEditorMode("HorizontalArea",2)
|
||||
@@ -531,41 +533,125 @@ class _Panel(ArchComponent.Component):
|
||||
# corrugated element
|
||||
bb = baseprofile.BoundBox
|
||||
bb.enlarge(bb.DiagonalLength)
|
||||
p1 = Vector(bb.getPoint(0).x,bb.getPoint(0).y,bb.Center.z)
|
||||
downsegment = None
|
||||
if hasattr(obj,"WaveBottom"):
|
||||
if not obj.WaveBottom:
|
||||
if obj.WaveType == "Curved":
|
||||
if obj.Thickness.Value > obj.WaveHeight.Value:
|
||||
downsegment = obj.Thickness.Value
|
||||
else:
|
||||
downsegment = obj.WaveHeight.Value + obj.Thickness.Value
|
||||
else:
|
||||
downsegment = obj.Thickness.Value
|
||||
p1 = Vector(0,0,0)
|
||||
p5 = Vector(obj.WaveLength.Value*2,0,0)
|
||||
if obj.WaveType == "Curved":
|
||||
p2 = p1.add(Vector(obj.WaveLength.Value/2,0,obj.WaveHeight.Value))
|
||||
p3 = p2.add(Vector(obj.WaveLength.Value/2,0,-obj.WaveHeight.Value))
|
||||
p2 = Vector(obj.WaveLength.Value/2,0,obj.WaveHeight.Value)
|
||||
p3 = Vector(obj.WaveLength.Value,0,0)
|
||||
e1 = Part.Arc(p1,p2,p3).toShape()
|
||||
p4 = p3.add(Vector(obj.WaveLength.Value/2,0,-obj.WaveHeight.Value))
|
||||
p5 = p4.add(Vector(obj.WaveLength.Value/2,0,obj.WaveHeight.Value))
|
||||
p4 = Vector(obj.WaveLength.Value*1.5,0,-obj.WaveHeight.Value)
|
||||
e2 = Part.Arc(p3,p4,p5).toShape()
|
||||
else:
|
||||
if obj.WaveHeight.Value < obj.WaveLength.Value:
|
||||
p2 = p1.add(Vector(obj.WaveHeight.Value,0,obj.WaveHeight.Value))
|
||||
p3 = p2.add(Vector(obj.WaveLength.Value-2*obj.WaveHeight.Value,0,0))
|
||||
p4 = p3.add(Vector(obj.WaveHeight.Value,0,-obj.WaveHeight.Value))
|
||||
e1 = Part.makePolygon([p1,p2,p3,p4])
|
||||
p5 = p4.add(Vector(obj.WaveHeight.Value,0,-obj.WaveHeight.Value))
|
||||
p6 = p5.add(Vector(obj.WaveLength.Value-2*obj.WaveHeight.Value,0,0))
|
||||
p7 = p6.add(Vector(obj.WaveHeight.Value,0,obj.WaveHeight.Value))
|
||||
e2 = Part.makePolygon([p4,p5,p6,p7])
|
||||
else:
|
||||
p2 = p1.add(Vector(obj.WaveLength.Value/2,0,obj.WaveHeight.Value))
|
||||
p3 = p2.add(Vector(obj.WaveLength.Value/2,0,-obj.WaveHeight.Value))
|
||||
e1 = Part.makePolygon([p1,p2,p3])
|
||||
p4 = p3.add(Vector(obj.WaveLength.Value/2,0,-obj.WaveHeight.Value))
|
||||
p5 = p4.add(Vector(obj.WaveLength.Value/2,0,obj.WaveHeight.Value))
|
||||
e2 = Part.makePolygon([p3,p4,p5])
|
||||
edges = [e1,e2]
|
||||
upsegment = Part.Wire([e1,e2])
|
||||
if not downsegment:
|
||||
if obj.Thickness.Value < e1.Curve.Radius:
|
||||
c3 = e1.Curve.copy()
|
||||
c3.Radius = e1.Curve.Radius-obj.Thickness.Value
|
||||
e3 = Part.Arc(c3,e1.FirstParameter,e1.LastParameter).toShape()
|
||||
c4 = e2.Curve.copy()
|
||||
c4.Radius = e2.Curve.Radius+obj.Thickness.Value
|
||||
e4 = Part.Arc(c4,e2.FirstParameter,e2.LastParameter).toShape()
|
||||
downsegment = Part.Wire([e3,e4])
|
||||
else:
|
||||
r = e2.Curve.Radius+obj.Thickness.Value
|
||||
z = math.sqrt(r^2 - obj.WaveLength.Value^2)
|
||||
p6 = e2.Curve.Center.add(Vector(-obj.WaveLength,0,-z))
|
||||
p7 = e2.Curve.Center.add(Vector(0,0,-r))
|
||||
p8 = e2.Curve.Center.add(Vector(obj.WaveLength,0,-z))
|
||||
downsegment = Part.Arc(p6,p7,p8).toShape()
|
||||
|
||||
elif obj.WaveType == "Trapezoidal":
|
||||
p2 = Vector(obj.WaveLength.Value/4,0,obj.WaveHeight.Value)
|
||||
p3 = Vector(obj.WaveLength.Value,0,obj.WaveHeight.Value)
|
||||
p4 = Vector(obj.WaveLength.Value*1.25,0,0)
|
||||
upsegment = Part.makePolygon([p1,p2,p3,p4,p5])
|
||||
if not downsegment:
|
||||
a = ((p1.sub(p2)).getAngle(p3.sub(p2)))/2
|
||||
tx = obj.Thickness.Value*math.tan(a)
|
||||
d1 = Vector(tx,0,-obj.Thickness.Value)
|
||||
d2 = Vector(-tx,0,-obj.Thickness.Value)
|
||||
p6 = p1.add(d1)
|
||||
if tx >= p3.sub(p2).Length/2:
|
||||
d3 = p2.sub(p1)
|
||||
d3.normalize()
|
||||
d3.multiply((0.625*obj.WaveLength.Value)/d3.x)
|
||||
d4 = Vector(d3.x,0,-d3.z)
|
||||
p7 = p6.add(d3)
|
||||
p8 = p7.add(d4)
|
||||
p9 = p5.add(d1)
|
||||
downsegment = Part.makePolygon([p6,p7,p8,p9])
|
||||
elif tx <= 0.625*obj.WaveLength.Value:
|
||||
p7 = p2.add(d1)
|
||||
p8 = p3.add(d2)
|
||||
p9 = p4.add(d2)
|
||||
p10 = p5.add(d1)
|
||||
downsegment = Part.makePolygon([p6,p7,p8,p9,p10])
|
||||
else:
|
||||
downsegment = obj.Thickness.Value
|
||||
|
||||
else: # spike
|
||||
p2 = Vector(obj.WaveHeight.Value,0,obj.WaveHeight.Value)
|
||||
p3 = Vector(obj.WaveHeight.Value*2,0,0)
|
||||
upsegment = Part.makePolygon([p1,p2,p3,p5])
|
||||
if not downsegment:
|
||||
downsegment = obj.Thickness.Value
|
||||
|
||||
upsegment.translate(Vector(bb.getPoint(0).x,bb.getPoint(0).y,bb.Center.z))
|
||||
if isinstance(downsegment,Part.Shape):
|
||||
downsegment.translate(Vector(bb.getPoint(0).x,bb.getPoint(0).y,bb.Center.z))
|
||||
if hasattr(obj,"WaveOffset"):
|
||||
if obj.WaveOffset.Value:
|
||||
upsegment.translate(Vector(obj.WaveOffset.Value,0,0))
|
||||
if isinstance(downsegment,Part.Shape):
|
||||
downsegment.translate(Vector(obj.WaveOffset.Value,0,0))
|
||||
|
||||
upedges = []
|
||||
downedges = []
|
||||
for i in range(int(bb.XLength/(obj.WaveLength.Value*2))):
|
||||
e1 = e1.copy()
|
||||
e1.translate(Vector(obj.WaveLength.Value*2,0,0))
|
||||
e2 = e2.copy()
|
||||
e2.translate(Vector(obj.WaveLength.Value*2,0,0))
|
||||
edges.extend([e1,e2])
|
||||
basewire = Part.Wire(edges)
|
||||
baseface = basewire.extrude(Vector(0,bb.YLength,0))
|
||||
base = baseface.extrude(Vector(0,0,thickness))
|
||||
w1 = upsegment.copy()
|
||||
w1.translate(Vector(obj.WaveLength.Value*2*i,0,0))
|
||||
upedges.extend(w1.Edges)
|
||||
if isinstance(downsegment,Part.Shape):
|
||||
w2 = downsegment.copy()
|
||||
w2.translate(Vector(obj.WaveLength.Value*2*i,0,0))
|
||||
downedges.extend(w2.Edges)
|
||||
upwire = Part.Wire(upedges)
|
||||
FreeCAD.upwire = upwire # REMOVE
|
||||
if isinstance(downsegment,Part.Shape):
|
||||
downwire = Part.Wire(downedges)
|
||||
FreeCAD.downwire = downwire # REMOVE
|
||||
e1 = Part.LineSegment(upwire.Vertexes[0].Point,downwire.Vertexes[0].Point).toShape()
|
||||
e2 = Part.LineSegment(upwire.Vertexes[-1].Point,downwire.Vertexes[-1].Point).toShape()
|
||||
basewire = Part.Wire(upwire.Edges+[e1,e2]+downwire.Edges)
|
||||
else:
|
||||
z = obj.Thickness.Value
|
||||
if obj.WaveType == "Curved":
|
||||
z += obj.WaveHeight.Value
|
||||
p1 = upwire.Vertexes[0].Point
|
||||
p2 = p1.add(Vector(0,0,-z))
|
||||
p3 = Vector(upwire.Vertexes[-1].Point.x,upwire.Vertexes[-1].Point.y,p2.z)
|
||||
p4 = upwire.Vertexes[-1].Point
|
||||
w = Part.makePolygon([p1,p2,p3,p4])
|
||||
basewire = Part.Wire(upwire.Edges+w.Edges)
|
||||
|
||||
#
|
||||
FreeCAD.basewire = basewire
|
||||
if not basewire.isClosed():
|
||||
print("Error closing base wire - check FreeCAD.basewire")
|
||||
return
|
||||
#
|
||||
|
||||
baseface = Part.Face(basewire)
|
||||
base = baseface.extrude(Vector(0,bb.YLength,0))
|
||||
rot = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),normal)
|
||||
base.rotate(bb.Center,rot.Axis,math.degrees(rot.Angle))
|
||||
if obj.WaveDirection.Value:
|
||||
|
||||
Reference in New Issue
Block a user