Hallo Werner,
da ich mich mit Programmierung und Python nicht auskenne frage ich lieber nochmal.
In folgendem Ordner habe ich eine Sicherung der Datei sheetmetal.py mit anderem Namen angelegt und die von Dir hochgeladene Datei in den Ordner kopiert:
.FreeCAD/Mod/sheetmetal/InitGui.py
Aus der ODT habe ich folgende Zeilen heraus kopiert in einen Editor:
Code: Select all
from __future__ import division # allows floating point division from integers
import FreeCAD, FreeCADGui
from FreeCAD import Base
import Part
import math
def getPointOnCylinder(ax, ay, Radius):
angle = math.pi/2 - (ay/Radius)
result = (ax, math.cos(angle)*Radius, Radius-math.sin(angle)*Radius)
return result
def WrapBSpline(bspline, Radius, XScale):
poles = bspline.getPoles()
#print poles
newpoles=[]
for pp in poles:
newpoles.append(getPointOnCylinder(pp[0]*XScale, pp[1], Radius))
#print newpoles
newbspline = bspline
newbspline.buildFromPolesMultsKnots(newpoles, bspline.getMultiplicities(), bspline.getKnots(), bspline.isPeriodic(), bspline.Degree, bspline.getWeights())
return newbspline.toShape()
def WrapSketch(Sketch, Radius, XScale):
print Radius
Edges = []
for edge in Sketch.Edges:
print str(type(edge.Curve))
if str(type(edge.Curve)) == "<type 'Part.Circle'>":
sp = edge.valueAt(edge.FirstParameter)
ep = edge.valueAt(edge.LastParameter)
mp = edge.valueAt((edge.FirstParameter + edge.LastParameter)/2)
arc = Part.Arc(sp,mp,ep)
bspline = arc.toNurbs()
Edges.append(WrapBSpline(bspline, Radius, XScale, edge.FirstParameter, edge.LastParameter))
elif str(type(edge.Curve)) == "<type 'Part.Line'>":
sp = edge.valueAt(edge.FirstParameter)
ep = edge.valueAt(edge.LastParameter)
print sp, ep
if (sp.y > ep.y):
tt = sp
sp = ep
ep = tt
sp.y = sp.y*XScale
ep.y = ep.y*XScale
if (abs(sp.y - ep.y) < 0.001):
p1 = getPointOnCylinder(sp.x, sp.y, Radius)
p2 = getPointOnCylinder(ep.x, ep.y, Radius)
Edges.append(Part.makeLine(p1, p2))
elif (abs(sp.x - ep.x) < 0.001):
sp = edge.valueAt(edge.FirstParameter)
ep = edge.valueAt(edge.LastParameter)
mp = edge.valueAt((edge.FirstParameter + edge.LastParameter)/2)
p1 = getPointOnCylinder(sp.x, sp.y, Radius)
p2 = getPointOnCylinder(ep.x, ep.y, Radius)
p3 = getPointOnCylinder(mp.x, mp.y, Radius)
arc = Part.Arc(Base.Vector(p1), Base.Vector(p3), Base.Vector(p2)).toShape()
Edges.append(arc)
else:
Pitch = 2 * math.pi * Radius * abs(ep.x - sp.x)/abs(ep.y - sp.y)
Height = abs(ep.x - sp.x)
hh = Part.makeHelix(Pitch, Height, Radius, 0, (sp.x > ep.x))
angle = 90 - sp.y/Radius * 180/math.pi
if (sp.x > ep.x):
hh.Placement = FreeCAD.Placement(Base.Vector(sp.x, 0, Radius), FreeCAD.Rotation(90,angle,-90))
else:
hh.Placement = FreeCAD.Placement(Base.Vector(sp.x, 0, Radius), FreeCAD.Rotation(90,angle,90))
print Pitch, ",",Height, ",", sp.x, ",",ep.x,",", sp.y, ",",ep.y, ",",angle
Edges.append(hh)
return Edges
def makeWrappedSketch():
selections = FreeCAD.Gui.Selection.getSelectionEx()
Face = selections[0].Object.Shape.getElement(selections[0].SubElementNames[0])
sketch = Face.copy()
# pl = sketch.Placement.Base
# sketch.Placement.Base = Base.Vector(0, 0, 0)
BendAngle = 90
Radius = ( 40.0 * 180 )/ ( math.pi * BendAngle )
Edges = WrapSketch(sketch, Radius, 1.0)
Shape = Part.makeCompound(Edges)
Face1 = Part.makeFilledFace(Part.__sortEdges__(Shape.Edges))
# Face1.Placement.Base = pl
# Face1.translate(Base.Vector(0,-Radius,0))
# Face1.rotate(Base.Vector(0,0,0), Base.Vector(1,0,0), -90)
Bend = Face1.makeOffsetShape(2.0,0.001,fill=True)
Shape = Bend.removeSplitter()
Part.show(Shape)
FreeCAD.Console.PrintMessage("makeWrappedSketch Start"+"\n")
makeWrappedSketch()
FreeCAD.Console.PrintMessage("makeWrappedSketch End"+"\n")
Was soll ich damit machen? Speichern?
Wo hin und mit welchem Namen und welcher Dateiendung?
In der ODT steht weiter unten, dass man folgende Zeile in die InitGUI.py anfügen soll:
Code: Select all
self.list = ["SMMakeWall", "SMExtrudeFace", "SMUnfold", "SMFoldWall"]
Was fehlt sonst noch?
Steht die Funktion ab dann zur Verfügung und braucht nur noch ein Icon?
Bitte helfe mir.
Viele Grüße
Wilfried