Macro Half turn stairs: Difference between revisions
(Created page with "{{Macro|Icon=Macro_Half_turn_stairs|Description=This macro creates a Stair with left or right turn in the defined high. The design of the stairs are defined in stairs.dat file...") |
No edit summary |
||
Line 1: | Line 1: | ||
<translate> |
|||
{{Macro|Icon=Macro_Half_turn_stairs|Description=This macro creates a Stair with left or right turn in the defined high. The design of the stairs are defined in stairs.dat file. The step-high of the stair is calculated from the high of the stair.|Author=Berner|Version=1.0}} |
|||
<!--T:1--> |
|||
{{Macro|Icon=Text-x-python|Name=Half_turn_stairs|Description=This macro creates a Stair with left or right turn in the defined high. The design of the stairs are defined in stairs.dat file. The step-high of the stair is calculated from the high of the stair.|Author=Berner|Version=1.0}} |
|||
<!--T:8--> |
|||
[[File:Half_turn_stairs.png|480px|cabinetside]] |
|||
{{clear}} |
|||
===Description=== <!--T:2--> |
|||
<!--T:3--> |
|||
This Macro creates a half turning Stair with the design of stairs.dat file left or right turning. |
|||
===Use=== <!--T:4--> |
|||
<!--T:5--> |
|||
*Launch the macro and change the height of Stair to the hight of your floor. The turning can be left or right. |
|||
===Script=== <!--T:6--> |
|||
</translate> |
|||
Half_turn_stairs.FCMacro |
|||
<pre> |
|||
# -*- coding: utf-8 -*- |
|||
# |
|||
# Half_turn_stairs Macro runs with Freecad 0.17 |
|||
# |
|||
# Author: Berner and Forum |
|||
# |
|||
# This macro creates a half turn stair from tupels of x,y,z |
|||
# the tupels used to create a dwire for every stair. |
|||
# The dwire is extruded, so it give with 18 stairs the total rise |
|||
# |
|||
# A sample file with parameters is in stairs.dat |
|||
# |
|||
# created a wire with coordinate x y z separated (in the file) |
|||
#Sample: (delete # on lines without comments) |
|||
# Stair 0 |
|||
#0.0 -240.0 0.0 0.0 0.0 0.0 1000.0 0.0 0.0 1000.0 -240.0 0.0 |
|||
# Stair 1 |
|||
#0.0 0.0 0.0 0.0 240.0 0.0 1000.0 240.0 0.0 1000.0 0.0 0.0 |
|||
#. . . . |
|||
from __future__ import unicode_literals |
|||
from FreeCAD import Base |
|||
import Draft, Part |
|||
App.Console.PrintMessage("Half_turn_stairs-Macro\n") |
|||
# Get location of user macros |
|||
p=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro") |
|||
path = p.GetString("MacroPath") |
|||
dataset = path + "/stairs.dat" # path and name of file.txt |
|||
docname = App.ActiveDocument.Name # Name of active document |
|||
debug='n' # Debug Values on Console |
|||
rise = 3100.0 # Geschosshoehe Total Rise |
|||
left_right="l" # turn stairs left or left_right |
|||
# GUI |
|||
from PySide import QtGui |
|||
(rise, ok) = QtGui.QInputDialog.getDouble( |
|||
QtGui.QWidget(), 'Total Rise / Geschosshoehe', 'Total Rise / Geschosshoehe', 2000, 0, 3100, 4) |
|||
if ok: |
|||
left_right = QtGui.QInputDialog.getText(None, "left_right", "Turn Left or Right l/r")[0] |
|||
if debug == 'y': FreeCAD.Console.PrintMessage("rise="+str(rise) + " " + str(ok) + "\n" ) |
|||
if debug == 'y': FreeCAD.Console.PrintMessage("left_right="+str(left_right) + " " + str(ok) + "\n" ) |
|||
# End Gui |
|||
step=float(rise/18) # Treppensteigung / Step_high |
|||
# functions |
|||
def objnames(): # List object names |
|||
doc = FreeCAD.ActiveDocument |
|||
objs = FreeCAD.ActiveDocument.Objects |
|||
names='' #list of objectnames |
|||
labels='' # list of objectlabels |
|||
for obj in objs: |
|||
a = obj.Name # list the Name of the object (not modifiable) |
|||
b = obj.Label # list the Label of the object (modifiable) |
|||
try: |
|||
c = obj.LabelText # list the LabeText of the text (modifiable) |
|||
names=names+str(a)+" " |
|||
labels=labels+str(b)+" " |
|||
except: |
|||
names=names+str(a)+" " |
|||
labels=labels+str(b)+" " |
|||
return names |
|||
if debug == 'y': App.Console.PrintMessage("Names="+str(names) +"\n"+"Labels="+ str(labels) + "\n") |
|||
# end functions |
|||
file = open(dataset, "r") # open the file read |
|||
i = 0 #line counter |
|||
line = file.readline() |
|||
while(line != ''): # read number of lines |
|||
if line[0:1] != "#" and len(line) >0: |
|||
i = i + 1 |
|||
if debug == "y": App.Console.PrintMessage("Parameter-Line" + str(i) + " " + line + "\n") |
|||
line = file.readline() |
|||
file.close() |
|||
numlines=i # number of parameter-lines |
|||
if debug == "y": App.Console.PrintMessage("Number of Parameter-Lines =" + str(numlines) + "\n") |
|||
file = open(dataset, "r") # open the file read |
|||
wire = [] |
|||
X=Y=Z = 0.0 |
|||
if left_right == "r": |
|||
i = 0 #line counter |
|||
else: |
|||
i = numlines |
|||
line = file.readline() |
|||
while(line != ''): |
|||
num_words = len(line.split()) |
|||
num_tupel = num_words / 3 |
|||
if debug == "y": App.Console.PrintMessage(str(num_words) + "\n") |
|||
if debug == "y": App.Console.PrintMessage(str(num_tupel) + "\n") |
|||
if line[0:1] == "#" or num_words != (num_tupel * 3): |
|||
if num_words != (num_tupel * 3): |
|||
App.Console.PrintMessage("Error on Inputfile line " + str(i) + "\n") |
|||
App.Console.PrintMessage("Only " + str(num_words) + " of multiple of 3 Words\n") |
|||
else: |
|||
if line[0:1] == "#": |
|||
num_words = 0 # ignore comment |
|||
if debug == "y": App.Console.PrintMessage(line + "\n") |
|||
coordinates = line.split() |
|||
if debug == "y": App.Console.PrintMessage(str(coordinates) + " " + str(num_words) + " " + str(num_tupel)+ str(type(num_words)) + "\n") |
|||
if num_words > 0: |
|||
data="" # generate statement |
|||
printline="App.Console.PrintMessage(" # generate variable for PrintMessage (debug) |
|||
for x in range(1, num_tupel + 1): |
|||
data=data + "X" + str(x) + ",Y" + str(x) + ",Z" + str(x) |
|||
printline=printline + "str(X" + str(x) + ") + ' ' + " + "str(Y" + str(x) + ") + ' ' + " + "str(Z" + str(x) + ") + ' '" |
|||
if x < num_tupel: |
|||
data=data + "," |
|||
printline=printline + " + " |
|||
data=data + " = coordinates" |
|||
printline=printline + ")\n" |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
if debug == "y": App.Console.PrintMessage(printline + "\n") |
|||
# X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,X4,Y4,Z4 = coordinates |
|||
exec(data) # coordinates to variables |
|||
if debug == "y": exec(printline) # output input file |
|||
#App.Console.PrintMessage(str(X1) + " " + str(Y1) + " " +str(Z1) + "\n") |
|||
px="" |
|||
pn="" # names of generated variables |
|||
for x in range(1, num_tupel +1): |
|||
if x < num_tupel: |
|||
pn=pn + "p" + str(x) + "," |
|||
else: |
|||
pn=pn + "p" + str(x) |
|||
data = "Z" + str(x) + " = " + str(i * step) # Korrektur z= 0.0 auf aktuelle step |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
px="p" + str(x) + "= FreeCAD.Vector(float(X" + str(x) + "),float(Y" + str(x) + "),float(Z" + str(x) + "))" |
|||
if debug == "y": App.Console.PrintMessage(px + "\n") |
|||
exec(px) |
|||
if debug == "y": App.Console.PrintMessage(pn + "\n") |
|||
#p1 = FreeCAD.Vector(float(X1),float(Y1),float(Z1)) |
|||
#p2 = FreeCAD.Vector(float(X2),float(Y2),float(Z2)) |
|||
#p3 = FreeCAD.Vector(float(X3),float(Y3),float(Z3)) |
|||
#p4 = FreeCAD.Vector(float(X4),float(Y4),float(Z4)) |
|||
data="Draft.makeWire([" + pn + "],closed=True)" |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
#Draft.makeWire([p1,p2,p3,p4,p5],closed=True) |
|||
if left_right == "r": |
|||
i = i + 1 |
|||
else: |
|||
i = i -1 |
|||
line = file.readline() |
|||
file.close() |
|||
# |
|||
# List all objects of the document |
|||
names = objnames() # list objectnames |
|||
App.Console.PrintMessage("names="+str(names) +"\n") |
|||
#extrude |
|||
extr="" # suffix for continues Extrude in commands |
|||
extrnames="Box Cut" #names of source object, because not consitend nameings in freecad |
|||
j=len(names.split()) |
|||
n=0 #counter |
|||
if left_right == "r": |
|||
l1 = 0 |
|||
l2 = j |
|||
step = 1 |
|||
else: |
|||
l1 = j |
|||
l2 = -1 |
|||
step = -1 |
|||
for x in range(l1, l2, step): |
|||
w=str(names.split(" ")[x]) |
|||
if w[0:5] == "DWire": |
|||
if debug == 'y': App.Console.PrintMessage("w="+str(w) +"\n") |
|||
data = 'f = FreeCAD.getDocument(docname).addObject("Part::Extrusion","Extrude' + str(extr)+ '")' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f = App.getDocument(docname).getObject("Extrude' + str(extr) + '")' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.Base = App.getDocument(docname).getObject("' + str(w) + '")' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.DirMode = str("Custom")' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.Dir = App.Vector(0.000000000000000, 0.000000000000000, 1.000000000000000)' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.DirLink = None' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.LengthFwd = 180.000000000000000' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.LengthRev = 0.000000000000000' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.Solid = True' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.Reversed = False' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.Symmetric = False' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.TaperAngle = 0.000000000000000' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
data = 'f.TaperAngleRev = 0.000000000000000' |
|||
if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
exec(data) |
|||
# data = 'App.getDocument(docname).Extrude' + str(extr) + '.Placement=App.Placement(App.Vector(0,0,360), #App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))' |
|||
#if debug == "y": App.Console.PrintMessage(data + "\n") |
|||
#exec(data) |
|||
n = n + 1 |
|||
extr = str("%03d" % n) # count extrude suffix |
|||
extrnames=extrnames + " Extrude" + str("%03d" % x) |
|||
# |
|||
FreeCAD.ActiveDocument.recompute() |
|||
</pre> |
|||
<translate> |
|||
===Links=== <!--T:7--> |
|||
*[[Macro_PartsLibrary|Macro_PartsLibrary]] FreeCAD Library |
|||
</translate> |
|||
{{clear}} |
|||
<languages/> |
Revision as of 16:20, 17 October 2016
File:Text-x-python Half_turn_stairs |
Description |
---|
This macro creates a Stair with left or right turn in the defined high. The design of the stairs are defined in stairs.dat file. The step-high of the stair is calculated from the high of the stair. Macro version: 1.0 Author: Berner |
Author |
Berner |
Download |
None |
Links |
Macros recipes How to install macros How to customize toolbars |
Macro Version |
1.0 |
Date last modified |
None |
FreeCAD Version(s) |
None |
Default shortcut |
None |
See also |
None |
Description
This Macro creates a half turning Stair with the design of stairs.dat file left or right turning.
Use
- Launch the macro and change the height of Stair to the hight of your floor. The turning can be left or right.
Script
Half_turn_stairs.FCMacro
# -*- coding: utf-8 -*- # # Half_turn_stairs Macro runs with Freecad 0.17 # # Author: Berner and Forum # # This macro creates a half turn stair from tupels of x,y,z # the tupels used to create a dwire for every stair. # The dwire is extruded, so it give with 18 stairs the total rise # # A sample file with parameters is in stairs.dat # # created a wire with coordinate x y z separated (in the file) #Sample: (delete # on lines without comments) # Stair 0 #0.0 -240.0 0.0 0.0 0.0 0.0 1000.0 0.0 0.0 1000.0 -240.0 0.0 # Stair 1 #0.0 0.0 0.0 0.0 240.0 0.0 1000.0 240.0 0.0 1000.0 0.0 0.0 #. . . . from __future__ import unicode_literals from FreeCAD import Base import Draft, Part App.Console.PrintMessage("Half_turn_stairs-Macro\n") # Get location of user macros p=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro") path = p.GetString("MacroPath") dataset = path + "/stairs.dat" # path and name of file.txt docname = App.ActiveDocument.Name # Name of active document debug='n' # Debug Values on Console rise = 3100.0 # Geschosshoehe Total Rise left_right="l" # turn stairs left or left_right # GUI from PySide import QtGui (rise, ok) = QtGui.QInputDialog.getDouble( QtGui.QWidget(), 'Total Rise / Geschosshoehe', 'Total Rise / Geschosshoehe', 2000, 0, 3100, 4) if ok: left_right = QtGui.QInputDialog.getText(None, "left_right", "Turn Left or Right l/r")[0] if debug == 'y': FreeCAD.Console.PrintMessage("rise="+str(rise) + " " + str(ok) + "\n" ) if debug == 'y': FreeCAD.Console.PrintMessage("left_right="+str(left_right) + " " + str(ok) + "\n" ) # End Gui step=float(rise/18) # Treppensteigung / Step_high # functions def objnames(): # List object names doc = FreeCAD.ActiveDocument objs = FreeCAD.ActiveDocument.Objects names='' #list of objectnames labels='' # list of objectlabels for obj in objs: a = obj.Name # list the Name of the object (not modifiable) b = obj.Label # list the Label of the object (modifiable) try: c = obj.LabelText # list the LabeText of the text (modifiable) names=names+str(a)+" " labels=labels+str(b)+" " except: names=names+str(a)+" " labels=labels+str(b)+" " return names if debug == 'y': App.Console.PrintMessage("Names="+str(names) +"\n"+"Labels="+ str(labels) + "\n") # end functions file = open(dataset, "r") # open the file read i = 0 #line counter line = file.readline() while(line != ''): # read number of lines if line[0:1] != "#" and len(line) >0: i = i + 1 if debug == "y": App.Console.PrintMessage("Parameter-Line" + str(i) + " " + line + "\n") line = file.readline() file.close() numlines=i # number of parameter-lines if debug == "y": App.Console.PrintMessage("Number of Parameter-Lines =" + str(numlines) + "\n") file = open(dataset, "r") # open the file read wire = [] X=Y=Z = 0.0 if left_right == "r": i = 0 #line counter else: i = numlines line = file.readline() while(line != ''): num_words = len(line.split()) num_tupel = num_words / 3 if debug == "y": App.Console.PrintMessage(str(num_words) + "\n") if debug == "y": App.Console.PrintMessage(str(num_tupel) + "\n") if line[0:1] == "#" or num_words != (num_tupel * 3): if num_words != (num_tupel * 3): App.Console.PrintMessage("Error on Inputfile line " + str(i) + "\n") App.Console.PrintMessage("Only " + str(num_words) + " of multiple of 3 Words\n") else: if line[0:1] == "#": num_words = 0 # ignore comment if debug == "y": App.Console.PrintMessage(line + "\n") coordinates = line.split() if debug == "y": App.Console.PrintMessage(str(coordinates) + " " + str(num_words) + " " + str(num_tupel)+ str(type(num_words)) + "\n") if num_words > 0: data="" # generate statement printline="App.Console.PrintMessage(" # generate variable for PrintMessage (debug) for x in range(1, num_tupel + 1): data=data + "X" + str(x) + ",Y" + str(x) + ",Z" + str(x) printline=printline + "str(X" + str(x) + ") + ' ' + " + "str(Y" + str(x) + ") + ' ' + " + "str(Z" + str(x) + ") + ' '" if x < num_tupel: data=data + "," printline=printline + " + " data=data + " = coordinates" printline=printline + ")\n" if debug == "y": App.Console.PrintMessage(data + "\n") if debug == "y": App.Console.PrintMessage(printline + "\n") # X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,X4,Y4,Z4 = coordinates exec(data) # coordinates to variables if debug == "y": exec(printline) # output input file #App.Console.PrintMessage(str(X1) + " " + str(Y1) + " " +str(Z1) + "\n") px="" pn="" # names of generated variables for x in range(1, num_tupel +1): if x < num_tupel: pn=pn + "p" + str(x) + "," else: pn=pn + "p" + str(x) data = "Z" + str(x) + " = " + str(i * step) # Korrektur z= 0.0 auf aktuelle step if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) px="p" + str(x) + "= FreeCAD.Vector(float(X" + str(x) + "),float(Y" + str(x) + "),float(Z" + str(x) + "))" if debug == "y": App.Console.PrintMessage(px + "\n") exec(px) if debug == "y": App.Console.PrintMessage(pn + "\n") #p1 = FreeCAD.Vector(float(X1),float(Y1),float(Z1)) #p2 = FreeCAD.Vector(float(X2),float(Y2),float(Z2)) #p3 = FreeCAD.Vector(float(X3),float(Y3),float(Z3)) #p4 = FreeCAD.Vector(float(X4),float(Y4),float(Z4)) data="Draft.makeWire([" + pn + "],closed=True)" if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) #Draft.makeWire([p1,p2,p3,p4,p5],closed=True) if left_right == "r": i = i + 1 else: i = i -1 line = file.readline() file.close() # # List all objects of the document names = objnames() # list objectnames App.Console.PrintMessage("names="+str(names) +"\n") #extrude extr="" # suffix for continues Extrude in commands extrnames="Box Cut" #names of source object, because not consitend nameings in freecad j=len(names.split()) n=0 #counter if left_right == "r": l1 = 0 l2 = j step = 1 else: l1 = j l2 = -1 step = -1 for x in range(l1, l2, step): w=str(names.split(" ")[x]) if w[0:5] == "DWire": if debug == 'y': App.Console.PrintMessage("w="+str(w) +"\n") data = 'f = FreeCAD.getDocument(docname).addObject("Part::Extrusion","Extrude' + str(extr)+ '")' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f = App.getDocument(docname).getObject("Extrude' + str(extr) + '")' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.Base = App.getDocument(docname).getObject("' + str(w) + '")' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.DirMode = str("Custom")' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.Dir = App.Vector(0.000000000000000, 0.000000000000000, 1.000000000000000)' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.DirLink = None' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.LengthFwd = 180.000000000000000' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.LengthRev = 0.000000000000000' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.Solid = True' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.Reversed = False' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.Symmetric = False' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.TaperAngle = 0.000000000000000' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) data = 'f.TaperAngleRev = 0.000000000000000' if debug == "y": App.Console.PrintMessage(data + "\n") exec(data) # data = 'App.getDocument(docname).Extrude' + str(extr) + '.Placement=App.Placement(App.Vector(0,0,360), #App.Rotation(App.Vector(0,0,1),0), App.Vector(0,0,0))' #if debug == "y": App.Console.PrintMessage(data + "\n") #exec(data) n = n + 1 extr = str("%03d" % n) # count extrude suffix extrnames=extrnames + " Extrude" + str("%03d" % x) # FreeCAD.ActiveDocument.recompute()
Links
- Macro_PartsLibrary FreeCAD Library