From 7928188617b6e824b8ab896bbbd5f1c819947e72 Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 3 May 2020 17:22:54 -0500 Subject: [PATCH 001/135] Added translation support Added Pyside2 support translate dodo external workbench from FreeCAD. Added Spanish translation. Added TS and QM spanish translation files Added headers and more translation functions Added QT_TRANSLATE_NOOP definition Added addproperty translation Minor addproperty translations Minor addproperty translations Adde more translated lines Addobject name translated Release last revision es-ES QM file Fixed typo on addproperty Wrong typo syntax Added locale update function Added locale update function Fixed addObject translation / Erased context in ts file -Fixed addObject translation. -Erased not used context formats in TS file. Translate Drop down headers Translate drop down headers Minor accent correction --- .gitignore | 2 + CFrame.py | 110 +++-- CPipe.py | 162 ++++-- CUtils.py | 68 ++- InitGui.py | 34 +- fFeatures.py | 182 +++---- pCmd.py | 96 ++-- pFeatures.py | 183 +++---- pForms.py | 72 +-- translations/Update code.txt | 1 + translations/dodo_es-ES.qm | Bin 0 -> 17735 bytes translations/dodo_es-ES.ts | 923 +++++++++++++++++++++++++++++++++++ translations/main.pro | 3 + 13 files changed, 1461 insertions(+), 375 deletions(-) create mode 100644 .gitignore create mode 100644 translations/Update code.txt create mode 100644 translations/dodo_es-ES.qm create mode 100644 translations/dodo_es-ES.ts create mode 100644 translations/main.pro diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bd38df5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +__pycache__/ diff --git a/CFrame.py b/CFrame.py index 825889c..2fcb172 100644 --- a/CFrame.py +++ b/CFrame.py @@ -7,9 +7,11 @@ # import FreeCAD modules import FreeCAD, FreeCADGui, inspect, os +from PySide.QtCore import QT_TRANSLATE_NOOP +from DraftGui import translate # helper ------------------------------------------------------------------- -# FreeCAD TemplatePyMod module +# FreeCAD TemplatePyMod module # (c) 2007 Juergen Riegel LGPL def addCommand(name,cmdObject): @@ -37,13 +39,15 @@ def Activated(self): import FreeCAD, FreeCADGui, fObservers, fCmd s=fObservers.frameItObserver() FreeCADGui.Selection.addObserver(s) - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamFit.svg"),'MenuText':'Place one-beam over one-edge','ToolTip':'Place one beam after the other over the edges'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamFit.svg"), + 'MenuText':QT_TRANSLATE_NOOP("frameIt",'Place one-beam over one-edge'), + 'ToolTip':QT_TRANSLATE_NOOP("frameIt",'Place one beam after the other over the edges')} class spinSect: ''' - Tool to spin one object around the "Z" axis of its shape + Tool to spin one object around the "Z" axis of its shape by 45 degrees. ''' def Activated(self): @@ -54,13 +58,15 @@ def Activated(self): pCmd.rotateTheTubeAx(beam) FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamRot.svg"),'MenuText':'Spin beams by 45 deg.','ToolTip':'Rotates the section of the beam by 45 degrees'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamRot.svg"), + 'MenuText':QT_TRANSLATE_NOOP("spinSect",'Spin beams by 45 deg.'), + 'ToolTip':QT_TRANSLATE_NOOP("spinSect",'Rotates the section of the beam by 45 degrees')} class reverseBeam: ''' - Tool to spin one object around the "X" axis of its shape + Tool to spin one object around the "X" axis of its shape by 180 degrees. Note: - if one edge of the object is selected, that is used as the pivot of rotation. @@ -72,9 +78,11 @@ def Activated(self): pCmd.reverseTheTube(objEx) FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","reverse.svg"),'MenuText':'Reverse orientation','ToolTip':'Reverse the orientation of selected objects'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","reverse.svg"), + 'MenuText':QT_TRANSLATE_NOOP("reverseBeam",'Reverse orientation'), + 'ToolTip':QT_TRANSLATE_NOOP("reverseBeam",'Reverse the orientation of selected objects')} # class fillFrame: # ''' @@ -86,13 +94,13 @@ def GetResources(self): # import fForms # #frameFormObj=fForms.fillForm() # FreeCADGui.Control.showDialog(fForms.fillForm()) - + # def GetResources(self): # return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","fillFrame.svg"),'MenuText':'Fill the frame','ToolTip':'Fill the sketch of the frame with the selected beam'} class alignFlange: ''' - Tool to rotate beams (or other objects) so that their surfaces are + Tool to rotate beams (or other objects) so that their surfaces are parallel to one reference plane. If multiple faces are preselected, objects will be rotated according the first face in the selections set. Otherwise the program prompts @@ -104,18 +112,20 @@ def Activated(self): FreeCADGui.Control.showDialog(fForms.alignForm()) def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","flangeAlign.svg"),'MenuText':'alignFlange','ToolTip':'Rotates the section of the beam to make the faces parallel to another face'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","flangeAlign.svg"), + 'MenuText':QT_TRANSLATE_NOOP("alignFlange",'alignFlange'), + 'ToolTip':QT_TRANSLATE_NOOP("alignFlange",'Rotates the section of the beam to make the faces parallel to another face')} class shiftBeam: ''' Dialog to translate and copy objects. - * "x/y/z" textboxes: direct input of amount of translation in each + * "x/y/z" textboxes: direct input of amount of translation in each direction. * "Multiple" textbox: the multiple coefficient of the translation amount. * "Steps" textbox: the denominator of the translation amount. It's used when the amount of translation is to be covered in some steps. - * "move/copy" radiobuttons: to select if the selected objects shall + * "move/copy" radiobuttons: to select if the selected objects shall be copied or only translated. * [Displacement] button: takes the amount and direction of translation from the distance of selected entities (points, edges, faces). @@ -130,12 +140,14 @@ def Activated(self): FreeCADGui.Control.showDialog(fForms.translateForm()) def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamShift.svg"),'MenuText':'shiftTheBeam','ToolTip':'Translate objects by vectors defined on existing geometry'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamShift.svg"), + 'MenuText':QT_TRANSLATE_NOOP("shiftBeam",'shiftTheBeam'), + 'ToolTip':QT_TRANSLATE_NOOP("shiftBeam",'Translate objects by vectors defined on existing geometry')} class levelBeam: ''' Tool to flush the parallel faces of two objects. - + Note: - actually the command takes to the same level, respect the position and orientation of the first face selected, the center-of-mass of all faces selected. Thus it translates the objects even if the @@ -161,12 +173,14 @@ def Activated(self): FreeCADGui.Selection.addObserver(s) def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamLevel.svg"),'MenuText':'Flush the surfaces','ToolTip':'Shift the beams to line-up the faces to the first selection (faces must be //)'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamLevel.svg"), + 'MenuText':QT_TRANSLATE_NOOP("levelBeam",'Flush the surfaces'), + 'ToolTip':QT_TRANSLATE_NOOP("levelBeam",'Shift the beams to line-up the faces to the first selection (faces must be //)')} class alignEdge: ''' Tool to mate two parallel edges. - + Notes: - actually the command moves the objects along the minimum distance of their selected edge to the first one. Thus it translates the object even if edges are not parallel. @@ -190,9 +204,11 @@ def Activated(self): FreeCADGui.Selection.clearSelection() s=fObservers.alignEdgeObserver() FreeCADGui.Selection.addObserver(s) - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","edgeAlign.svg"),'MenuText':'Mate the edges','ToolTip':'Join two edges: select two or pre-select several'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","edgeAlign.svg"), + 'MenuText':QT_TRANSLATE_NOOP("alignEdge",'Mate the edges'), + 'ToolTip':QT_TRANSLATE_NOOP("alignEdge",'Join two edges: select two or pre-select several')} class pivotBeam: ''' @@ -205,10 +221,12 @@ class pivotBeam: def Activated(self): import fForms #frameFormObj=fForms.pivotForm() - FreeCADGui.Control.showDialog(fForms.rotateAroundForm()) - + FreeCADGui.Control.showDialog(fForms.rotateAroundForm()) + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","around.svg"),'MenuText':'pivotTheBeam','ToolTip':'Rotates the beam around an axis (edge or center-of-curvature)'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","around.svg"), + 'MenuText':QT_TRANSLATE_NOOP("pivotBeam",'pivotTheBeam'), + 'ToolTip':QT_TRANSLATE_NOOP("pivotBeam",'Rotates the beam around an axis (edge or center-of-curvature)')} class stretchBeam: ''' @@ -220,15 +238,17 @@ class stretchBeam: entities (point, edges, faces). * [Cancel]: exits * slider: extends the reference length from -100% to +100%. - + ''' def Activated(self): import fForms #frameFormObj=fForms.stretchForm() FreeCADGui.Control.showDialog(fForms.stretchForm()) - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamStretch.svg"),'MenuText':'stretchTheBeam','ToolTip':'Changes the length of the beam, either according a preselected edge or a direct input'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamStretch.svg"), + 'MenuText':QT_TRANSLATE_NOOP("stretchBeam",'stretchTheBeam'), + 'ToolTip':QT_TRANSLATE_NOOP("stretchBeam",'Changes the length of the beam, either according a preselected edge or a direct input')} class extend: ''' @@ -241,9 +261,11 @@ def Activated(self): import fForms #frameFormObj=fForms.extendForm() FreeCADGui.Control.showDialog(fForms.extendForm()) - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","extend.svg"),'MenuText':'extendTheBeam','ToolTip':'Extend the beam either to a face, a vertex or the c.o.m. of the selected object'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","extend.svg"), + 'MenuText':QT_TRANSLATE_NOOP("extend",'extendTheBeam'), + 'ToolTip':QT_TRANSLATE_NOOP("extend",'Extend the beam either to a face, a vertex or the c.o.m. of the selected object')} class adjustFrameAngle: ''' @@ -254,9 +276,11 @@ def Activated(self): FreeCADGui.Selection.clearSelection() s=fObservers.adjustAngleObserver() FreeCADGui.Selection.addObserver(s) - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","adjustAngle.svg"),'MenuText':'adjustFrameAngle','ToolTip':'Adjust the angle of frame by two edges'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","adjustAngle.svg"), + 'MenuText':QT_TRANSLATE_NOOP("adjustFrameAngle",'adjustFrameAngle'), + 'ToolTip':QT_TRANSLATE_NOOP("adjustFrameAngle",'Adjust the angle of frame by two edges')} class rotJoin: ''' @@ -273,7 +297,9 @@ def Activated(self): FreeCAD.Console.PrintError('Please select two edges of beams before\n') def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","rotjoin.svg"),'MenuText':'rotJoinEdge','ToolTip':'Rotates and align the beam according another edge'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","rotjoin.svg"), + 'MenuText':QT_TRANSLATE_NOOP("rotJoin",'rotJoinEdge'), + 'ToolTip':QT_TRANSLATE_NOOP("rotJoin",'Rotates and align the beam according another edge')} class insertPath: ''' @@ -289,13 +315,15 @@ def Activated(self): FreeCAD.activeDocument().commitTransaction() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","path.svg"),'MenuText':'insert Path','ToolTip':'Creates one path along selected edges'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","path.svg"), + 'MenuText':QT_TRANSLATE_NOOP("insertPath",'insert Path'), + 'ToolTip':QT_TRANSLATE_NOOP("insertPath",'Creates one path along selected edges')} # class FrameLineManager: # ''' # Dialog to create and change properties of objects FrameLine # providing the following features: - # * a list of beams' profiles previously included in the model + # * a list of beams' profiles previously included in the model # by "insertSection" dialog; # * a combo-box to select the active FrameLine among those already # created or to create a new one; @@ -314,16 +342,16 @@ def GetResources(self): # * [Get Path] button: assigns the Dwire selected to the attribute Path # of the FrameLine object. # * [Get Profile] button: changes the Profile attribute of the FrameLine - # object to the one of the beam selected in the viewport or the one + # object to the one of the beam selected in the viewport or the one # selected in the list. # * "Copy profile" checkbox: if checked generates a new profile object # for each beam in order to avoid multiple references in the model. # * "Move to origin" checkbox: if checked, moves the center-of-mass # of the profile to the origin of coordinates system: that makes the # centerline of the beam coincide with the c.o.m. of the profile. - + # Notes: - if the name of a FrameLine object is modified, also the name - # of the relevant group will change automatically but not viceversa. + # of the relevant group will change automatically but not viceversa. # ''' # def Activated(self): # if FreeCAD.ActiveDocument: @@ -343,7 +371,9 @@ def Activated(self): FreeCADGui.Control.showDialog(fFeatures.frameBranchForm()) def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","framebranch.svg"),'MenuText':'FrameBranch Manager','ToolTip':'Open FrameBranch Manager'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","framebranch.svg"), + 'MenuText':QT_TRANSLATE_NOOP("FrameBranchManager",'FrameBranch Manager'), + 'ToolTip':QT_TRANSLATE_NOOP("FrameBranchManager",'Open FrameBranch Manager')} class insertSection: ''' @@ -355,12 +385,14 @@ def Activated(self): FreeCADGui.Control.showDialog(fForms.profEdit()) def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","sect.svg"),'MenuText':'Insert sections','ToolTip':'Creates customized beam profiles 2D'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","sect.svg"), + 'MenuText':QT_TRANSLATE_NOOP("insertSection",'Insert sections'), + 'ToolTip':QT_TRANSLATE_NOOP("insertSection",'Creates customized beam profiles 2D')} #--------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager #--------------------------------------------------------------------------- -addCommand('frameIt',frameIt()) +addCommand('frameIt',frameIt()) addCommand('spinSect',spinSect()) addCommand('reverseBeam',reverseBeam()) #addCommand('fillFrame',fillFrame()) diff --git a/CPipe.py b/CPipe.py index 8248d3e..7584c51 100644 --- a/CPipe.py +++ b/CPipe.py @@ -7,9 +7,10 @@ # import FreeCAD modules import FreeCAD, FreeCADGui,inspect, os - +from PySide.QtCore import QT_TRANSLATE_NOOP +from DraftGui import translate # helper ------------------------------------------------------------------- -# FreeCAD TemplatePyMod module +# FreeCAD TemplatePyMod module # (c) 2007 Juergen Riegel LGPL def addCommand(name,cmdObject): @@ -32,7 +33,7 @@ def updatesPL(dialogqm): if pypelines: # updates pypelines in combo dialogqm.QM.comboPL.clear() dialogqm.QM.comboPL.addItems(pypelines) - + #--------------------------------------------------------------------------- # The command classes #--------------------------------------------------------------------------- @@ -42,49 +43,70 @@ def Activated (self): import pForms pipForm=pForms.insertPipeForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","pipe.svg"),'MenuText':'Insert a tube','ToolTip':'Insert a tube'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","pipe.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertPipe','Insert a tube'), + 'ToolTip':QT_TRANSLATE_NOOP('insertPipe','Insert a tube')} -class insertElbow: +class insertElbow: def Activated (self): import pForms,FreeCAD elbForm=pForms.insertElbowForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","elbow.svg"),'MenuText':'Insert a curve','ToolTip':'Insert a curve'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","elbow.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertElbow','Insert a curve'), + 'ToolTip':QT_TRANSLATE_NOOP('insertElbow','Insert a curve')} -class insertReduct: +class insertReduct: def Activated (self): import pForms pipeFormObj=pForms.insertReductForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","reduct.svg"),'MenuText':'Insert a reduction','ToolTip':'Insert a reduction'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","reduct.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertReduct','Insert a reduction'), + 'ToolTip':QT_TRANSLATE_NOOP('insertReduct','Insert a reduction')} -class insertCap: +class insertCap: def Activated (self): import pForms pipeFormObj=pForms.insertCapForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","cap.svg"),'MenuText':'Insert a cap','ToolTip':'Insert a cap'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","cap.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertCap','Insert a cap'), + 'ToolTip':QT_TRANSLATE_NOOP('insertCap','Insert a cap')} class insertFlange: def Activated (self): import pForms pipeFormObj=pForms.insertFlangeForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","flange.svg"),'MenuText':'Insert a flange','ToolTip':'Insert a flange'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","flange.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertFlange','Insert a flange'), + 'ToolTip':QT_TRANSLATE_NOOP('insertFlange','Insert a flange')} class insertUbolt: def Activated (self): import pForms pipeFormObj=pForms.insertUboltForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","clamp.svg"),'MenuText':'Insert a U-bolt','ToolTip':'Insert a U-bolt'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","clamp.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertUbolt','Insert a U-bolt'), + 'ToolTip':QT_TRANSLATE_NOOP('insertUbolt','Insert a U-bolt')} class insertPypeLine: def Activated (self): import pForms pipeFormObj=pForms.insertPypeLineForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","pypeline.svg"),'MenuText':'PypeLine Manager','ToolTip':'Open PypeLine Manager'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","pypeline.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertPypeLine','PypeLine Manager'), + 'ToolTip':QT_TRANSLATE_NOOP('insertPypeLine','Open PypeLine Manager')} class insertBranch: def Activated (self): @@ -92,14 +114,20 @@ def Activated (self): #pCmd.makeBranch() pipeFormObj=pForms.insertBranchForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","branch.svg"),'MenuText':'Insert a branch','ToolTip':'Insert a PypeBranch'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","branch.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertBranch','Insert a branch'), + 'ToolTip':QT_TRANSLATE_NOOP('insertBranch','Insert a PypeBranch')} class breakPipe: def Activated (self): import pForms pipeFormObj=pForms.breakForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","break.svg"),'MenuText':'Break the pipe','ToolTip':'Break one pipe at point and insert gap'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","break.svg"), + 'MenuText':QT_TRANSLATE_NOOP('breakPipe','Break the pipe'), + 'ToolTip':QT_TRANSLATE_NOOP('breakPipe','Break one pipe at point and insert gap')} class mateEdges: def Activated (self): @@ -109,14 +137,21 @@ def Activated (self): FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","mate.svg"),'Accel':"M,E",'MenuText':'Mate pipes edges','ToolTip':'Mate two terminations through their edges'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","mate.svg"), + 'Accel':"M,E", + 'MenuText':QT_TRANSLATE_NOOP('mateEdges','Mate pipes edges'), + 'ToolTip':QT_TRANSLATE_NOOP('mateEdges','Mate two terminations through their edges')} -class flat: +class flat: def Activated (self): import pCmd pCmd.flatten() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","flat.svg"),'MenuText':'Fit one elbow','ToolTip':'Place the elbow between two pipes or beams'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","flat.svg"), + 'MenuText':QT_TRANSLATE_NOOP('flat','Fit one elbow'), + 'ToolTip':QT_TRANSLATE_NOOP('flat','Place the elbow between two pipes or beams')} class extend2intersection: def Activated (self): @@ -126,7 +161,10 @@ def Activated (self): FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","intersect.svg"),'MenuText':'Extends pipes to intersection','ToolTip':'Extends pipes to intersection'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","intersect.svg"), + 'MenuText':QT_TRANSLATE_NOOP('extend2intersection','Extends pipes to intersection'), + 'ToolTip':QT_TRANSLATE_NOOP('extend2intersection','Extends pipes to intersection')} class extend1intersection: def Activated (self): @@ -136,7 +174,10 @@ def Activated (self): FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","intersect1.svg"),'MenuText':'Extends pipe to intersection','ToolTip':'Extends pipe to intersection'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","intersect1.svg"), + 'MenuText':QT_TRANSLATE_NOOP('extend1intersection','Extends pipe to intersection'), + 'ToolTip':QT_TRANSLATE_NOOP('extend1intersection','Extends pipe to intersection')} class laydown: def Activated (self): @@ -150,7 +191,10 @@ def Activated (self): FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","laydown.svg"),'MenuText':'Lay-down the pipe','ToolTip':'Lay-down the pipe on the support plane'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","laydown.svg"), + 'MenuText':QT_TRANSLATE_NOOP('laydown','Lay-down the pipe'), + 'ToolTip':QT_TRANSLATE_NOOP('laydown','Lay-down the pipe on the support plane')} class raiseup: def Activated (self): @@ -170,28 +214,37 @@ def Activated (self): FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","raiseup.svg"),'MenuText':'Raise-up the support','ToolTip':'Raise the support to the pipe'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","raiseup.svg"), + 'MenuText':QT_TRANSLATE_NOOP('raiseup','Raise-up the support'), + 'ToolTip':QT_TRANSLATE_NOOP('raiseup','Raise the support to the pipe')} class joinPype: ''' - + ''' def Activated(self): import FreeCAD, FreeCADGui, pForms #pObservers # s=pObservers.joinObserver() FreeCADGui.Control.showDialog(pForms.joinForm()) #.Selection.addObserver(s) - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","join.svg"),'MenuText':'Join pypes','ToolTip':'Select the part-pype and the port'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","join.svg"), + 'MenuText':QT_TRANSLATE_NOOP('joinPype','Join pypes'), + 'ToolTip':QT_TRANSLATE_NOOP('joinPype','Select the part-pype and the port')} class insertValve: def Activated (self): import pForms #pipeFormObj=pForms.insertValveForm() - #FreeCADGui.Control.showDialog(pForms.insertValveForm()) + #FreeCADGui.Control.showDialog(pForms.insertValveForm()) pipeFormObj=pForms.insertValveForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","valve.svg"),'MenuText':'Insert a valve','ToolTip':'Insert a valve'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","valve.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertValve','Insert a valve'), + 'ToolTip':QT_TRANSLATE_NOOP('insertValve','Insert a valve')} class attach2tube: def Activated (self): @@ -201,7 +254,10 @@ def Activated (self): FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","attach.svg"),'MenuText':'Attach to tube','ToolTip':'Attach one pype to the nearest port of selected pipe'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","attach.svg"), + 'MenuText':QT_TRANSLATE_NOOP('attach2tube','Attach to tube'), + 'ToolTip':QT_TRANSLATE_NOOP('attach2tube','Attach one pype to the nearest port of selected pipe')} class point2point: @@ -210,34 +266,44 @@ def Activated(self): form = pForms.point2pointPipe() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","point2point.svg"),'MenuText':'draw a tube point-to-point','ToolTip':'Click on subsequent points.'} - + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","point2point.svg"), + 'MenuText':QT_TRANSLATE_NOOP('point2point','draw a tube point-to-point'), + 'ToolTip':QT_TRANSLATE_NOOP('point2point','Click on subsequent points.')} + class insertAnyz: ''' Dialog to insert any object saved as .STEP, .IGES or .BREP in folder ../Mod/dodo/shapez or subfolders. ''' def Activated(self): import anyShapez - FreeCADGui.Control.showDialog(anyShapez.shapezDialog()) - + FreeCADGui.Control.showDialog(anyShapez.shapezDialog()) + def GetResources(self): - return{'MenuText':'Insert any shape','ToolTip':'Insert a STEP, IGES or BREP'} + return{'MenuText':QT_TRANSLATE_NOOP('insertAnyz','Insert any shape'), + 'ToolTip':QT_TRANSLATE_NOOP('insertAnyz','Insert a STEP, IGES or BREP')} class insertTank: def Activated(self): import FreeCADGui, pForms FreeCADGui.Control.showDialog(pForms.insertTankForm()) - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","tank.svg"),'MenuText':'Insert a tank','ToolTip':'Create tank and nozzles'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","tank.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertTank','Insert a tank'), + 'ToolTip':QT_TRANSLATE_NOOP('insertTank','Create tank and nozzles')} class insertRoute: def Activated(self): import FreeCADGui, pForms FreeCADGui.Control.showDialog(pForms.insertRouteForm()) - + def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","route.svg"),'MenuText':'Insert a pipe route','ToolTip':'Create a sketch attached to a circular edge'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","route.svg"), + 'MenuText':QT_TRANSLATE_NOOP('insertRoute','Insert a pipe route'), + 'ToolTip':QT_TRANSLATE_NOOP('insertRoute','Create a sketch attached to a circular edge')} class makeHeader: def Activated (self): @@ -252,7 +318,7 @@ def GetResources(self): #--------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager #--------------------------------------------------------------------------- -addCommand('insertPipe',insertPipe()) +addCommand('insertPipe',insertPipe()) addCommand('insertElbow',insertElbow()) addCommand('insertReduct',insertReduct()) addCommand('insertCap',insertCap()) @@ -283,7 +349,9 @@ def Activated(self): #dodoPM.pqm.updatePL() dodoPM.pqm.show() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","pipe.svg"),'MenuText':'QM for pipes'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","pipe.svg"), + 'MenuText':QT_TRANSLATE_NOOP('pipeQM','QM for pipes')} addCommand('pipeQM',pipeQM()) class elbowQM(): @@ -291,7 +359,9 @@ def Activated (self): import dodoPM dodoPM.eqm.show() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","elbow.svg"),'MenuText':'QM for elbows'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","elbow.svg"), + 'MenuText':QT_TRANSLATE_NOOP('elbowQM','QM for elbows')} addCommand('elbowQM',elbowQM()) class flangeQM(): @@ -299,7 +369,9 @@ def Activated (self): import dodoPM dodoPM.fqm.show() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","flange.svg"),'MenuText':'QM for flanges'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","flange.svg"), + 'MenuText':QT_TRANSLATE_NOOP('flangeQM','QM for flanges')} addCommand('flangeQM',flangeQM()) class valveQM(): @@ -307,7 +379,9 @@ def Activated (self): import dodoPM dodoPM.vqm.show() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","valve.svg"),'MenuText':'QM for valves'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","valve.svg"), + 'MenuText':QT_TRANSLATE_NOOP('valveQM','QM for valves')} addCommand('valveQM',valveQM()) class capQM(): @@ -315,5 +389,7 @@ def Activated (self): import dodoPM dodoPM.cqm.show() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","cap.svg"),'MenuText':'QM for caps'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","cap.svg"), + 'MenuText':QT_TRANSLATE_NOOP('capQM','QM for caps')} addCommand('capQM',capQM()) diff --git a/CUtils.py b/CUtils.py index ca098af..7cd458b 100644 --- a/CUtils.py +++ b/CUtils.py @@ -4,9 +4,11 @@ # import FreeCAD modules import FreeCAD, FreeCADGui,inspect , os +from PySide.QtCore import QT_TRANSLATE_NOOP +from DraftGui import translate # helper ------------------------------------------------------------------- -# FreeCAD TemplatePyMod module +# FreeCAD TemplatePyMod module # (c) 2007 Juergen Riegel LGPL def addCommand(name,cmdObject): @@ -31,11 +33,15 @@ def Activated(self): form = uForms.QueryForm(FreeCADGui.Selection) def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","query.svg"),'Accel':"Q,M",'MenuText':'query the model','ToolTip':'Click objects to print infos'} - + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","query.svg"), + 'Accel':"Q,M", + 'MenuText':QT_TRANSLATE_NOOP('queryModel','query the model'), + 'ToolTip':QT_TRANSLATE_NOOP('queryModel','Click objects to print infos')} + class moveWorkPlane: ''' - Tool to set the DraftWorkingPlane according existing geometry of + Tool to set the DraftWorkingPlane according existing geometry of the model. The normal of plane is set: * 1st according the selected face, @@ -51,8 +57,12 @@ def Activated(self): uCmd.setWP() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","grid.svg"),'Accel':"A,W",'MenuText':'align Workplane','ToolTip':'Moves and rotates the drafting workplane with points, edges and faces'} - + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","grid.svg"), + 'Accel':"A,W", + 'MenuText':QT_TRANSLATE_NOOP('moveWorkPlane','align Workplane'), + 'ToolTip':QT_TRANSLATE_NOOP('moveWorkPlane','Moves and rotates the drafting workplane with points, edges and faces')} + class rotateWorkPlane: def Activated(self): @@ -60,8 +70,12 @@ def Activated(self): form = uForms.rotWPForm() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","rotWP.svg"),'Accel':"R,W",'MenuText':'rotate Workplane','ToolTip':'Spin the Draft working plane about one of its axes'} - + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","rotWP.svg"), + 'Accel':"R,W", + 'MenuText':QT_TRANSLATE_NOOP('rotateWorkPlane','rotate Workplane'), + 'ToolTip':QT_TRANSLATE_NOOP('rotateWorkPlane','Spin the Draft working plane about one of its axes')} + class offsetWorkPlane: def Activated(self): @@ -77,8 +91,12 @@ def Activated(self): #FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(arrow.node) arrow.closeArrow() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","offsetWP.svg"),'Accel':"O,W",'MenuText':'offset Workplane','ToolTip':'Shifts the WP alongg its normal.'} - + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","offsetWP.svg"), + 'Accel':"O,W", + 'MenuText':QT_TRANSLATE_NOOP('offsetWorkPlane','offset Workplane'), + 'ToolTip':QT_TRANSLATE_NOOP('offsetWorkPlane','Shifts the WP alongg its normal.')} + class hackedL: def Activated(self): @@ -86,8 +104,12 @@ def Activated(self): form = uCmd.hackedLine() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","hackedL.svg"),'Accel':"H,L",'MenuText':'draw a DWire','ToolTip':'WP is re-positioned at each point. Possible to spin and offset it.'} - + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","hackedL.svg"), + 'Accel':"H,L", + 'MenuText':QT_TRANSLATE_NOOP('hackedL','draw a DWire'), + 'ToolTip':QT_TRANSLATE_NOOP('hackedL','WP is re-positioned at each point. Possible to spin and offset it.')} + class moveHandle: def Activated(self): @@ -96,8 +118,12 @@ def Activated(self): #form = uCmd.handleDialog() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","moveHandle.svg"),'Accel':"M,H",'MenuText':'Move objects','ToolTip':'Move quickly objects inside viewport'} - + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","moveHandle.svg"), + 'Accel':"M,H", + 'MenuText':QT_TRANSLATE_NOOP('moveHandle','Move objects'), + 'ToolTip':QT_TRANSLATE_NOOP('moveHandle','Move quickly objects inside viewport')} + class dpCalc: def Activated(self): @@ -105,7 +131,10 @@ def Activated(self): FreeCADGui.Control.showDialog(uForms.dpCalcDialog()) def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","delta.svg"),'MenuText':'Pressure loss calculator','ToolTip':'Calculate pressure loss in "pypes" using ChEDL libraries.\n See __doc__ of the module for futher information.'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","delta.svg"), + 'MenuText':QT_TRANSLATE_NOOP('dpCalc','Pressure loss calculator'), + 'ToolTip':QT_TRANSLATE_NOOP('dpCalc','Calculate pressure loss in "pypes" using ChEDL libraries.\n See __doc__ of the module for futher information.')} class selectSolids: @@ -116,13 +145,16 @@ def Activated(self): getSolids(allDoc) def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","solids.svg"),'MenuText':'Select solids','ToolTip':'Grab all solids or those partially selected\n to export in .step format'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","solids.svg"), + 'MenuText':QT_TRANSLATE_NOOP('selectSolids','Select solids'), + 'ToolTip':QT_TRANSLATE_NOOP('selectSolids','Grab all solids or those partially selected\n to export in .step format')} #--------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager #--------------------------------------------------------------------------- -addCommand('queryModel',queryModel()) -addCommand('moveWorkPlane',moveWorkPlane()) +addCommand('queryModel',queryModel()) +addCommand('moveWorkPlane',moveWorkPlane()) addCommand('rotateWorkPlane',rotateWorkPlane()) addCommand('offsetWorkPlane',offsetWorkPlane()) addCommand('hackedL',hackedL()) diff --git a/InitGui.py b/InitGui.py index 338c7d5..f0b147e 100644 --- a/InitGui.py +++ b/InitGui.py @@ -143,24 +143,34 @@ class dodo ( Workbench ): MenuText = "Dodo WB" ToolTip = "Dodo workbench \n(substitute of flamingo for Py3/Qt5)" def Initialize(self): + import pForms import CUtils - self.utilsList=["selectSolids","queryModel","moveWorkPlane","offsetWorkPlane","rotateWorkPlane","hackedL","moveHandle","dpCalc"] - self.appendToolbar("Utils",self.utilsList) - Log ('Loading Utils: done\n') import CFrame - self.frameList=["frameIt","FrameBranchManager","insertSection","spinSect","reverseBeam","shiftBeam","pivotBeam","levelBeam","alignEdge","rotJoin","alignFlange","stretchBeam","extend","adjustFrameAngle","insertPath"] - self.appendToolbar("frameTools",self.frameList) - Log ('Loading Frame tools: done\n') import CPipe self.pypeList=["insertPipe","insertElbow","insertReduct","insertCap","insertValve","insertFlange","insertUbolt","insertPypeLine","insertBranch","insertTank","insertRoute","breakPipe","mateEdges","flat","extend2intersection","extend1intersection","makeHeader","laydown","raiseup","attach2tube","point2point","insertAnyz"]#,"joinPype"] + from PySide.QtCore import QT_TRANSLATE_NOOP + from DraftGui import translate from dodoPM import toolList + FreeCADGui.addLanguagePath(pForms.getLanguagePath()) + FreeCADGui.updateLocale() + + self.utilsList=["selectSolids","queryModel","moveWorkPlane","offsetWorkPlane","rotateWorkPlane","hackedL","moveHandle","dpCalc"] + self.appendToolbar(translate("dodo","Utils"),self.utilsList) + Log ('Loading Utils: done\n') + + self.frameList=["frameIt","FrameBranchManager","insertSection","spinSect","reverseBeam","shiftBeam","pivotBeam","levelBeam","alignEdge","rotJoin","alignFlange","stretchBeam","extend","adjustFrameAngle","insertPath"] + self.appendToolbar(translate("dodo","frametools"),self.frameList) + Log ('Loading Frame tools: done\n') + + self.pypeList=["insertPipe","insertElbow","insertReduct","insertCap","insertValve","insertFlange","insertUbolt","insertPypeLine","insertBranch","insertTank","insertRoute","breakPipe","mateEdges","flat","extend2intersection","extend1intersection","laydown","raiseup","attach2tube","point2point","insertAnyz"]#,"joinPype"] + self.qm=toolList # ["pipeQM","elbowQM","reductQM"] - self.appendToolbar("pipeTools",self.pypeList) + self.appendToolbar(translate("dodo","pypetools"),self.pypeList) Log ('Loading Pipe tools: done\n') - self.appendMenu(["Frame tools"],self.frameList) - self.appendMenu(["Pype tools"],self.pypeList) - self.appendMenu(["Utils"],self.utilsList) - self.appendMenu(["QkMenus"], self.qm) + self.appendMenu(translate("dodo","Frame tools"),self.frameList) + self.appendMenu(translate("dodo","Pype tools"),self.pypeList) + self.appendMenu(translate("dodo","Utils"),self.utilsList) + self.appendMenu(translate("dodo","QkMenus"),self.qm) def ContextMenu(self, recipient): self.appendContextMenu('Frames', self.frameList) @@ -195,5 +205,5 @@ def Deactivated(self): # del FreeCAD.__dodoPMact__ # Msg("__dodoPMact__ variable deleted\n") # Msg("dodo deactivated()\n") - + Gui.addWorkbench(dodo) diff --git a/fFeatures.py b/fFeatures.py index 53682dd..b8ce93f 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -14,6 +14,8 @@ from os.path import join, dirname, abspath from math import degrees from uCmd import label3D +from PySide.QtCore import QT_TRANSLATE_NOOP +from DraftGui import translate ################ FUNCTIONS ########################### @@ -26,7 +28,7 @@ def newProfile(prop): else: profile=ArchProfile.makeProfile([0,'SECTION',prop['SSize']+'-000',prop['stype'],float(prop['W']),float(prop['H']),float(prop['ta']),float(prop['tf'])]) return profile - + def indexEdge(edge,listedges): ''' Auxiliary function to find the index of an edge @@ -47,7 +49,7 @@ def findFB(beamName=None, baseName=None): if baseName==FreeCAD.ActiveDocument.getObject(name).Base.Name: #if beam.Name in activeFB.Beams: return FreeCAD.ActiveDocument.getObject(name) return None - + def refresh(): for b in [o for o in FreeCAD.ActiveDocument.Objects if hasattr(o,'FType') and o.FType=='FrameBranch']: b.touch() @@ -66,7 +68,7 @@ class frameLineForm(QDialog): - redraw it, - clear it. To select profiles, the 2D objects msut be included insied the "Profiles_set" - group, either created manually or automatically by "Insert Std. Section" + group, either created manually or automatically by "Insert Std. Section" ''' def __init__(self,winTitle='FrameLine Manager', icon='frameline.svg'): super(frameLineForm,self).__init__() @@ -77,7 +79,7 @@ def __init__(self,winTitle='FrameLine Manager', icon='frameline.svg'): Icon=QIcon() iconPath=join(dirname(abspath(__file__)),"iconz",icon) Icon.addFile(iconPath) - self.setWindowIcon(Icon) + self.setWindowIcon(Icon) self.mainHL=QHBoxLayout() self.setLayout(self.mainHL) self.firstCol=QWidget() @@ -101,7 +103,7 @@ def __init__(self,winTitle='FrameLine Manager', icon='frameline.svg'): self.mainHL.addWidget(self.firstCol) self.secondCol=QWidget() self.secondCol.setLayout(QVBoxLayout()) - self.current=None + self.current=None self.combo=QComboBox() self.combo.addItem('') #self.combo.activated[str].connect(self.setCurrent) @@ -254,7 +256,7 @@ def __init__(self,winTitle='Insert section', icon='dodo.svg'): from PySide.QtGui import QIcon Icon=QIcon() Icon.addFile(iconPath) - self.setWindowIcon(Icon) + self.setWindowIcon(Icon) self.mainHL=QHBoxLayout() self.setLayout(self.mainHL) self.firstCol=QWidget() @@ -417,7 +419,7 @@ def selectAction(self): def mouseActionB1(self, CtrlAltShift): v = FreeCADGui.ActiveDocument.ActiveView i = v.getObjectInfo(v.getCursorPos()) - if i: + if i: labText=i['Object'] obj=FreeCAD.ActiveDocument.getObject(i['Object']) if hasattr(obj,'tailOffset') and hasattr(obj,'headOffset') and hasattr(obj,'spin'): @@ -425,7 +427,7 @@ def mouseActionB1(self, CtrlAltShift): self.form.editHead.setText(str(obj.headOffset)) self.form.editAngle.setText(str(obj.spin)) fb=findFB(i['Object']) - if fb: + if fb: labText+=': part of '+fb.Label if self.labTail: self.labTail.removeLabel() @@ -476,9 +478,9 @@ def addBeams(self): for edge in fCmd.edges(): i=indexEdge(edge,FB.Base.Shape.Edges) beam=makeStructure(FB.Profile) - beam.addProperty("App::PropertyFloat","tailOffset","FrameBranch","The extension of the tail") - beam.addProperty("App::PropertyFloat","headOffset","FrameBranch","The extension of the head") - beam.addProperty("App::PropertyFloat","spin","FrameBranch","The rotation of the section") + beam.addProperty("App::PropertyFloat","tailOffset","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The extension of the tail")) + beam.addProperty("App::PropertyFloat","headOffset","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The extension of the head")) + beam.addProperty("App::PropertyFloat","spin","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The rotation of the section")) if int(FreeCAD.Version()[1])>19: #20220704 beam.addExtension("Part::AttachExtensionPython") else: @@ -521,7 +523,7 @@ def changeProfile(self): FreeCAD.Console.PrintError('No frameBranch or profile selected\n') def changeHeadOffset(self): for beam in fCmd.beams(): - if hasattr(beam,'headOffset'): + if hasattr(beam,'headOffset'): beam.headOffset=float(self.form.editHead.text()) FB=findFB(beam.Name) FB.touch() @@ -529,7 +531,7 @@ def changeHeadOffset(self): FreeCAD.ActiveDocument.recompute() def changeTailOffset(self): for beam in fCmd.beams(): - if hasattr(beam,'tailOffset'): + if hasattr(beam,'tailOffset'): beam.tailOffset=float(self.form.editTail.text()) FB=findFB(beam.Name) FB.touch() @@ -537,7 +539,7 @@ def changeTailOffset(self): FreeCAD.ActiveDocument.recompute() def changeAngle(self): for beam in fCmd.beams(): - if hasattr(beam,'spin'): + if hasattr(beam,'spin'): FB=findFB(beam.Name) beam.spin=float(self.form.editAngle.text()) FB.touch() @@ -575,7 +577,7 @@ def trim(self): P=fCmd.intersectionPlane(tail,ax,target) elif hasattr(target,"CenterOfMass"): P=target.CenterOfMass - else: + else: P=None if P: deltaTail=(P-tail).dot(ax) @@ -592,12 +594,12 @@ def refresh(self): if obj: obj.Proxy.redraw(obj) FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute() - + ################ CLASSES ########################### class FrameLine(object): '''Class for object FrameLine - Has attributes Base (the path) and Profile to define the frame shape and + Has attributes Base (the path) and Profile to define the frame shape and the type section's profile. Creates a group to collect the Structure objects. Provides methods update() and purge() to redraw the Structure objects @@ -605,16 +607,16 @@ class FrameLine(object): ''' def __init__(self, obj, section="IPE200", lab=None): obj.Proxy = self - obj.addProperty("App::PropertyString","FType","FrameLine","Type of frameFeature").FType='FrameLine' - obj.addProperty("App::PropertyString","FSize","FrameLine","Size of frame").FSize=section + obj.addProperty("App::PropertyString","FType","FrameLine",QT_TRANSLATE_NOOP("App::PropertyString","Type of frameFeature")).FType='FrameLine' + obj.addProperty("App::PropertyString","FSize","FrameLine",QT_TRANSLATE_NOOP("App::PropertyString","Size of frame")).FSize=section if lab: obj.Label=lab - obj.addProperty("App::PropertyString","Group","FrameLine","The group.").Group=obj.Label+"_pieces" + obj.addProperty("App::PropertyString","Group","FrameLine",QT_TRANSLATE_NOOP("App::PropertyString","The group.")).Group=obj.Label+"_pieces" group=FreeCAD.activeDocument().addObject("App::DocumentObjectGroup",obj.Group) group.addObject(obj) FreeCAD.Console.PrintWarning("Created group "+obj.Group+"\n") - obj.addProperty("App::PropertyLink","Base","FrameLine","the edges") - obj.addProperty("App::PropertyLink","Profile","FrameLine","the profile") + obj.addProperty("App::PropertyLink","Base","FrameLine",QT_TRANSLATE_NOOP("App::PropertyLink","the edges")) + obj.addProperty("App::PropertyLink","Profile","FrameLine",QT_TRANSLATE_NOOP("App::PropertyLink","the profile")) def onChanged(self, fp, prop): if prop=='Label' and len(fp.InList): fp.InList[0].Label=fp.Label+"_pieces" @@ -661,10 +663,10 @@ def __init__(self,obj, base=None, profile=None): # PROXY CLASS PROPERTIES self.objName=obj.Name # FEATUREPYTHON OBJECT PROPERTIES - obj.addProperty("App::PropertyString","FType","FrameBranch","Type of frameFeature").FType='FrameBranch' - obj.addProperty("App::PropertyStringList","Beams","FrameBranch","The beams names") - obj.addProperty("App::PropertyLink","Base","FrameBranch","The path.").Base=base - obj.addProperty("App::PropertyLink","Profile","FrameBranch","The profile").Profile=profile + obj.addProperty("App::PropertyString","FType","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyString","Type of frameFeature")).FType='FrameBranch' + obj.addProperty("App::PropertyStringList","Beams","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyStringList","The beams names")) + obj.addProperty("App::PropertyLink","Base","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyLink","The path.")).Base=base + obj.addProperty("App::PropertyLink","Profile","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyLink","The profile")).Profile=profile self.redraw(obj) def execute(self,obj): X=FreeCAD.Vector(1,0,0) @@ -690,9 +692,9 @@ def redraw(self, obj): for e in obj.Base.Shape.Edges: if e.curvatureAt(0)==0: beam=makeStructure(obj.Profile) - beam.addProperty("App::PropertyFloat","tailOffset","FrameBranch","The extension of the tail") - beam.addProperty("App::PropertyFloat","headOffset","FrameBranch","The extension of the head") - beam.addProperty("App::PropertyFloat","spin","FrameBranch","The rotation of the section") + beam.addProperty("App::PropertyFloat","tailOffset","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The extension of the tail")) + beam.addProperty("App::PropertyFloat","headOffset","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The extension of the head")) + beam.addProperty("App::PropertyFloat","spin","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The rotation of the section")) if int(FreeCAD.Version()[1])>19: #20220704 beam.addExtension("Part::AttachExtensionPython") else: @@ -732,7 +734,7 @@ def loads(self,state): return None def claimChildren(self): children=[FreeCAD.ActiveDocument.getObject(name) for name in self.Object.Beams] - return children + return children def onDelete(self, feature, subelements): # subelements is a tuple of strings return True @@ -788,7 +790,7 @@ def doProfile(typeS="RH", label="Square", dims=[50,100,5]): # rearrange args in def drawAndCenter (points): p = Part.makePolygon(points) s = Part.Face(p) - v=s.CenterOfMass + v=s.CenterOfMass points2 = [point.add(v.negative()) for point in points] p2 = Part.makePolygon(points2) return Part.Face(p2) @@ -798,7 +800,7 @@ def drawAndCenter (points): def pointsH(H, W, D, t1, t2, t3): p1 = Vector(0,0,0) p2 = Vector(W,0,0) - p3 = Vector(W,t2,0) + p3 = Vector(W,t2,0) p4 = Vector(W/2+t1/2,t2,0) p5 = Vector(W/2+t1/2,H-t3,0) p6 = Vector(W/2+D/2,H-t3,0) @@ -816,13 +818,13 @@ def pointsL(H,W,t1,t2): p3 = Vector(W/2,H/2,0) p4 = Vector(W/2-t1,H/2,0) p5 = Vector(W/2-t1,t2-H/2,0) - p6 = Vector(-W/2,t2-H/2,0) + p6 = Vector(-W/2,t2-H/2,0) return [p1,p2,p3,p4,p5,p6,p1] def pointsOmega(H, W, D, t1, t2, t3): p1 = Vector(0,0,0) p2 = Vector(W,0,0) - p3 = Vector(W,H-t3,0) + p3 = Vector(W,H-t3,0) p4 = Vector(W+D-t1,H-t3,0) p5 = Vector(W+D-t1,H,0) p6 = Vector(W-t1,H,0) @@ -848,7 +850,7 @@ def pointsT(H, W, t1, t2): def pointsU(H, W, D, t1, t2, t3): p1 = Vector(0,0,0) p2 = Vector(W,0,0) - p3 = Vector(W,H,0) + p3 = Vector(W,H,0) p4 = Vector(W-D,H,0) p5 = Vector(W-D,H-t3,0) p6 = Vector(W-t1,H-t3,0) @@ -880,11 +882,11 @@ def pointsZ(H,W,t1,t2): class _ProfileRH(_Profile): '''A parametric Rectangular hollow beam profile. Profile data: [width, height, thickness]''' def __init__(self,obj, profile): - obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::Property","Type of section")).FType = 'RH' - obj.addProperty("App::PropertyLength","W","Draft",QT_TRANSLATE_NOOP("App::Property","Width of the beam")).W = profile[4] - obj.addProperty("App::PropertyLength","H","Draft",QT_TRANSLATE_NOOP("App::Property","Height of the beam")).H = profile[5] - obj.addProperty("App::PropertyLength","t1","Draft",QT_TRANSLATE_NOOP("App::Property","Thickness of the vertical sides")).t1 = profile[6] - obj.addProperty("App::PropertyLength","t2","Draft",QT_TRANSLATE_NOOP("App::Property","Thickness of the horizontal sides")).t2 = profile[7] + obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::PropertyString","Type of section")).FType = 'RH' + obj.addProperty("App::PropertyLength","W","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Width of the beam")).W = profile[4] + obj.addProperty("App::PropertyLength","H","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Height of the beam")).H = profile[5] + obj.addProperty("App::PropertyLength","t1","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Thickness of the vertical sides")).t1 = profile[6] + obj.addProperty("App::PropertyLength","t2","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Thickness of the horizontal sides")).t2 = profile[7] _Profile.__init__(self,obj,profile) def execute(self,obj): W, H, t1, t2= obj.W.Value, obj.H.Value, obj.t1.Value, obj.t2.Value @@ -899,13 +901,13 @@ def execute(self,obj): p = Part.makePolygon([p1,p2,p3,p4,p1]) q = Part.makePolygon([q1,q2,q3,q4,q1]) obj.Shape = Part.Face(p).cut(Part.Face(q)) - + class _ProfileR(_Profile): '''A parametric Rectangular solid beam profile. Profile data: [width, height]''' def __init__(self,obj, profile): - obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::Property","Type of section")).FType = 'R' - obj.addProperty("App::PropertyLength","W","Draft",QT_TRANSLATE_NOOP("App::Property","Width of the beam")).W = profile[4] - obj.addProperty("App::PropertyLength","H","Draft",QT_TRANSLATE_NOOP("App::Property","Height of the beam")).H = profile[5] + obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::PropertyString","Type of section")).FType = 'R' + obj.addProperty("App::PropertyLength","W","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Width of the beam")).W = profile[4] + obj.addProperty("App::PropertyLength","H","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Height of the beam")).H = profile[5] _Profile.__init__(self,obj,profile) def execute(self,obj): W, H= obj.W.Value, obj.H.Value @@ -917,14 +919,14 @@ def execute(self,obj): obj.Shape = Part.Face(p) class _ProfileCircle(_Profile): - '''A parametric circular beam profile. - Profile data: + '''A parametric circular beam profile. + Profile data: D: diameter t1: thickness (optional; "0" for solid section)''' def __init__(self,obj, profile): - obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::Property","Type of section")).FType = 'circle' - obj.addProperty("App::PropertyLength","D","Draft",QT_TRANSLATE_NOOP("App::Property","Diameter of the beam")).D = profile[4] - obj.addProperty("App::PropertyLength","t1","Draft",QT_TRANSLATE_NOOP("App::Property","Thickness")).t1 = profile[5] + obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::PropertyString","Type of section")).FType = 'circle' + obj.addProperty("App::PropertyLength","D","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Diameter of the beam")).D = profile[4] + obj.addProperty("App::PropertyLength","t1","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Thickness")).t1 = profile[5] _Profile.__init__(self,obj,profile) def execute(self,obj): D,t1= obj.D.Value, obj.t1.Value @@ -933,16 +935,16 @@ def execute(self,obj): elif t10: sub=selex[0].SubObjects[0] - if sub.ShapeType=='Edge' and sub.curvatureAt(0)>0: + if sub.ShapeType=='Edge' and sub.curvatureAt(0)>0: axObj=sub.tangentAt(0).cross(sub.normalAt(0)) obj=selex[0].Object X=obj.Placement.Rotation.multVec(FreeCAD.Vector(1,0,0)).dot(axObj) @@ -61,7 +63,7 @@ def isPipe(obj): def isElbow(obj): 'True if obj is an elbow' return hasattr(obj,'PType') and obj.PType=='Elbow' - + def moveToPyLi(obj,plName): ''' Move obj to the group of pypeLine plName @@ -73,7 +75,7 @@ def moveToPyLi(obj,plName): if obj.PType in objToPaint: obj.ViewObject.ShapeColor=pl.ViewObject.ShapeColor elif obj.PType == 'PypeBranch': - for e in [FreeCAD.ActiveDocument.getObject(name) for name in obj.Tubes+obj.Curves]: + for e in [FreeCAD.ActiveDocument.getObject(name) for name in obj.Tubes+obj.Curves]: e.ViewObject.ShapeColor=pl.ViewObject.ShapeColor def portsPos(o): @@ -93,7 +95,7 @@ def portsDir(o): if hasattr(o,'PType'): if o.PType in two_ways: dirs=[o.Placement.Rotation.multVec(p) for p in [FreeCAD.Vector(0,0,-1),FreeCAD.Vector(0,0,1)]] - elif hasattr(o,'Ports') and hasattr(o,'Placement'): + elif hasattr(o,'Ports') and hasattr(o,'Placement'): dirs=list() for p in o.Ports: if p.Length: @@ -106,7 +108,7 @@ def portsDir(o): def simpleSurfBend(path=None,profile=None): 'select the centerline and the O.D. and let it sweep' - curva=FreeCAD.activeDocument().addObject("Part::Feature","CurvaSemplice") + curva=FreeCAD.activeDocument().addObject("Part::Feature",translate("Part::Feature","Simple curve")) if path==None or profile==None: curva.Shape=Part.makeSweepSurface(*fCmd.edges()[:2]) elif path.ShapeType==profile.ShapeType=='Edge': @@ -129,7 +131,7 @@ def makePipe(propList=[], pos=None, Z=None): pos=FreeCAD.Vector(0,0,0) if Z==None: Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Tubo") + a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Tube")) if len(propList)==4: pFeatures.Pipe(a,*propList) else: @@ -140,7 +142,7 @@ def makePipe(propList=[], pos=None, Z=None): a.Placement.Rotation=rot.multiply(a.Placement.Rotation) return a -def doPipes(propList=['DN50',60.3,3,1000], pypeline=None): +def doPipes(propList=['DN50',60.3,3,1000], pypeline=None): ''' propList = [ DN (string): nominal diameter @@ -160,7 +162,7 @@ def doPipes(propList=['DN50',60.3,3,1000], pypeline=None): else: selex=FreeCADGui.Selection.getSelectionEx() for objex in selex: - o=objex.Object + o=objex.Object if fCmd.faces(): # Face selected... for face in fCmd.faces(): x=(face.ParameterRange[0]+face.ParameterRange[1])/2 @@ -168,7 +170,7 @@ def doPipes(propList=['DN50',60.3,3,1000], pypeline=None): plist.append(makePipe(propList,face.valueAt(x,y),face.normalAt(x,y))) FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() - else: + else: for edge in fCmd.edges([objex]): # ...one or more edges... if edge.curvatureAt(0)==0: # ...straight edges pL=propList @@ -207,7 +209,7 @@ def makeElbow(propList=[], pos=None, Z=None): pos=FreeCAD.Vector(0,0,0) if Z==None: Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Curva") + a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Elbow")) if len(propList)==5: pFeatures.Elbow(a,*propList) else: @@ -272,7 +274,7 @@ def makeElbowBetweenThings(thing1=None, thing2=None, propList=None): fCmd.extendTheBeam(tube,portB) return elb -def doElbow(propList=['DN50',60.3,3,90,45.225], pypeline=None): +def doElbow(propList=['DN50',60.3,3,90,45.225], pypeline=None): ''' propList = [ DN (string): nominal diameter @@ -364,7 +366,7 @@ def makeFlange(propList=[], pos=None, Z=None): pos=FreeCAD.Vector(0,0,0) if Z==None: Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Flangia") + a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Flange")) if len(propList)>=8: pFeatures.Flange(a,*propList) else: @@ -430,7 +432,7 @@ def makeReduct(propList=[], pos=None, Z=None, conc=True): OD2 (float): minor diameter thk (float): major thickness thk2 (float): minor thickness - H (float): length of reduction + H (float): length of reduction pos (vector): position of insertion; default = 0,0,0 Z (vector): orientation: default = 0,0,1 conc (bool): True for concentric or Flase for eccentric reduction @@ -440,7 +442,7 @@ def makeReduct(propList=[], pos=None, Z=None, conc=True): pos=FreeCAD.Vector(0,0,0) if Z==None: Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Riduz") + a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Reduction")) propList.append(conc) pFeatures.Reduct(a,*propList) a.ViewObject.Proxy=0 @@ -466,7 +468,7 @@ def makeUbolt(propList=[], pos=None, Z=None): pos=FreeCAD.Vector(0,0,0) if Z==None: Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","U-Bolt") + a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","U-Bolt")) if len(propList)==5: pFeatures.Ubolt(a,*propList) else: @@ -486,7 +488,7 @@ def makeShell(L=1000,W=1500,H=1500,thk1=6,thk2=8): H(eight): default=500 thk (thickness): default=6 ''' - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Serbatoio") + a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Tank")) pFeatures.Shell(a,L,W,H,thk1,thk2) a.ViewObject.Proxy=0 a.Placement.Base=FreeCAD.Vector(0,0,0) @@ -511,7 +513,7 @@ def makeCap(propList=[], pos=None, Z=None): pos=FreeCAD.Vector(0,0,0) if Z==None: Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Fondo") + a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Cap")) if len(propList)==3: pFeatures.Cap(a,*propList) else: @@ -522,7 +524,7 @@ def makeCap(propList=[], pos=None, Z=None): a.Placement.Rotation=rot.multiply(a.Placement.Rotation) return a -def doCaps(propList=['DN50',60.3,3], pypeline=None): +def doCaps(propList=['DN50',60.3,3], pypeline=None): ''' propList = [ DN (string): nominal diameter @@ -577,7 +579,7 @@ def makeW(): from Draft import makeWire try: p=makeWire(points) - except: + except: FreeCAD.Console.PrintError('Missing intersection\n') return None p.Label='Path' @@ -651,7 +653,7 @@ def makeBranch(base=None, DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None, lab return a else: FreeCAD.Console.PrintError('Select a valid path.\n') - + def updatePLColor(sel=None, color=None): if not sel: sel=FreeCADGui.Selection.getSelection() @@ -663,15 +665,15 @@ def updatePLColor(sel=None, color=None): group=FreeCAD.activeDocument().getObjectsByLabel(pl.Group)[0] for o in group.OutList: if hasattr(o,'PType'): - if o.PType in objToPaint: + if o.PType in objToPaint: o.ViewObject.ShapeColor=color elif o.PType == 'PypeBranch': - for e in [FreeCAD.ActiveDocument.getObject(name) for name in o.Tubes+o.Curves]: + for e in [FreeCAD.ActiveDocument.getObject(name) for name in o.Tubes+o.Curves]: e.ViewObject.ShapeColor=color else: FreeCAD.Console.PrintError('Select first one pype line\n') -def alignTheTube(): +def alignTheTube(): ''' Mates the selected 2 circular edges of 2 separate objects. @@ -686,7 +688,7 @@ def alignTheTube(): if d1.curvatureAt(0)!=0 and d2.curvatureAt(0)!=0: n1=d1.tangentAt(0).cross(d1.normalAt(0)) n2=d2.tangentAt(0).cross(d2.normalAt(0)) - else: + else: FreeCAD.Console.PrintError("Select 2 curved edges.\n") return None rot=FreeCAD.Rotation(n2,n1) @@ -702,16 +704,16 @@ def alignTheTube(): pass elif (com1-d1.centerOfCurvatureAt(0)).dot(com2-d1.centerOfCurvatureAt(0))>0: reverseTheTube(FreeCADGui.Selection.getSelectionEx()[:2][1]) - except: + except: pass #TARGET [solved]: verify if t1 or t2 belong to App::Part and changes the Placement consequently if fCmd.isPartOfPart(t1): - part=fCmd.isPartOfPart(t1) + part=fCmd.isPartOfPart(t1) t2.Placement=part.Placement.multiply(t2.Placement) if fCmd.isPartOfPart(t2): - part=fCmd.isPartOfPart(t2) + part=fCmd.isPartOfPart(t2) t2.Placement=part.Placement.inverse().multiply(t2.Placement) - + def rotateTheTubeAx(obj=None,vShapeRef=None, angle=45): ''' rotateTheTubeAx(obj=None,vShapeRef=None,angle=45) @@ -747,7 +749,7 @@ def reverseTheTube(objEx): rotateTheTubeAx(objEx.Object,FreeCAD.Vector(1,0,0),180) if disp: objEx.Object.Placement.move(disp*2) - + def rotateTheTubeEdge(ang=45): if len(fCmd.edges())>0 and fCmd.edges()[0].curvatureAt(0)!=0: originalPos=fCmd.edges()[0].centerOfCurvatureAt(0) @@ -946,7 +948,7 @@ def laydownTheTube(pipe=None, refFace=None, support=None): FreeCAD.Console.PrintError('Face is not flat or not parallel to axis of pipe\n') except: FreeCAD.Console.PrintError('Wrong selection\n') - + def breakTheTubes(point,pipes=[],gap=0): ''' breakTheTube(point,pipes=[],gap=0) @@ -966,7 +968,7 @@ def breakTheTubes(point,pipes=[],gap=0): pipes2nd.append(pipe2nd) #FreeCAD.activeDocument().recompute() return pipes2nd - + def drawAsCenterLine(obj): try: obj.ViewObject.LineWidth=4 @@ -974,7 +976,7 @@ def drawAsCenterLine(obj): obj.ViewObject.DrawStyle='Dashdot' except: FreeCAD.Console.PrintError('The object can not be center-lined\n') - + def getElbowPort(elbow, portId=0): ''' getElbowPort(elbow, portId=0) @@ -997,13 +999,13 @@ def rotateTheElbowPort(curve=None, port=0, ang=45): except: FreeCAD.Console.PrintError('Please select something before.\n') rotateTheTubeAx(curve,curve.Ports[port],ang) - + def join(obj1,port1,obj2,port2): ''' join(obj1,port1,obj2,port2) \t obj1, obj2 = two "Pype" parts \t port1, port2 = their respective ports to join - ''' + ''' if hasattr(obj1,'PType') and hasattr(obj2,'PType'): if port1>len(obj1.Ports)-1 or port2>len(obj2.Ports)-1: FreeCAD.Console.PrintError('Wrong port(s) number\n') @@ -1036,7 +1038,7 @@ def makeValve(propList=[], pos=None, Z=None): pos=FreeCAD.Vector(0,0,0) if Z==None: Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Valvola") + a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Valve")) if len(propList): pFeatures.Valve(a,*propList) else: @@ -1076,7 +1078,7 @@ def doValves(propList=["DN50", "ball", 72, 50, 40, 150],pypeline=None, pos=0): vlist[-1].Placement.move(portsDir(p1)[1]*float(p1.Height)) vlist[-1].ViewObject.ShapeColor=color # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) # FreeCAD.ActiveDocument.recompute() elif len(fCmd.edges())==0: #..no edges selected vs=[v for sx in FreeCADGui.Selection.getSelectionEx() for so in sx.SubObjects for v in so.Vertexes] @@ -1084,13 +1086,13 @@ def doValves(propList=["DN50", "ball", 72, 50, 40, 150],pypeline=None, pos=0): vlist.append(makeValve(propList)) vlist[-1].ViewObject.ShapeColor=color # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) else: for v in vs: # ... one or more vertexes vlist.append(makeValve(propList,v.Point)) vlist[-1].ViewObject.ShapeColor=color # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) else: selex=FreeCADGui.Selection.getSelectionEx() for objex in selex: @@ -1099,11 +1101,11 @@ def doValves(propList=["DN50", "ball", 72, 50, 40, 150],pypeline=None, pos=0): if edge.curvatureAt(0)==0: # ...straight edges vlist.append(makeValve(propList,edge.valueAt(edge.LastParameter/2-propList[4]/2),edge.tangentAt(0))) # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) else: # ...curved edges pos=edge.centerOfCurvatureAt(0) # SNIPPET TO ALIGN WITH THE PORTS OF Pype SELECTED: BEGIN... if hasattr(o,'PType') and len(o.Ports)==2: - p0,p1=portsPos(o) + p0,p1=portsPos(o) if (p0-pos).Length<(p1-pos).Length: Z=portsDir(o)[0] else: @@ -1112,7 +1114,7 @@ def doValves(propList=["DN50", "ball", 72, 50, 40, 150],pypeline=None, pos=0): Z=edge.tangentAt(0).cross(edge.normalAt(0)) # ...END vlist.append(makeValve(propList,pos,Z)) # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) vlist[-1].ViewObject.ShapeColor=color if pypeline: for v in vlist: @@ -1148,7 +1150,7 @@ def attachToTube(port=None): FreeCAD.Console.PrintMessage('Object Detached\n') except: FreeCAD.Console.PrintError('Nothing attached\n') - + def makeNozzle(DN='DN50', H=200, OD=60.3, thk=3,D=160, d=62, df=132,f=14,t=15,n=4): ''' makeNozzle(DN,OD,thk,D,df,f,t,n) @@ -1163,7 +1165,7 @@ def makeNozzle(DN='DN50', H=200, OD=60.3, thk=3,D=160, d=62, df=132,f=14,t=15,n= n (int): nr. of bolts ''' selex=FreeCADGui.Selection.getSelectionEx() - for sx in selex: + for sx in selex: #e=sx.SubObjects[0] s=sx.Object curved=[e for e in fCmd.edges([sx]) if e.curvatureAt(0)] @@ -1185,7 +1187,7 @@ def makeNozzle(DN='DN50', H=200, OD=60.3, thk=3,D=160, d=62, df=132,f=14,t=15,n= def makeRoute(n=Z): curvedEdges=[e for e in fCmd.edges() if e.curvatureAt(0)!=0] if curvedEdges: - s=FreeCAD.ActiveDocument.addObject('Sketcher::SketchObject','pipeRoute') + s=FreeCAD.ActiveDocument.addObject('Sketcher::SketchObject',translate("Sketcher::SketchObject",'pipeRoute')) s.MapMode = "SectionOfRevolution" sup=fCmd.edgeName() s.Support = [sup] @@ -1195,7 +1197,7 @@ def makeRoute(n=Z): #s.AttachmentOffset=part.Placement.multiply(s.AttachmentOffset) else: return None - if fCmd.faces(): + if fCmd.faces(): n=fCmd.faces()[0].normalAt(0,0) x=s.Placement.Rotation.multVec(X) z=s.Placement.Rotation.multVec(Z) diff --git a/pFeatures.py b/pFeatures.py index c3e0bfe..339305b 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -10,6 +10,8 @@ import FreeCAD, FreeCADGui, Part, fCmd, pCmd from copy import copy from os.path import join, dirname, abspath +from PySide.QtCore import QT_TRANSLATE_NOOP +from DraftGui import translate vO=FreeCAD.Vector(0,0,0) vX=FreeCAD.Vector(1,0,0) @@ -21,11 +23,11 @@ class pypeType(object): def __init__(self,obj): obj.Proxy = self - obj.addProperty("App::PropertyString","PType","PBase","Type of tubeFeature").PType - obj.addProperty("App::PropertyString","PRating","PBase","Rating of pipeFeature").PRating - obj.addProperty("App::PropertyString","PSize","PBase","Nominal diameter").PSize - obj.addProperty("App::PropertyVectorList","Ports","PBase","Ports position relative to the origin of Shape") - obj.addProperty("App::PropertyFloat","Kv","PBase","Flow factor (m3/h/bar)").Kv + obj.addProperty("App::PropertyString","PType","PBase",QT_TRANSLATE_NOOP("App::PropertyString","Type of tubeFeature")).PType + obj.addProperty("App::PropertyString","PRating","PBase",QT_TRANSLATE_NOOP("App::PropertyString","Rating of pipeFeature")).PRating + obj.addProperty("App::PropertyString","PSize","PBase",QT_TRANSLATE_NOOP("App::PropertyString","Nominal diameter")).PSize + obj.addProperty("App::PropertyVectorList","Ports","PBase",QT_TRANSLATE_NOOP("App::PropertyVectorList","Ports position relative to the origin of Shape")) + obj.addProperty("App::PropertyFloat","Kv","PBase",QT_TRANSLATE_NOOP("App::PropertyFloat","Flow factor (m3/h/bar)")).Kv if int(FreeCAD.Version()[1])>19: obj.addExtension("Part::AttachExtensionPython") else: @@ -36,7 +38,7 @@ def execute(self, fp): def nearestPort (self,point=None): ''' nearestPort (point=None) - Returns the Port nearest to point + Returns the Port nearest to point or to the selected geometry. (, , ) ''' @@ -79,11 +81,11 @@ def __init__(self, obj,DN="DN50",OD=60.3,thk=3, H=100): obj.PRating="SCH-STD" obj.PSize=DN # define specific properties - obj.addProperty("App::PropertyLength","OD","Pipe","Outside diameter").OD=OD - obj.addProperty("App::PropertyLength","thk","Pipe","Wall thickness").thk=thk - obj.addProperty("App::PropertyLength","ID","Pipe","Inside diameter").ID=obj.OD-2*obj.thk - obj.addProperty("App::PropertyLength","Height","Pipe","Length of tube").Height=H - obj.addProperty("App::PropertyString","Profile","Pipe","Section dim.").Profile=str(obj.OD)+"x"+str(obj.thk) + obj.addProperty("App::PropertyLength","OD","Pipe",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD + obj.addProperty("App::PropertyLength","thk","Pipe",QT_TRANSLATE_NOOP("App::Property","Wall thickness")).thk=thk + obj.addProperty("App::PropertyLength","ID","Pipe",QT_TRANSLATE_NOOP("App::Property","Inside diameter")).ID=obj.OD-2*obj.thk + obj.addProperty("App::PropertyLength","Height","Pipe",QT_TRANSLATE_NOOP("App::Property","Length of tube")).Height=H + obj.addProperty("App::PropertyString","Profile","Pipe",QT_TRANSLATE_NOOP("App::Property","Section dim.")).Profile=str(obj.OD)+"x"+str(obj.thk) def onChanged(self, fp, prop): if prop=='ID' and fp.ID0: + if i>0: alfa=e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i-1].tangentAt(0))/2 L-=R*tan(alfa) offset=R*tan(alfa) - if i<(len(fp.Base.Shape.Edges)-1): + if i<(len(fp.Base.Shape.Edges)-1): alfa=e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i+1].tangentAt(0))/2 L-=R*tan(alfa) eSupport='Edge'+str(i+1) @@ -679,4 +681,3 @@ def purge(self,fp): fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]) for name in fp.Curves: FreeCAD.ActiveDocument.removeObject(name) fp.Curves=[] - diff --git a/pForms.py b/pForms.py index a3b27f2..b31491f 100644 --- a/pForms.py +++ b/pForms.py @@ -16,6 +16,10 @@ x=mw.x()+int(mw.width()/20)#100 y=max(300,int(mw.height()/3))#350 +def getLanguagePath(): + import os + return os.path.join(os.path.dirname(__file__),"translations") + class redrawDialog(QDialog): def __init__(self): super(redrawDialog,self).__init__() @@ -68,15 +72,15 @@ def selectAll(self): for cb in self.checkBoxes: cb.setChecked(True) def clearAll(self): for cb in self.checkBoxes: cb.setChecked(False) - + class insertPipeForm(dodoDialogs.protoPypeForm): ''' Dialog to insert tubes. For position and orientation you can select - one or more straight edges (centerlines) - one or more curved edges (axis and origin across the center) - - one or more vertexes - - nothing + - one or more vertexes + - nothing Default length = 200 mm. Available one button to reverse the orientation of the last or selected tubes. ''' @@ -173,14 +177,14 @@ class insertElbowForm(dodoDialogs.protoPypeForm): ''' Dialog to insert one elbow. For position and orientation you can select - - one vertex, - - one circular edge + - one vertex, + - one circular edge - a pair of edges or pipes or beams - one pipe at one of its ends - nothing. - In case one pipe is selected, its properties are applied to the elbow and + In case one pipe is selected, its properties are applied to the elbow and the tube or tubes are trimmed or extended automatically. - Also available one button to trim/extend one selected pipe to the selected + Also available one button to trim/extend one selected pipe to the selected edges, if necessary. ''' def __init__(self): @@ -260,7 +264,7 @@ def insert(self): if self.edit2.text(): propList[-1]=float(self.edit2.text()) # INSERT ELBOW - self.lastElbow=pCmd.doElbow(propList, FreeCAD.__activePypeLine__)[-1] + self.lastElbow=pCmd.doElbow(propList, FreeCAD.__activePypeLine__)[-1] # TODO: SET PRATING FreeCAD.activeDocument().recompute() def trim(self): @@ -311,7 +315,7 @@ class insertFlangeForm(dodoDialogs.protoPypeForm): - one or more vertexes, - nothing. In case one pipe is selected, its properties are applied to the flange. - Available one button to reverse the orientation of the last or selected + Available one button to reverse the orientation of the last or selected flanges. ''' def __init__(self): @@ -385,7 +389,7 @@ class insertReductForm(dodoDialogs.protoPypeForm): - one vertex - nothing (created at origin) In case one pipe is selected, its properties are applied to the reduction. - Available one button to reverse the orientation of the last or selected + Available one button to reverse the orientation of the last or selected reductions. ''' def __init__(self): @@ -608,8 +612,8 @@ class insertCapForm(dodoDialogs.protoPypeForm): Dialog to insert caps. For position and orientation you can select - one or more curved edges (axis and origin across the center) - - one or more vertexes - - nothing + - one or more vertexes + - nothing Available one button to reverse the orientation of the last or selected tubes. ''' def __init__(self): @@ -655,10 +659,10 @@ def apply(self): class insertPypeLineForm(dodoDialogs.protoPypeForm): ''' Dialog to insert pypelines. - Note: Elbow created within this dialog have a standard bending radius of + Note: Elbow created within this dialog have a standard bending radius of 3/4 x OD, corresponding to a 3D curve. If you aim to have 5D curve or any other custom bending radius, you shall apply it in the "Insert Elbow" - dialog or change it manually. + dialog or change it manually. ''' def __init__(self): super(insertPypeLineForm,self).__init__("PypeLine Manager","Pipe","SCH-STD","pypeline.svg",x,y) @@ -701,7 +705,7 @@ def summary(self,pl=None): FreeCAD.Console.PrintMessage('Path not defined\n') def apply(self): d=self.pipeDictList[self.sizeList.currentRow()] - if self.combo.currentText()!="": + if self.combo.currentText()!="": pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] pl.PSize=d["PSize"] pl.PRating=self.PRating @@ -726,8 +730,8 @@ def insert(self): FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute() def getBase(self): - if self.combo.currentText()!="": - pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] + if self.combo.currentText()!="": + pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] sel=FreeCADGui.Selection.getSelection() if sel: base=sel[0] @@ -788,12 +792,12 @@ def partList(self): w.writerows(rows) plist.close() FreeCAD.Console.PrintMessage('Data saved in %s.\n' %f) - + class insertBranchForm(dodoDialogs.protoPypeForm): ''' Dialog to insert branches. - Note: Elbow created within this dialog have a standard bending radius of - 3/4 x OD, corresponding to a 3D curve. + Note: Elbow created within this dialog have a standard bending radius of + 3/4 x OD, corresponding to a 3D curve. ''' def __init__(self): super(insertBranchForm,self).__init__("Insert a branch","Pipe","SCH-STD","branch.svg",x,y) @@ -824,7 +828,7 @@ def summary(self,pl=None): FreeCAD.Console.PrintMessage('Path not defined\n') #def apply(self): #d=self.pipeDictList[self.sizeList.currentRow()] - #if self.combo.currentText()!="": + #if self.combo.currentText()!="": #pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] #pl.PSize=d["PSize"] #pl.PRating=self.PRating @@ -846,7 +850,7 @@ def insert(self): FreeCAD.activeDocument().commitTransaction() FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute() - + class breakForm(QDialog): ''' Dialog to break one pipe and create a gap. @@ -863,7 +867,7 @@ def __init__(self,winTitle='Break the pipes', PType='Pipe', PRating='SCH-STD', i from PySide.QtGui import QIcon Icon=QIcon() Icon.addFile(iconPath) - self.setWindowIcon(Icon) + self.setWindowIcon(Icon) self.grid=QGridLayout() self.setLayout(self.grid) self.btn0=QPushButton('Length') @@ -1009,8 +1013,8 @@ class insertValveForm(dodoDialogs.protoPypeForm): For position and orientation you can select - one or more straight edges (centerlines) - one or more curved edges (axis and origin across the center) - - one or more vertexes - - nothing + - one or more vertexes + - nothing Default valve = DN50 ball valve. Available one button to reverse the orientation of the last or selected valves. ''' @@ -1042,14 +1046,14 @@ def __init__(self): self.show() ######### self.lastValve=None - def reverse(self): + def reverse(self): selValves=[p for p in FreeCADGui.Selection.getSelection() if hasattr(p,'PType') and p.PType=='Valve'] if len(selValves): for p in selValves: pCmd.rotateTheTubeAx(p,FreeCAD.Vector(1,0,0),180) else: pCmd.rotateTheTubeAx(self.lastValve,FreeCAD.Vector(1,0,0),180) - def insert(self): + def insert(self): d=self.pipeDictList[self.sizeList.currentRow()] propList=[d['PSize'],d['VType'],float(pq(d['OD'])),float(pq(d['ID'])),float(pq(d['H'])),float(pq(d['Kv']))] if self.cb1.isChecked(): # ..place the valve in the middle of pipe(s) @@ -1076,7 +1080,7 @@ def apply(self): class point2pointPipe(DraftTools.Line): ''' Draw pipes by sequence point. - ''' + ''' def __init__(self, wireFlag=True): DraftTools.Line.__init__(self,wireFlag) self.Activated() @@ -1201,7 +1205,7 @@ def __init__(self): def accept(self): dims=list() for lineEdit in [self.form.editX, self.form.editY, self.form.editZ]: - if lineEdit.text(): + if lineEdit.text(): dims.append(float(lineEdit.text())) else: dims.append(1000) @@ -1290,7 +1294,7 @@ def accept(self, ang=None): FreeCADGui.activeDocument().setEdit(s.Name) FreeCAD.ActiveDocument.commitTransaction() def selectAction(self): - if fCmd.faces(): + if fCmd.faces(): self.normal=fCmd.faces()[0].normalAt(0,0) elif fCmd.edges(): self.normal=fCmd.edges()[0].tangentAt(0) @@ -1306,9 +1310,9 @@ def mouseActionB1(self, CtrlAltShift=[False,False,False]): self.edge=infos['Component'] i=int(self.edge[4:])-1 e=self.obj.Shape.Edges[i] - if e.curvatureAt(0)==0: + if e.curvatureAt(0)==0: self.L=e.Length - else: + else: self.L=0 self.form.lab2.setText(infos['Object']+': '+self.edge) elif fCmd.edges(): @@ -1318,10 +1322,8 @@ def mouseActionB1(self, CtrlAltShift=[False,False,False]): self.edge=fCmd.edgeName(e)[1] self.L=float(e.Length) self.form.lab2.setText(self.edge+' of '+self.obj.Label) - else: + else: self.L=0 self.obj=None self.edge=None self.form.lab2.setText('') + """ + Dialog for makeRoute(). + """ + + def __init__(self): + FreeCADGui.Selection.clearSelection() + super(insertRouteForm, self).__init__("route.ui") + self.normal = FreeCAD.Vector(0, 0, 1) + self.L = 0 + self.obj = None + self.edge = None + self.form.edit1.setValidator(QDoubleValidator()) + self.form.btn1.clicked.connect(self.selectAction) + self.form.btn2.clicked.connect(self.mouseActionB1) + self.form.btnX.clicked.connect(lambda: self.getPrincipalAx("X")) + self.form.btnY.clicked.connect(lambda: self.getPrincipalAx("Y")) + self.form.btnZ.clicked.connect(lambda: self.getPrincipalAx("Z")) + self.form.slider.valueChanged.connect( + self.changeOffset + ) # lambda:self.form.edit1.setText(str(self.form.dial.value()))) + # self.form.edit1.editingFinished.connect(self.moveSlider) #lambda:self.form.dial.setValue(int(round(self.form.edit1.text())))) + + def changeOffset(self): + if self.L: + offset = self.L * self.form.slider.value() / 100 + self.form.edit1.setText("%.1f" % offset) + + def getPrincipalAx(self, ax): + if ax == "X": + self.normal = FreeCAD.Vector(1, 0, 0) + elif ax == "Y": + self.normal = FreeCAD.Vector(0, 1, 0) + elif ax == "Z": + self.normal = FreeCAD.Vector(0, 0, 1) + self.form.lab1.setText("global " + ax) + + def accept(self, ang=None): + FreeCAD.ActiveDocument.openTransaction("Make pipe route") + if fCmd.edges(): + e = fCmd.edges()[0] + if e.curvatureAt(0): + pCmd.makeRoute(self.normal) + else: + s = FreeCAD.ActiveDocument.addObject( + "Sketcher::SketchObject", "pipeRoute" + ) + s.MapMode = "NormalToEdge" + s.Support = [(self.obj, self.edge)] + s.AttachmentOffset = FreeCAD.Placement( + FreeCAD.Vector(0, 0, -1 * float(self.form.edit1.text())), + FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), 0), + ) + FreeCADGui.activeDocument().setEdit(s.Name) + FreeCAD.ActiveDocument.commitTransaction() + + def selectAction(self): + if fCmd.faces(): + self.normal = fCmd.faces()[0].normalAt(0, 0) + elif fCmd.edges(): + self.normal = fCmd.edges()[0].tangentAt(0) + else: + self.normal = FreeCAD.Vector(0, 0, 1) + self.form.lab1.setText( + "%.1f,%.1f,%.1f " % (self.normal.x, self.normal.y, self.normal.z) + ) + + def mouseActionB1(self, CtrlAltShift=[False, False, False]): + v = FreeCADGui.ActiveDocument.ActiveView + infos = v.getObjectInfo(v.getCursorPos()) + self.form.slider.setValue(0) + if infos and infos["Component"][:4] == "Edge": + self.obj = FreeCAD.ActiveDocument.getObject(infos["Object"]) + self.edge = infos["Component"] + i = int(self.edge[4:]) - 1 + e = self.obj.Shape.Edges[i] + if e.curvatureAt(0) == 0: + self.L = e.Length + else: + self.L = 0 + self.form.lab2.setText(infos["Object"] + ": " + self.edge) + elif fCmd.edges(): + selex = FreeCADGui.Selection.getSelectionEx()[0] + self.obj = selex.Object + e = fCmd.edges()[0] + self.edge = fCmd.edgeName(e)[1] + self.L = float(e.Length) + self.form.lab2.setText(self.edge + " of " + self.obj.Label) + else: + self.L = 0 + self.obj = None + self.edge = None + self.form.lab2.setText(translate("insertRouteForm", "') - - diff --git a/translations/Update code.txt b/translations/Update code.txt new file mode 100644 index 0000000..db0d9ba --- /dev/null +++ b/translations/Update code.txt @@ -0,0 +1 @@ +pylupdate5 ./../InitGui.py ./../fCmd.py ./../CPipe.py ./../CUtils.py ./../dodoDialogs.py ./../dodoPM.py ./../fForms.py ./../fObservers.py ./../CFrame.py ./../pFeatures.py ./../pCmd.py -ts ./dodo_es-ES.ts \ No newline at end of file diff --git a/translations/dodo_es-ES.qm b/translations/dodo_es-ES.qm new file mode 100644 index 0000000000000000000000000000000000000000..e4cfed1f4fde6dcb9195737e8ab1d7b8ca3efecf GIT binary patch literal 17735 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 A=>Px# literal 0 HcmV?d00001 diff --git a/translations/dodo_es-ES.ts b/translations/dodo_es-ES.ts new file mode 100644 index 0000000..cbed196 --- /dev/null +++ b/translations/dodo_es-ES.ts @@ -0,0 +1,923 @@ + + + + + App::Property + + + Length of tube + Longitud del tubo + + + + Type of tubeFeature + Tipo caracteristica de tubo + + + + Rating of pipeFeature + Relacion de caracteristicas de tubo + + + + Nominal diameter + Diametro nominal + + + + Ports position relative to the origin of Shape + Posicion de los puertos relativos al origen de la forma + + + + Flow factor (m3/h/bar) + Factor de flujo (m3/h/bar) + + + + Outside diameter + Diametro exterior + + + + Wall thickness + Espesor de muro + + + + Inside diameter + Diametro interno + + + + Section dim. + Dimension de seccion. + + + + Bend Angle + Angulo de dobles + + + + Bend Radius + Radio de dobles + + + + Type of flange + Tipo de brida + + + + Flange diameter + Diametro de brida + + + + Bore diameter + Diametro de orificio + + + + Bolts distance + Distancia de tornillos + + + + Bolts hole diameter + Diametro de orificio para tornillo + + + + Thickness of flange + Espesor de brida + + + + Nr. of bolts + Numero de tornillos + + + + Thickness of raised face + Espesor de cara elevada + + + + Diameter of raised face + Diametro de cara elevada + + + + Length of welding neck + Longitud de cuello para soldadura + + + + Diameter of welding neck + Diametro de cuello para soldadura + + + + Outside diameter of pipe + Diametro exterior de tuberia + + + + Major diameter + Diametro mayor + + + + Minor diameter + Diametro menor + + + + Make the lenght variable + Hace la longitud variable + + + + Length of reduction + Longitud de reducción + + + + Concentric or Eccentric + Concentrico o excentrico + + + + the radius of bending + El radio de dobles + + + + The group. + El grupo. + + + + Type of pipeFeature + Tipo de caracteristica de tubo + + + + Type of clamp + Tipo de sujeccion + + + + Size of clamp + Tamaño de sujeccion + + + + Arc diameter + Diametro de arco + + + + Overall height + Altura total + + + + Rod diameter + Diametro de vastago + + + + Size of thread + Tamaño de rosca + + + + Tank's length + Longitud de deposito + + + + Tank's width + Ancho de deposito + + + + Tank's height + Altura de deposito + + + + Thikness of tank's shell + Espesor de carcaza del deposito + + + + Thikness of tank's top + Espesor superior del deposito + + + + The tubes of the branch. + Tubos de la derivación. + + + + The curves of the branch. + Las curvas de la derivacion. + + + + The path. + La ruta. + + + + FrameBranchManager + + + Open FrameBranch Manager + Abre gestor de marcos + + + + FrameBranch Manager + Derivacion de gestor de marcos + + + + Part::Feature + + + CurvaSemplice + Curva simple + + + + Simple curve + Curva simple + + + + Tube + Tubo + + + + Part::FeaturePython + + + Tube + Tubo + + + + Elbow + Codo + + + + Flange + Brida + + + + Reduction + Reduccion + + + + U-Bolt + Tornillo U + + + + Tank + Deposito + + + + Cap + Tapon + + + + Valve + Valvula + + + + Sketcher::SketchObject + + + pipeRoute + Rutatuberia + + + + adjustFrameAngle + + + Adjust the angle of frame by two edges + Ajusta del angulo del marco por medio de dos aristas + + + + adjustFrameAngle + Adjuste de angulo de marcos + + + + alignEdge + + + Join two edges: select two or pre-select several + Une dos aristas:selecciona dos o pre selecciona varias + + + + Mate the edges + Coindicir las aristas + + + + alignFlange + + + alignFlange + Alinear superficies + + + + Rotates the section of the beam to make the faces parallel to another face + Rota la seccion de la viga para hacer las caras paralelas a otra cara + + + + attach2tube + + + Attach to tube + Ligado al tubo + + + + Attach one pype to the nearest port of selected pipe + Liga un tipo de tuberia al puerto mas cercano de la tuberia seleccionada + + + + breakPipe + + + Break the pipe + Rompe la tuberia + + + + Break one pipe at point and insert gap + Dividir un tubo al punto e insertar un espacio + + + + capQM + + + QM for caps + QM para tapones + + + + dodo + + + Frame tools + Herramientas para estructuras + + + + Pype tools + Herramientas para tuberias + + + + Utils + Utilerias + + + + QkMenus + Menus QK + + + + frametools + Herramientas estructurales + + + + pypetools + Herramientas de tuberia + + + + dpCalc + + + Pressure loss calculator + Calculadora de Perdida de presion + + + + Calculate pressure loss in "pypes" using ChEDL libraries. + See __doc__ of the module for futher information. + Calcular perdida de presión en tuberias utilizando biblioteca ChEDL. + Revisar __doc__ del modulo para mayor información. + + + + elbowQM + + + QM for elbows + QM para codos + + + + extend + + + extendTheBeam + Extender la viga + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Extiende la viga a sea hacia una cara, vertice o C.O.M del objeto seleccionado + + + + extend1intersection + + + Extends pipe to intersection + Extiende tubo a la insercción + + + + extend2intersection + + + Extends pipes to intersection + Extiende tubos a la interseccion + + + + flangeQM + + + QM for flanges + QM para bridas + + + + flat + + + Fit one elbow + Colocar un codo + + + + Place the elbow between two pipes or beams + Colocar un codo entre 2 tuberias o vigas + + + + frameIt + + + Place one-beam over one-edge + Coloca una viga sobre una arista + + + + Place one beam after the other over the edges + Coloca una viga despues de las otras aristas + + + + hackedL + + + draw a DWire + Dibuja un Dwire + + + + WP is re-positioned at each point. Possible to spin and offset it. + Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. + + + + insertAnyz + + + Insert any shape + Insertar cualquier forma + + + + Insert a STEP, IGES or BREP + Insertar un solido STEP, IGES, BREP + + + + insertBranch + + + Insert a branch + Insertar una derivación + + + + Insert a PypeBranch + Insertar una derivacion de tuberia + + + + insertCap + + + Insert a cap + Insertar un tapon + + + + insertElbow + + + Insert a curve + Insertar una curva + + + + insertFlange + + + Insert a flange + Insertar una brida + + + + insertPath + + + insert Path + Insertar trayectoria + + + + Creates one path along selected edges + Crea una trayectoria a lo largo de la arista seleccionada + + + + insertPipe + + + Insert a tube + Insertar un tubo + + + + insertPypeLine + + + PypeLine Manager + Gestor de tuberia de linea + + + + Open PypeLine Manager + Abre gestor de tuberia de linea + + + + insertReduct + + + Insert a reduction + Insertar una reducción + + + + insertRoute + + + Insert a pipe route + Insertar una ruta de tuberia + + + + Create a sketch attached to a circular edge + Crea un boceto adjunta a una aristar circular + + + + insertSection + + + Insert sections + Inserta secciones + + + + Creates customized beam profiles 2D + Crea un perfil de viga 2D personalizado + + + + insertTank + + + Insert a tank + Inserta un deposito + + + + Create tank and nozzles + Crea un deposito y boquillas + + + + insertUbolt + + + Insert a U-bolt + Insertar un tornillo U + + + + insertValve + + + Insert a valve + Insertar una valvula + + + + joinPype + + + Join pypes + Unir tuberias + + + + Select the part-pype and the port + Selecciona la pieza de tuberia y el puerto + + + + laydown + + + Lay-down the pipe + Empotra la tuberia + + + + Lay-down the pipe on the support plane + Empotra la tuberia sobre el plano de soporte + + + + levelBeam + + + Flush the surfaces + Empotrar las superficies + + + + Shift the beams to line-up the faces to the first selection (faces must be //) + Desplaza la viga para alinearla a la cara de la primera seleccion (caras deben ser paralelas) + + + + mateEdges + + + Mate pipes edges + Coincidir las aristas de las tuberias + + + + Mate two terminations through their edges + Coincidir dos terminaciones a traves de sus aristas + + + + moveHandle + + + Move objects + Mover objetos + + + + Move quickly objects inside viewport + Mover objetos rapidamente dentro de la vista + + + + moveWorkPlane + + + align Workplane + Alinear plano de trabajo + + + + Moves and rotates the drafting workplane with points, edges and faces + Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras + + + + offsetWorkPlane + + + offset Workplane + Desfazar plano de trabajo + + + + Shifts the WP alongg its normal. + Desplaza el plano de trabajo a lo largo de su normal. + + + + pipeQM + + + QM for pipes + QM para tuberias + + + + pivotBeam + + + pivotTheBeam + Pivotea la viga + + + + Rotates the beam around an axis (edge or center-of-curvature) + Rota la viga alrededor de un eje (arista o centro de curvatura) + + + + point2point + + + draw a tube point-to-point + Dibuja un tubo de punto a punto + + + + Click on subsequent points. + Da clic en puntos subsecuentes. + + + + queryModel + + + query the model + Consultar el modelo + + + + Click objects to print infos + Cliquear objetos para imprimir información + + + + raiseup + + + Raise-up the support + Eleva el soporte + + + + Raise the support to the pipe + Eleva el soporte hacia la tuberia + + + + reverseBeam + + + Reverse orientation + Invertir orientacion + + + + Reverse the orientation of selected objects + Invertir orientacion a los objetos seleccionados + + + + rotJoin + + + rotJoinEdge + Rotar arista de union + + + + Rotates and align the beam according another edge + Rota y alinea la viga acorde a otra arista + + + + rotateWorkPlane + + + rotate Workplane + Rota el plano de trabajo + + + + Spin the Draft working plane about one of its axes + Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes + + + + selectSolids + + + Select solids + Seleccionar solidos + + + + Grab all solids or those partially selected + to export in .step format + Sujeta todos los solidos parcialmente seleccionados +para exportar en formato step + + + + shiftBeam + + + shiftTheBeam + Desplaza la viga + + + + Translate objects by vectors defined on existing geometry + Traslada el objeto por vectores definidos sobre la geometria existente + + + + spinSect + + + Spin beams by 45 deg. + Gira viga a 45 grados. + + + + Rotates the section of the beam by 45 degrees + Rota la seccion de la viga a 45 grados + + + + stretchBeam + + + stretchTheBeam + Estira la viga + + + + Changes the length of the beam, either according a preselected edge or a direct input + Cambia la longituf de la viga, ya sea acorde a la arista preseleccionada o una entrada directa + + + + valveQM + + + QM for valves + QM para valvulas + + + diff --git a/translations/main.pro b/translations/main.pro new file mode 100644 index 0000000..ada5b0a --- /dev/null +++ b/translations/main.pro @@ -0,0 +1,3 @@ + +SOURCES = ./../fCmd.py ./../CPipe.py ./../CUtils.py ./../dodoDialogs.py ./../dodoPM.py ./../fForms.py ./../fObservers.py ./../CFrame.py +TRANSLATIONS = dodo_es-ES.ts From 977ec4287ccf23eeaa40529ef9501f3379807faf Mon Sep 17 00:00:00 2001 From: hasecilu Date: Mon, 11 Mar 2024 14:12:59 -0600 Subject: [PATCH 017/135] Add bash script to update translations --- pForms.py | 2 +- translations/Update code.txt | 1 - translations/dodo_es-ES.ts | 923 -------- translations/main.pro | 3 - translationz/dodo.ts | 2088 +++++++++++++++++ {translations => translationz}/dodo_es-ES.qm | Bin 17735 -> 17745 bytes translationz/dodo_es-ES.ts | 2093 ++++++++++++++++++ translationz/update_translation.sh | 167 ++ 8 files changed, 4349 insertions(+), 928 deletions(-) delete mode 100644 translations/Update code.txt delete mode 100644 translations/dodo_es-ES.ts delete mode 100644 translations/main.pro create mode 100644 translationz/dodo.ts rename {translations => translationz}/dodo_es-ES.qm (98%) create mode 100644 translationz/dodo_es-ES.ts create mode 100755 translationz/update_translation.sh diff --git a/pForms.py b/pForms.py index b31491f..012431d 100644 --- a/pForms.py +++ b/pForms.py @@ -18,7 +18,7 @@ def getLanguagePath(): import os - return os.path.join(os.path.dirname(__file__),"translations") + return os.path.join(os.path.dirname(__file__),"translationz") class redrawDialog(QDialog): def __init__(self): diff --git a/translations/Update code.txt b/translations/Update code.txt deleted file mode 100644 index db0d9ba..0000000 --- a/translations/Update code.txt +++ /dev/null @@ -1 +0,0 @@ -pylupdate5 ./../InitGui.py ./../fCmd.py ./../CPipe.py ./../CUtils.py ./../dodoDialogs.py ./../dodoPM.py ./../fForms.py ./../fObservers.py ./../CFrame.py ./../pFeatures.py ./../pCmd.py -ts ./dodo_es-ES.ts \ No newline at end of file diff --git a/translations/dodo_es-ES.ts b/translations/dodo_es-ES.ts deleted file mode 100644 index cbed196..0000000 --- a/translations/dodo_es-ES.ts +++ /dev/null @@ -1,923 +0,0 @@ - - - - - App::Property - - - Length of tube - Longitud del tubo - - - - Type of tubeFeature - Tipo caracteristica de tubo - - - - Rating of pipeFeature - Relacion de caracteristicas de tubo - - - - Nominal diameter - Diametro nominal - - - - Ports position relative to the origin of Shape - Posicion de los puertos relativos al origen de la forma - - - - Flow factor (m3/h/bar) - Factor de flujo (m3/h/bar) - - - - Outside diameter - Diametro exterior - - - - Wall thickness - Espesor de muro - - - - Inside diameter - Diametro interno - - - - Section dim. - Dimension de seccion. - - - - Bend Angle - Angulo de dobles - - - - Bend Radius - Radio de dobles - - - - Type of flange - Tipo de brida - - - - Flange diameter - Diametro de brida - - - - Bore diameter - Diametro de orificio - - - - Bolts distance - Distancia de tornillos - - - - Bolts hole diameter - Diametro de orificio para tornillo - - - - Thickness of flange - Espesor de brida - - - - Nr. of bolts - Numero de tornillos - - - - Thickness of raised face - Espesor de cara elevada - - - - Diameter of raised face - Diametro de cara elevada - - - - Length of welding neck - Longitud de cuello para soldadura - - - - Diameter of welding neck - Diametro de cuello para soldadura - - - - Outside diameter of pipe - Diametro exterior de tuberia - - - - Major diameter - Diametro mayor - - - - Minor diameter - Diametro menor - - - - Make the lenght variable - Hace la longitud variable - - - - Length of reduction - Longitud de reducción - - - - Concentric or Eccentric - Concentrico o excentrico - - - - the radius of bending - El radio de dobles - - - - The group. - El grupo. - - - - Type of pipeFeature - Tipo de caracteristica de tubo - - - - Type of clamp - Tipo de sujeccion - - - - Size of clamp - Tamaño de sujeccion - - - - Arc diameter - Diametro de arco - - - - Overall height - Altura total - - - - Rod diameter - Diametro de vastago - - - - Size of thread - Tamaño de rosca - - - - Tank's length - Longitud de deposito - - - - Tank's width - Ancho de deposito - - - - Tank's height - Altura de deposito - - - - Thikness of tank's shell - Espesor de carcaza del deposito - - - - Thikness of tank's top - Espesor superior del deposito - - - - The tubes of the branch. - Tubos de la derivación. - - - - The curves of the branch. - Las curvas de la derivacion. - - - - The path. - La ruta. - - - - FrameBranchManager - - - Open FrameBranch Manager - Abre gestor de marcos - - - - FrameBranch Manager - Derivacion de gestor de marcos - - - - Part::Feature - - - CurvaSemplice - Curva simple - - - - Simple curve - Curva simple - - - - Tube - Tubo - - - - Part::FeaturePython - - - Tube - Tubo - - - - Elbow - Codo - - - - Flange - Brida - - - - Reduction - Reduccion - - - - U-Bolt - Tornillo U - - - - Tank - Deposito - - - - Cap - Tapon - - - - Valve - Valvula - - - - Sketcher::SketchObject - - - pipeRoute - Rutatuberia - - - - adjustFrameAngle - - - Adjust the angle of frame by two edges - Ajusta del angulo del marco por medio de dos aristas - - - - adjustFrameAngle - Adjuste de angulo de marcos - - - - alignEdge - - - Join two edges: select two or pre-select several - Une dos aristas:selecciona dos o pre selecciona varias - - - - Mate the edges - Coindicir las aristas - - - - alignFlange - - - alignFlange - Alinear superficies - - - - Rotates the section of the beam to make the faces parallel to another face - Rota la seccion de la viga para hacer las caras paralelas a otra cara - - - - attach2tube - - - Attach to tube - Ligado al tubo - - - - Attach one pype to the nearest port of selected pipe - Liga un tipo de tuberia al puerto mas cercano de la tuberia seleccionada - - - - breakPipe - - - Break the pipe - Rompe la tuberia - - - - Break one pipe at point and insert gap - Dividir un tubo al punto e insertar un espacio - - - - capQM - - - QM for caps - QM para tapones - - - - dodo - - - Frame tools - Herramientas para estructuras - - - - Pype tools - Herramientas para tuberias - - - - Utils - Utilerias - - - - QkMenus - Menus QK - - - - frametools - Herramientas estructurales - - - - pypetools - Herramientas de tuberia - - - - dpCalc - - - Pressure loss calculator - Calculadora de Perdida de presion - - - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. - Calcular perdida de presión en tuberias utilizando biblioteca ChEDL. - Revisar __doc__ del modulo para mayor información. - - - - elbowQM - - - QM for elbows - QM para codos - - - - extend - - - extendTheBeam - Extender la viga - - - - Extend the beam either to a face, a vertex or the c.o.m. of the selected object - Extiende la viga a sea hacia una cara, vertice o C.O.M del objeto seleccionado - - - - extend1intersection - - - Extends pipe to intersection - Extiende tubo a la insercción - - - - extend2intersection - - - Extends pipes to intersection - Extiende tubos a la interseccion - - - - flangeQM - - - QM for flanges - QM para bridas - - - - flat - - - Fit one elbow - Colocar un codo - - - - Place the elbow between two pipes or beams - Colocar un codo entre 2 tuberias o vigas - - - - frameIt - - - Place one-beam over one-edge - Coloca una viga sobre una arista - - - - Place one beam after the other over the edges - Coloca una viga despues de las otras aristas - - - - hackedL - - - draw a DWire - Dibuja un Dwire - - - - WP is re-positioned at each point. Possible to spin and offset it. - Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. - - - - insertAnyz - - - Insert any shape - Insertar cualquier forma - - - - Insert a STEP, IGES or BREP - Insertar un solido STEP, IGES, BREP - - - - insertBranch - - - Insert a branch - Insertar una derivación - - - - Insert a PypeBranch - Insertar una derivacion de tuberia - - - - insertCap - - - Insert a cap - Insertar un tapon - - - - insertElbow - - - Insert a curve - Insertar una curva - - - - insertFlange - - - Insert a flange - Insertar una brida - - - - insertPath - - - insert Path - Insertar trayectoria - - - - Creates one path along selected edges - Crea una trayectoria a lo largo de la arista seleccionada - - - - insertPipe - - - Insert a tube - Insertar un tubo - - - - insertPypeLine - - - PypeLine Manager - Gestor de tuberia de linea - - - - Open PypeLine Manager - Abre gestor de tuberia de linea - - - - insertReduct - - - Insert a reduction - Insertar una reducción - - - - insertRoute - - - Insert a pipe route - Insertar una ruta de tuberia - - - - Create a sketch attached to a circular edge - Crea un boceto adjunta a una aristar circular - - - - insertSection - - - Insert sections - Inserta secciones - - - - Creates customized beam profiles 2D - Crea un perfil de viga 2D personalizado - - - - insertTank - - - Insert a tank - Inserta un deposito - - - - Create tank and nozzles - Crea un deposito y boquillas - - - - insertUbolt - - - Insert a U-bolt - Insertar un tornillo U - - - - insertValve - - - Insert a valve - Insertar una valvula - - - - joinPype - - - Join pypes - Unir tuberias - - - - Select the part-pype and the port - Selecciona la pieza de tuberia y el puerto - - - - laydown - - - Lay-down the pipe - Empotra la tuberia - - - - Lay-down the pipe on the support plane - Empotra la tuberia sobre el plano de soporte - - - - levelBeam - - - Flush the surfaces - Empotrar las superficies - - - - Shift the beams to line-up the faces to the first selection (faces must be //) - Desplaza la viga para alinearla a la cara de la primera seleccion (caras deben ser paralelas) - - - - mateEdges - - - Mate pipes edges - Coincidir las aristas de las tuberias - - - - Mate two terminations through their edges - Coincidir dos terminaciones a traves de sus aristas - - - - moveHandle - - - Move objects - Mover objetos - - - - Move quickly objects inside viewport - Mover objetos rapidamente dentro de la vista - - - - moveWorkPlane - - - align Workplane - Alinear plano de trabajo - - - - Moves and rotates the drafting workplane with points, edges and faces - Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras - - - - offsetWorkPlane - - - offset Workplane - Desfazar plano de trabajo - - - - Shifts the WP alongg its normal. - Desplaza el plano de trabajo a lo largo de su normal. - - - - pipeQM - - - QM for pipes - QM para tuberias - - - - pivotBeam - - - pivotTheBeam - Pivotea la viga - - - - Rotates the beam around an axis (edge or center-of-curvature) - Rota la viga alrededor de un eje (arista o centro de curvatura) - - - - point2point - - - draw a tube point-to-point - Dibuja un tubo de punto a punto - - - - Click on subsequent points. - Da clic en puntos subsecuentes. - - - - queryModel - - - query the model - Consultar el modelo - - - - Click objects to print infos - Cliquear objetos para imprimir información - - - - raiseup - - - Raise-up the support - Eleva el soporte - - - - Raise the support to the pipe - Eleva el soporte hacia la tuberia - - - - reverseBeam - - - Reverse orientation - Invertir orientacion - - - - Reverse the orientation of selected objects - Invertir orientacion a los objetos seleccionados - - - - rotJoin - - - rotJoinEdge - Rotar arista de union - - - - Rotates and align the beam according another edge - Rota y alinea la viga acorde a otra arista - - - - rotateWorkPlane - - - rotate Workplane - Rota el plano de trabajo - - - - Spin the Draft working plane about one of its axes - Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes - - - - selectSolids - - - Select solids - Seleccionar solidos - - - - Grab all solids or those partially selected - to export in .step format - Sujeta todos los solidos parcialmente seleccionados -para exportar en formato step - - - - shiftBeam - - - shiftTheBeam - Desplaza la viga - - - - Translate objects by vectors defined on existing geometry - Traslada el objeto por vectores definidos sobre la geometria existente - - - - spinSect - - - Spin beams by 45 deg. - Gira viga a 45 grados. - - - - Rotates the section of the beam by 45 degrees - Rota la seccion de la viga a 45 grados - - - - stretchBeam - - - stretchTheBeam - Estira la viga - - - - Changes the length of the beam, either according a preselected edge or a direct input - Cambia la longituf de la viga, ya sea acorde a la arista preseleccionada o una entrada directa - - - - valveQM - - - QM for valves - QM para valvulas - - - diff --git a/translations/main.pro b/translations/main.pro deleted file mode 100644 index ada5b0a..0000000 --- a/translations/main.pro +++ /dev/null @@ -1,3 +0,0 @@ - -SOURCES = ./../fCmd.py ./../CPipe.py ./../CUtils.py ./../dodoDialogs.py ./../dodoPM.py ./../fForms.py ./../fObservers.py ./../CFrame.py -TRANSLATIONS = dodo_es-ES.ts diff --git a/translationz/dodo.ts b/translationz/dodo.ts new file mode 100644 index 0000000..dbe7e72 --- /dev/null +++ b/translationz/dodo.ts @@ -0,0 +1,2088 @@ + + + + + App::Property + + + + + + + Outside diameter + + + + + + + + + + Wall thickness + + + + + + + + Inside diameter + + + + + + Length of tube + + + + + + + + Section dim. + + + + + Bend Angle + + + + + + Bend Radius + + + + + Type of flange + + + + + Flange diameter + + + + + Bore diameter + + + + + Bolts distance + + + + + Bolts hole diameter + + + + + Thickness of flange + + + + + Nr. of bolts + + + + + Thickness of raised face + + + + + Diameter of raised face + + + + + Length of welding neck + + + + + Diameter of welding neck + + + + + Outside diameter of pipe + + + + + Major diameter + + + + + Minor diameter + + + + + Make the lenght variable + + + + + Length of reduction + + + + + Concentric or Eccentric + + + + + the radius of bending + + + + + The group. + + + + + Type of pipeFeature + + + + + Type of clamp + + + + + Size of clamp + + + + + Arc diameter + + + + + Overall height + + + + + Rod diameter + + + + + Size of thread + + + + + Ports position relative to the origin of Shape + + + + + Tank's length + + + + + Tank's width + + + + + Tank's height + + + + + Thikness of tank's shell + + + + + Thikness of tank's top + + + + + The tubes of the branch. + + + + + The curves of the branch. + + + + + The path. + + + + + App::PropertyFloat + + + + The extension of the tail + + + + + + The extension of the head + + + + + + The rotation of the section + + + + + Flow factor (m3/h/bar) + + + + + App::PropertyLength + + + + + + Width of the beam + + + + + + + + + + + Height of the beam + + + + + Thickness of the vertical sides + + + + + Thickness of the horizontal sides + + + + + Diameter of the beam + + + + + Thickness + + + + + + W of the beam + + + + + + Thickness of the webs + + + + + H of the beam + + + + + + + Thickness of the web + + + + + Thickness of the flanges + + + + + Width of the flanges + + + + + + + Thickness 1 + + + + + + + Thickness 2 + + + + + + + Thickness 3 + + + + + + Width of the bottom flange + + + + + + Width of the top flange + + + + + Outside diameter + + + + + Wall thickness + + + + + App::PropertyLink + + + the edges + + + + + the profile + + + + + The path. + + + + + The profile + + + + + App::PropertyString + + + + Type of frameFeature + + + + + Size of frame + + + + + The group. + + + + + + + + + + + + + Type of section + + + + + Type of tubeFeature + + + + + Rating of pipeFeature + + + + + Nominal diameter + + + + + App::PropertyStringList + + + The beams names + + + + + App::PropertyVectorList + + + Ports position relative to the origin of Shape + + + + + FrameBranchManager + + + FrameBranch Manager + + + + + Open FrameBranch Manager + + + + + Part::Feature + + + Simple curve + + + + + Part::FeaturePython + + + Tube + + + + + Elbow + + + + + Flange + + + + + Reduction + + + + + U-Bolt + + + + + Tank + + + + + Cap + + + + + Valve + + + + + Sketcher::SketchObject + + + pipeRoute + + + + + adjustFrameAngle + + + adjustFrameAngle + + + + + Adjust the angle of frame by two edges + + + + + alignEdge + + + Mate the edges + + + + + Join two edges: select two or pre-select several + + + + + alignFlange + + + alignFlange + + + + + Rotates the section of the beam to make the faces parallel to another face + + + + + attach2tube + + + Attach to tube + + + + + Attach one pype to the nearest port of selected pipe + + + + + breakPipe + + + Break the pipe + + + + + Break one pipe at point and insert gap + + + + + capQM + + + QM for caps + + + + + dodo + + + + Utils + + + + + frametools + + + + + pypetools + + + + + Frame tools + + + + + Pype tools + + + + + QkMenus + + + + + dpCalc + + + Pressure loss calculator + + + + + Calculate pressure loss in "pypes" using ChEDL libraries. + See __doc__ of the module for futher information. + + + + + elbowQM + + + QM for elbows + + + + + extend + + + extendTheBeam + + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + + + + extend1intersection + + + + Extends pipe to intersection + + + + + extend2intersection + + + + Extends pipes to intersection + + + + + flangeQM + + + QM for flanges + + + + + flat + + + Fit one elbow + + + + + Place the elbow between two pipes or beams + + + + + frameIt + + + Place one-beam over one-edge + + + + + Place one beam after the other over the edges + + + + + hackedL + + + draw a DWire + + + + + WP is re-positioned at each point. Possible to spin and offset it. + + + + + insertAnyz + + + Insert any shape + + + + + Insert a STEP, IGES or BREP + + + + + insertBranch + + + Insert a branch + + + + + Insert a PypeBranch + + + + + insertCap + + + + Insert a cap + + + + + insertElbow + + + + Insert a curve + + + + + insertFlange + + + + Insert a flange + + + + + insertPath + + + insert Path + + + + + Creates one path along selected edges + + + + + insertPipe + + + + Insert a tube + + + + + insertPypeLine + + + PypeLine Manager + + + + + Open PypeLine Manager + + + + + insertReduct + + + + Insert a reduction + + + + + insertRoute + + + Insert a pipe route + + + + + Create a sketch attached to a circular edge + + + + + insertSection + + + Insert sections + + + + + Creates customized beam profiles 2D + + + + + insertTank + + + Insert a tank + + + + + Create tank and nozzles + + + + + insertUbolt + + + + Insert a U-bolt + + + + + insertValve + + + + Insert a valve + + + + + joinPype + + + Join pypes + + + + + Select the part-pype and the port + + + + + laydown + + + Lay-down the pipe + + + + + Lay-down the pipe on the support plane + + + + + levelBeam + + + Flush the surfaces + + + + + Shift the beams to line-up the faces to the first selection (faces must be //) + + + + + makeHeader + + + Connect to header + + + + + Connect branches to one header pipe +Branches and header's axes must be ortho + + + + + mateEdges + + + Mate pipes edges + + + + + Mate two terminations through their edges + + + + + moveHandle + + + Move objects + + + + + Move quickly objects inside viewport + + + + + moveWorkPlane + + + align Workplane + + + + + Moves and rotates the drafting workplane with points, edges and faces + + + + + offsetWorkPlane + + + offset Workplane + + + + + Shifts the WP alongg its normal. + + + + + pipeQM + + + QM for pipes + + + + + pivotBeam + + + pivotTheBeam + + + + + Rotates the beam around an axis (edge or center-of-curvature) + + + + + point2point + + + draw a tube point-to-point + + + + + Click on subsequent points. + + + + + queryModel + + + query the model + + + + + Click objects to print infos + + + + + raiseup + + + Raise-up the support + + + + + Raise the support to the pipe + + + + + reverseBeam + + + Reverse orientation + + + + + Reverse the orientation of selected objects + + + + + rotJoin + + + rotJoinEdge + + + + + Rotates and align the beam according another edge + + + + + rotateWorkPlane + + + rotate Workplane + + + + + Spin the Draft working plane about one of its axes + + + + + selectSolids + + + Select solids + + + + + Grab all solids or those partially selected + to export in .step format + + + + + shiftBeam + + + shiftTheBeam + + + + + Translate objects by vectors defined on existing geometry + + + + + spinSect + + + Spin beams by 45 deg. + + + + + Rotates the section of the beam by 45 degrees + + + + + stretchBeam + + + stretchTheBeam + + + + + Changes the length of the beam, either according a preselected edge or a direct input + + + + + valveQM + + + QM for valves + + + + + DialogAlign + + + Align flanges + + + + + normY + + + + + YZ + + + + + (S)elect face + + + + + XZ + + + + + hotkeys: "S" to select, "X" to execute + + + + + XY + + + + + < select a target face > + + + + + Set notmal + + + + + normX + + + + + normZ + + + + + Invert normal + + + + + DialogBeamShift + + + Move + + + + + Multiple: + + + + + + 1 + + + + + + + 0 + + + + + Set dist. + + + + + Z: + + + + + Steps: + + + + + Y: + + + + + copy + + + + + X: + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogBeamStretch + + + Stretch + + + + + (S)et length + + + + + both + + + + + head + + + + + tail + + + + + New length - mm: + + + + + hotkeys: "S" to select, "X" to execute + + + + + Stretched end: + + + + + DialogDisp + + + Dialog + + + + + Angle: + + + + + SET + + + + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + + + + + Displacement: + + + + + 100 + + + + + 90 + + + + + DialogDp + + + Dp calculator + + + + + calculation + + + + + Nr. of curves = 0 + + + + + Roughness (um) + + + + + 100 + + + + + + 20 + + + + + Flow-rate (m3/h) + + + + + Total length = 0 + + + + + Scope + + + + + <on selection> + + + + + Pipe material + + + + + fluid properties + + + + + Density (kg/m3) + + + + + liquid + + + + + T (°C) + + + + + Viscosity (cP) + + + + + + 0 + + + + + gas/vapour + + + + + 1 + + + + + Name + + + + + P abs. (bar) + + + + + results + + + + + Export + + + + + *** LIQUID *** + + + + + --- + + + + + DialogExtend + + + Extend beams + + + + + < select a target > + + + + + (S)elect target + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogFBranch + + + FrameBranch Manager + + + + + <no target selected> + + + + + <degrees> + + + + + offset tail + + + + + Trim/Extend + + + + + AddBeams + + + + + Add single + + + + + ChangeProfile + + + + + <name> + + + + + <no item selected> + + + + + Redraw + + + + + offset head + + + + + RemoveBeams + + + + + Get targets + + + + + <length> + + + + + hotkeys: "S" to select, "X" to trim + + + + + DialogFillFrame + + + Fill frame + + + + + move + + + + + (S)elect + + + + + < select a beam > + + + + + copy + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogHackedLine + + + Dialog + + + + + (M)ove origin on click + + + + + (R)otate WP + + + + + (O)ffset WP + + + + + + + Align WP to principal plane + + + + + XY + + + + + XZ + + + + + YZ + + + + + DialogJoinPypes + + + Join pypes + + + + + Reset + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogProtoPipeForm + + + Dialog + + + + + Rating: + + + + + Insert + + + + + DialogRotAround + + + Rotate around axis + + + + + Z + + + + + 90 + + + + + Y + + + + + Reverse + + + + + X + + + + + <select one axis> + + + + + copy items + + + + + hotkeys: "S" to select, "X" to execute + + + + + (S)et axis + + + + + DialogRoute + + + Create pipe route + + + + + Y + + + + + X + + + + + Z + + + + + global Z + + + + + Normal to sketch: + + + + + Offset (mm): + + + + + 0 + + + + + <select an edge> + + + + + Get edge + + + + + (S)et normal + + + + + hotkeys: +"S" to select normal from geometry +"X" to execute + + + + + DialogSections + + + Beams profile editor + + + + + + 45 + + + + + D + + + + + 80 + + + + + H + + + + + B + + + + + t1 + + + + + + + 5 + + + + + t2 + + + + + t3 + + + + + <name> + + + + + NW + + + + + N + + + + + NE + + + + + W + + + + + C + + + + + E + + + + + SW + + + + + S + + + + + SE + + + + + + + + + + + + ... + + + + + Full section + + + + + Apply +dimensions + + + + + Shift +profile + + + + + DialogShapes + + + Import shapes + + + + + <shapes> + + + + + - + + + + + DialogTank + + + Dialog + + + + + Tank + + + + + Length + + + + + X + + + + + Width: + + + + + Y + + + + + Height: + + + + + Z + + + + + Nozzles + + + + + Pipe type: + + + + + + <select> + + + + + Flange type: + + + + + 200 + + + + + Add nozzle + + + + + DialogValves + + + Insert valves + + + + + Apply + + + + + Reverse + + + + + Type: + + + + diff --git a/translations/dodo_es-ES.qm b/translationz/dodo_es-ES.qm similarity index 98% rename from translations/dodo_es-ES.qm rename to translationz/dodo_es-ES.qm index e4cfed1f4fde6dcb9195737e8ab1d7b8ca3efecf..8e4ded05166fe01cf5d2a42c2d64d6a2294e1dbb 100644 GIT binary patch delta 37 tcmX@!#dxucQOagVio~h+bEckEl-ZxKaPQsa3=9mcsl~dk!5an4T>&}<4-EhS delta 27 jcmccE#dy4nQNU(Lio~h+bEckEl-ZxKaPQrXQs%Azu__G2 diff --git a/translationz/dodo_es-ES.ts b/translationz/dodo_es-ES.ts new file mode 100644 index 0000000..b2ed58d --- /dev/null +++ b/translationz/dodo_es-ES.ts @@ -0,0 +1,2093 @@ + + + + + App::Property + + + Outside diameter + Diametro exterior + + + + Wall thickness + Espesor de muro + + + + Inside diameter + Diametro interno + + + + Length of tube + Longitud del tubo + + + + Section dim. + Dimension de seccion. + + + + Bend Angle + Angulo de dobles + + + + Bend Radius + Radio de dobles + + + + Type of flange + Tipo de brida + + + + Type of tubeFeature + Tipo caracteristica de tubo + + + + Rating of pipeFeature + Relacion de caracteristicas de tubo + + + + Nominal diameter + Diametro nominal + + + + Flow factor (m3/h/bar) + Factor de flujo (m3/h/bar) + + + + Flange diameter + Diametro de brida + + + + Bore diameter + Diametro de orificio + + + + Bolts distance + Distancia de tornillos + + + + Bolts hole diameter + Diametro de orificio para tornillo + + + + Thickness of flange + Espesor de brida + + + + Nr. of bolts + Numero de tornillos + + + + Thickness of raised face + Espesor de cara elevada + + + + Diameter of raised face + Diametro de cara elevada + + + + Length of welding neck + Longitud de cuello para soldadura + + + + Diameter of welding neck + Diametro de cuello para soldadura + + + + Outside diameter of pipe + Diametro exterior de tuberia + + + + Major diameter + Diametro mayor + + + + Minor diameter + Diametro menor + + + + Make the lenght variable + Hace la longitud variable + + + + Length of reduction + Longitud de reducción + + + + Concentric or Eccentric + Concentrico o excentrico + + + + the radius of bending + El radio de dobles + + + + The group. + El grupo. + + + + Type of pipeFeature + Tipo de caracteristica de tubo + + + + Type of clamp + Tipo de sujeccion + + + + Size of clamp + Tamaño de sujeccion + + + + Arc diameter + Diametro de arco + + + + Overall height + Altura total + + + + Rod diameter + Diametro de vastago + + + + Size of thread + Tamaño de rosca + + + + Ports position relative to the origin of Shape + Posicion de los puertos relativos al origen de la forma + + + + Tank's length + Longitud de deposito + + + + Tank's width + Ancho de deposito + + + + Tank's height + Altura de deposito + + + + Thikness of tank's shell + Espesor de carcaza del deposito + + + + Thikness of tank's top + Espesor superior del deposito + + + + The tubes of the branch. + Tubos de la derivación. + + + + The curves of the branch. + Las curvas de la derivacion. + + + + The path. + La ruta. + + + + App::PropertyFloat + + + + The extension of the tail + + + + + + The extension of the head + + + + + + The rotation of the section + + + + + Flow factor (m3/h/bar) + + + + + App::PropertyLength + + + + + + Width of the beam + + + + + + + + + + + Height of the beam + + + + + Thickness of the vertical sides + + + + + Thickness of the horizontal sides + + + + + Diameter of the beam + + + + + Thickness + + + + + + W of the beam + + + + + + Thickness of the webs + + + + + H of the beam + + + + + + + Thickness of the web + + + + + Thickness of the flanges + + + + + Width of the flanges + + + + + + + Thickness 1 + + + + + + + Thickness 2 + + + + + + + Thickness 3 + + + + + + Width of the bottom flange + + + + + + Width of the top flange + + + + + Outside diameter + + + + + Wall thickness + + + + + App::PropertyLink + + + the edges + + + + + the profile + + + + + The path. + + + + + The profile + + + + + App::PropertyString + + + + Type of frameFeature + + + + + Size of frame + + + + + The group. + + + + + + + + + + + + + Type of section + + + + + Type of tubeFeature + + + + + Rating of pipeFeature + + + + + Nominal diameter + + + + + App::PropertyStringList + + + The beams names + + + + + App::PropertyVectorList + + + Ports position relative to the origin of Shape + + + + + FrameBranchManager + + + FrameBranch Manager + Derivacion de gestor de marcos + + + + Open FrameBranch Manager + Abre gestor de marcos + + + + Part::Feature + + + CurvaSemplice + Curva simple + + + + Simple curve + Curva simple + + + + Tube + Tubo + + + + Part::FeaturePython + + + Tube + Tubo + + + + Elbow + Codo + + + + Flange + Brida + + + + Reduction + Reduccion + + + + U-Bolt + Tornillo U + + + + Tank + Deposito + + + + Cap + Tapon + + + + Valve + Valvula + + + + Sketcher::SketchObject + + + pipeRoute + Rutatuberia + + + + adjustFrameAngle + + + adjustFrameAngle + Adjuste de angulo de marcos + + + + Adjust the angle of frame by two edges + Ajusta del angulo del marco por medio de dos aristas + + + + alignEdge + + + Mate the edges + Coindicir las aristas + + + + Join two edges: select two or pre-select several + Une dos aristas:selecciona dos o pre selecciona varias + + + + alignFlange + + + alignFlange + Alinear superficies + + + + Rotates the section of the beam to make the faces parallel to another face + Rota la seccion de la viga para hacer las caras paralelas a otra cara + + + + attach2tube + + + Attach to tube + Ligado al tubo + + + + Attach one pype to the nearest port of selected pipe + Liga un tipo de tuberia al puerto mas cercano de la tuberia seleccionada + + + + breakPipe + + + Break the pipe + Rompe la tuberia + + + + Break one pipe at point and insert gap + Dividir un tubo al punto e insertar un espacio + + + + capQM + + + QM for caps + QM para tapones + + + + dodo + + + Utils + Utilerias + + + + frametools + Herramientas estructurales + + + + pypetools + Herramientas de tuberia + + + + Frame tools + Herramientas para estructuras + + + + Pype tools + Herramientas para tuberias + + + + QkMenus + Menus QK + + + + dpCalc + + + Pressure loss calculator + Calculadora de Perdida de presion + + + + Calculate pressure loss in "pypes" using ChEDL libraries. + See __doc__ of the module for futher information. + Calcular perdida de presión en tuberias utilizando biblioteca ChEDL. + Revisar __doc__ del modulo para mayor información. + + + + elbowQM + + + QM for elbows + QM para codos + + + + extend + + + extendTheBeam + Extender la viga + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Extiende la viga a sea hacia una cara, vertice o C.O.M del objeto seleccionado + + + + extend1intersection + + + Extends pipe to intersection + Extiende tubo a la insercción + + + + extend2intersection + + + Extends pipes to intersection + Extiende tubos a la interseccion + + + + flangeQM + + + QM for flanges + QM para bridas + + + + flat + + + Fit one elbow + Colocar un codo + + + + Place the elbow between two pipes or beams + Colocar un codo entre 2 tuberias o vigas + + + + frameIt + + + Place one-beam over one-edge + Coloca una viga sobre una arista + + + + Place one beam after the other over the edges + Coloca una viga despues de las otras aristas + + + + hackedL + + + draw a DWire + Dibuja un Dwire + + + + WP is re-positioned at each point. Possible to spin and offset it. + Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. + + + + insertAnyz + + + Insert any shape + Insertar cualquier forma + + + + Insert a STEP, IGES or BREP + Insertar un solido STEP, IGES, BREP + + + + insertBranch + + + Insert a branch + Insertar una derivación + + + + Insert a PypeBranch + Insertar una derivacion de tuberia + + + + insertCap + + + Insert a cap + Insertar un tapon + + + + insertElbow + + + Insert a curve + Insertar una curva + + + + insertFlange + + + Insert a flange + Insertar una brida + + + + insertPath + + + insert Path + Insertar trayectoria + + + + Creates one path along selected edges + Crea una trayectoria a lo largo de la arista seleccionada + + + + insertPipe + + + Insert a tube + Insertar un tubo + + + + insertPypeLine + + + PypeLine Manager + Gestor de tuberia de linea + + + + Open PypeLine Manager + Abre gestor de tuberia de linea + + + + insertReduct + + + Insert a reduction + Insertar una reducción + + + + insertRoute + + + Insert a pipe route + Insertar una ruta de tuberia + + + + Create a sketch attached to a circular edge + Crea un boceto adjunta a una aristar circular + + + + insertSection + + + Insert sections + Inserta secciones + + + + Creates customized beam profiles 2D + Crea un perfil de viga 2D personalizado + + + + insertTank + + + Insert a tank + Inserta un deposito + + + + Create tank and nozzles + Crea un deposito y boquillas + + + + insertUbolt + + + Insert a U-bolt + Insertar un tornillo U + + + + insertValve + + + Insert a valve + Insertar una valvula + + + + joinPype + + + Join pypes + Unir tuberias + + + + Select the part-pype and the port + Selecciona la pieza de tuberia y el puerto + + + + laydown + + + Lay-down the pipe + Empotra la tuberia + + + + Lay-down the pipe on the support plane + Empotra la tuberia sobre el plano de soporte + + + + levelBeam + + + Flush the surfaces + Empotrar las superficies + + + + Shift the beams to line-up the faces to the first selection (faces must be //) + Desplaza la viga para alinearla a la cara de la primera seleccion (caras deben ser paralelas) + + + + makeHeader + + + Connect to header + + + + + Connect branches to one header pipe +Branches and header's axes must be ortho + + + + + mateEdges + + + Mate pipes edges + Coincidir las aristas de las tuberias + + + + Mate two terminations through their edges + Coincidir dos terminaciones a traves de sus aristas + + + + moveHandle + + + Move objects + Mover objetos + + + + Move quickly objects inside viewport + Mover objetos rapidamente dentro de la vista + + + + moveWorkPlane + + + align Workplane + Alinear plano de trabajo + + + + Moves and rotates the drafting workplane with points, edges and faces + Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras + + + + offsetWorkPlane + + + offset Workplane + Desfazar plano de trabajo + + + + Shifts the WP alongg its normal. + Desplaza el plano de trabajo a lo largo de su normal. + + + + pipeQM + + + QM for pipes + QM para tuberias + + + + pivotBeam + + + pivotTheBeam + Pivotea la viga + + + + Rotates the beam around an axis (edge or center-of-curvature) + Rota la viga alrededor de un eje (arista o centro de curvatura) + + + + point2point + + + draw a tube point-to-point + Dibuja un tubo de punto a punto + + + + Click on subsequent points. + Da clic en puntos subsecuentes. + + + + queryModel + + + query the model + Consultar el modelo + + + + Click objects to print infos + Cliquear objetos para imprimir información + + + + raiseup + + + Raise-up the support + Eleva el soporte + + + + Raise the support to the pipe + Eleva el soporte hacia la tuberia + + + + reverseBeam + + + Reverse orientation + Invertir orientacion + + + + Reverse the orientation of selected objects + Invertir orientacion a los objetos seleccionados + + + + rotJoin + + + rotJoinEdge + Rotar arista de union + + + + Rotates and align the beam according another edge + Rota y alinea la viga acorde a otra arista + + + + rotateWorkPlane + + + rotate Workplane + Rota el plano de trabajo + + + + Spin the Draft working plane about one of its axes + Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes + + + + selectSolids + + + Select solids + Seleccionar solidos + + + + Grab all solids or those partially selected + to export in .step format + Sujeta todos los solidos parcialmente seleccionados +para exportar en formato step + + + + shiftBeam + + + shiftTheBeam + Desplaza la viga + + + + Translate objects by vectors defined on existing geometry + Traslada el objeto por vectores definidos sobre la geometria existente + + + + spinSect + + + Spin beams by 45 deg. + Gira viga a 45 grados. + + + + Rotates the section of the beam by 45 degrees + Rota la seccion de la viga a 45 grados + + + + stretchBeam + + + stretchTheBeam + Estira la viga + + + + Changes the length of the beam, either according a preselected edge or a direct input + Cambia la longituf de la viga, ya sea acorde a la arista preseleccionada o una entrada directa + + + + valveQM + + + QM for valves + QM para valvulas + + + + DialogAlign + + + Align flanges + + + + + normY + + + + + YZ + + + + + (S)elect face + + + + + XZ + + + + + hotkeys: "S" to select, "X" to execute + + + + + XY + + + + + < select a target face > + + + + + Set notmal + + + + + normX + + + + + normZ + + + + + Invert normal + + + + + DialogBeamShift + + + Move + + + + + Multiple: + + + + + + 1 + + + + + + + 0 + + + + + Set dist. + + + + + Z: + + + + + Steps: + + + + + Y: + + + + + copy + + + + + X: + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogBeamStretch + + + Stretch + + + + + (S)et length + + + + + both + + + + + head + + + + + tail + + + + + New length - mm: + + + + + hotkeys: "S" to select, "X" to execute + + + + + Stretched end: + + + + + DialogDisp + + + Dialog + + + + + Angle: + + + + + SET + + + + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + + + + + Displacement: + + + + + 100 + + + + + 90 + + + + + DialogDp + + + Dp calculator + + + + + calculation + + + + + Nr. of curves = 0 + + + + + Roughness (um) + + + + + 100 + + + + + + 20 + + + + + Flow-rate (m3/h) + + + + + Total length = 0 + + + + + Scope + + + + + <on selection> + + + + + Pipe material + + + + + fluid properties + + + + + Density (kg/m3) + + + + + liquid + + + + + T (°C) + + + + + Viscosity (cP) + + + + + + 0 + + + + + gas/vapour + + + + + 1 + + + + + Name + + + + + P abs. (bar) + + + + + results + + + + + Export + + + + + *** LIQUID *** + + + + + --- + + + + + DialogExtend + + + Extend beams + + + + + < select a target > + + + + + (S)elect target + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogFBranch + + + FrameBranch Manager + + + + + <no target selected> + + + + + <degrees> + + + + + offset tail + + + + + Trim/Extend + + + + + AddBeams + + + + + Add single + + + + + ChangeProfile + + + + + <name> + + + + + <no item selected> + + + + + Redraw + + + + + offset head + + + + + RemoveBeams + + + + + Get targets + + + + + <length> + + + + + hotkeys: "S" to select, "X" to trim + + + + + DialogFillFrame + + + Fill frame + + + + + move + + + + + (S)elect + + + + + < select a beam > + + + + + copy + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogHackedLine + + + Dialog + + + + + (M)ove origin on click + + + + + (R)otate WP + + + + + (O)ffset WP + + + + + + + Align WP to principal plane + + + + + XY + + + + + XZ + + + + + YZ + + + + + DialogJoinPypes + + + Join pypes + + + + + Reset + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogProtoPipeForm + + + Dialog + + + + + Rating: + + + + + Insert + + + + + DialogRotAround + + + Rotate around axis + + + + + Z + + + + + 90 + + + + + Y + + + + + Reverse + + + + + X + + + + + <select one axis> + + + + + copy items + + + + + hotkeys: "S" to select, "X" to execute + + + + + (S)et axis + + + + + DialogRoute + + + Create pipe route + + + + + Y + + + + + X + + + + + Z + + + + + global Z + + + + + Normal to sketch: + + + + + Offset (mm): + + + + + 0 + + + + + <select an edge> + + + + + Get edge + + + + + (S)et normal + + + + + hotkeys: +"S" to select normal from geometry +"X" to execute + + + + + DialogSections + + + Beams profile editor + + + + + + 45 + + + + + D + + + + + 80 + + + + + H + + + + + B + + + + + t1 + + + + + + + 5 + + + + + t2 + + + + + t3 + + + + + <name> + + + + + NW + + + + + N + + + + + NE + + + + + W + + + + + C + + + + + E + + + + + SW + + + + + S + + + + + SE + + + + + + + + + + + + ... + + + + + Full section + + + + + Apply +dimensions + + + + + Shift +profile + + + + + DialogShapes + + + Import shapes + + + + + <shapes> + + + + + - + + + + + DialogTank + + + Dialog + + + + + Tank + + + + + Length + + + + + X + + + + + Width: + + + + + Y + + + + + Height: + + + + + Z + + + + + Nozzles + + + + + Pipe type: + + + + + + <select> + + + + + Flange type: + + + + + 200 + + + + + Add nozzle + + + + + DialogValves + + + Insert valves + + + + + Apply + + + + + Reverse + + + + + Type: + + + + diff --git a/translationz/update_translation.sh b/translationz/update_translation.sh new file mode 100755 index 0000000..07765c8 --- /dev/null +++ b/translationz/update_translation.sh @@ -0,0 +1,167 @@ +#!/usr/bin/env bash + +# -------------------------------------------------------------------------------------------------- +# +# Create, update and release translation files. +# +# Supported locales on FreeCAD <2024-03-13, FreeCADGui.supportedLocales(), total=43>: +# {'English': 'en', 'Afrikaans': 'af', 'Arabic': 'ar', 'Basque': 'eu', 'Belarusian': 'be', +# 'Bulgarian': 'bg', 'Catalan': 'ca', 'Chinese Simplified': 'zh-CN', +# 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr', 'Czech': 'cs', 'Dutch': 'nl', +# 'Filipino': 'fil', 'Finnish': 'fi', 'French': 'fr', 'Galician': 'gl', 'Georgian': 'ka', +# 'German': 'de', 'Greek': 'el', 'Hungarian': 'hu', 'Indonesian': 'id', 'Italian': 'it', +# 'Japanese': 'ja', 'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', 'Norwegian': 'no', +# 'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR', 'Romanian': 'ro', +# 'Russian': 'ru', 'Serbian': 'sr', 'Serbian, Latin': 'sr-CS', 'Slovak': 'sk', +# 'Slovenian': 'sl', 'Spanish': 'es-ES', 'Spanish, Argentina': 'es-AR', 'Swedish': 'sv-SE', +# 'Turkish': 'tr', 'Ukrainian': 'uk', 'Valencian': 'val-ES', 'Vietnamese': 'vi'} +# +# NOTE: PREPARATION +# - Install Qt tools +# Debian-based (e.g., Ubuntu): $ sudo apt-get install qttools5-dev-tools pyqt6-dev-tools +# Fedora-based: $ sudo dnf install qt6-linguist qt6-devel +# Arch-based: $ sudo pacman -S qt6-tools python-pyqt6 +# - Make the script executable +# $ chmod +x update_translation.sh +# - The script has to be executed within the `translationz` directory. +# Executing the script with no flags involes the help. +# $ ./update_translation.sh +# +# NOTE: WORKFLOW TRANSLATOR (LOCAL) +# - Execute the script passing the `-u` flag plus locale code as argument +# Only update the file(s) you're translating! +# $ ./update_translation.sh -u es-ES +# - Do the translation via Qt Linguist and use `File>Release` +# - If releasing with the script execute it passing the `-r` flag +# plus locale code as argument +# $ ./update_translation.sh -r es-ES +# +# NOTE: WORKFLOW MAINTAINER (CROWDIN) +# - Execute the script passing the '-U' flag +# $ ./update_translation.sh -U +# - Upload the updated file to Crowdin and wait for translators do their thing ;-) +# - Once done, download the translated files, copy them to `translationz` +# and release all the files to update the changes +# $ ./update_translation.sh -R +# +# The usage of `pylupdate6` is preferred over 'pylupdate5' when extracting text strings from +# Python files. Also using `lupdate` from Qt6 is possible. +# +# -------------------------------------------------------------------------------------------------- + +supported_locales=( + "en" "af" "ar" "eu" "be" "bg" "ca" "zh-CN" "zh-TW" "hr" + "cs" "nl" "fil" "fi" "fr" "gl" "ka" "de" "el" "hu" + "id" "it" "ja" "kab" "ko" "lt" "no" "pl" "pt-PT" "pt-BR" + "ro" "ru" "sr" "sr-CS" "sk" "sl" "es-ES" "es-AR" "sv-SE" "tr" + "uk" "val-ES" "vi" +) + +is_locale_supported() { + local locale="$1" + for supported_locale in "${supported_locales[@]}"; do + if [[ "$supported_locale" == "$locale" ]]; then + return 0 + fi + done + return 1 +} + +get_strings() { + # Get translatable strings from Qt Designer files + lupdate ../dialogz/*.ui -ts uifiles.ts -no-obsolete + # Get translatable strings from Python file(s) + # pylupdate5 -verbose ../*.py -ts pyfiles.ts + pylupdate6 ../*.py -ts pyfiles.ts + # Join strings from Qt Designer and Python files into a single temp file + lconvert -i pyfiles.ts uifiles.ts -o _${WB}.ts +} + +update_locale() { + local locale="$1" + local u=${locale:+_} # Conditional underscore + + # NOTE: Execute the right commands depending on: + # - if the file already exists and + # - if it's a locale file or the main, agnostic one + if [ ! -f "${WB}${u}${locale}.ts" ]; then + echo -e "\033[1;34m\n\t<<< Creating '${WB}${u}${locale}.ts' file >>>\n\033[m" + get_strings + if [ "$locale" == "" ]; then + lconvert -i _${WB}.ts -o ${WB}.ts + else + lconvert -source-language en -target-language $locale \ + -i _${WB}.ts -o ${WB}_${locale}.ts + fi + else + echo -e "\033[1;34m\n\t<<< Updating '${WB}${u}${locale}.ts' file >>>\n\033[m" + get_strings + if [ "$locale" == "" ]; then + lconvert -i _${WB}.ts ${WB}.ts -o ${WB}.ts + else + lconvert -source-language en -target-language $locale \ + -i _${WB}.ts ${WB}_${locale}.ts -o ${WB}_${locale}.ts + fi + fi + + # Delete files that are no longer needed + rm pyfiles.ts + rm uifiles.ts + rm -f _${WB}.ts +} + +release_locale() { + # Release locale (creation of *.qm file from *.ts file) + local locale="$1" + lrelease ${WB}_${locale}.ts +} + +help() { + echo -e "\nDescription:" + echo -e "\tCreate, update and release translation files." + echo -e "\nUsage:" + echo -e "\t./update_translation.sh [-R] [-U] [-r ] [-u ]" + echo -e "\nFlags:" + echo -e " -R\n\tRelease all locales" + echo -e " -U\n\tUpdate main translation file (locale agnostic)" + echo -e " -r \n\tRelease the specified locale" + echo -e " -u \n\tUpdate strings for the specified locale" +} + +# Main function ------------------------------------------------------------------------------------ + +WB="dodo" + +if [ $# -eq 0 ]; then + help +elif [ $# -eq 1 ]; then + if [ "$1" == "-R" ]; then + find . -type f -name '*_*.ts' | while IFS= read -r file; do + # Release all locales + lrelease $file + echo + done + elif [ "$1" == "-U" ]; then + # Update main file (agnostic) + update_locale + else + help + fi +elif [ $# -eq 2 ]; then + LOCALE="$2" + if is_locale_supported "$LOCALE"; then + if [ "$1" == "-r" ]; then + # Release locale + release_locale "$LOCALE" + elif [ "$1" == "-u" ]; then + # Update main & locale files + update_locale + update_locale "$LOCALE" + fi + else + echo "Verify your language code. Case sensitive." + echo "If it's correct ask a maintainer to add support for your language on FreeCAD." + fi +else + help +fi From 7e600d9bdefb70537ea5347959364408f5b52498 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Mon, 11 Mar 2024 14:33:52 -0600 Subject: [PATCH 018/135] Rename classes' names It's needed for at the time of extracting the strings for translation the strings are separated by context making easier translation process. --- dialogz/align.ui | 2 +- dialogz/beamshift.ui | 2 +- dialogz/beamstretch.ui | 2 +- dialogz/disp.ui | 2 +- dialogz/dp.ui | 2 +- dialogz/extend.ui | 2 +- dialogz/fbranch.ui | 2 +- dialogz/fillframe.ui | 2 +- dialogz/hackedline.ui | 2 +- dialogz/joinPypes.ui | 2 +- dialogz/protoPypeForm.ui | 2 +- dialogz/rotAround.ui | 2 +- dialogz/route.ui | 2 +- dialogz/sections.ui | 2 +- dialogz/shapes.ui | 2 +- dialogz/tank.ui | 2 +- dialogz/valves.ui | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/dialogz/align.ui b/dialogz/align.ui index 959dc10..140a38c 100644 --- a/dialogz/align.ui +++ b/dialogz/align.ui @@ -1,6 +1,6 @@ - Dialog + DialogAlign diff --git a/dialogz/beamshift.ui b/dialogz/beamshift.ui index ea46432..51a5cb6 100644 --- a/dialogz/beamshift.ui +++ b/dialogz/beamshift.ui @@ -1,6 +1,6 @@ - Dialog + DialogBeamShift diff --git a/dialogz/beamstretch.ui b/dialogz/beamstretch.ui index d182a69..c40367d 100644 --- a/dialogz/beamstretch.ui +++ b/dialogz/beamstretch.ui @@ -1,6 +1,6 @@ - Dialog + DialogBeamStretch diff --git a/dialogz/disp.ui b/dialogz/disp.ui index ad18e16..6c002d7 100644 --- a/dialogz/disp.ui +++ b/dialogz/disp.ui @@ -1,6 +1,6 @@ - Dialog + DialogDisp diff --git a/dialogz/dp.ui b/dialogz/dp.ui index fb48eb4..798b309 100644 --- a/dialogz/dp.ui +++ b/dialogz/dp.ui @@ -1,6 +1,6 @@ - Dialog + DialogDp diff --git a/dialogz/extend.ui b/dialogz/extend.ui index e24793e..4a90efb 100644 --- a/dialogz/extend.ui +++ b/dialogz/extend.ui @@ -1,6 +1,6 @@ - Dialog + DialogExtend diff --git a/dialogz/fbranch.ui b/dialogz/fbranch.ui index 9c25edd..36665ca 100644 --- a/dialogz/fbranch.ui +++ b/dialogz/fbranch.ui @@ -1,6 +1,6 @@ - Dialog + DialogFBranch diff --git a/dialogz/fillframe.ui b/dialogz/fillframe.ui index a031941..30478bf 100644 --- a/dialogz/fillframe.ui +++ b/dialogz/fillframe.ui @@ -1,6 +1,6 @@ - Dialog + DialogFillFrame diff --git a/dialogz/hackedline.ui b/dialogz/hackedline.ui index f57802b..95a90f1 100644 --- a/dialogz/hackedline.ui +++ b/dialogz/hackedline.ui @@ -1,6 +1,6 @@ - Dialog + DialogHackedLine diff --git a/dialogz/joinPypes.ui b/dialogz/joinPypes.ui index 1fd0639..445c6f9 100644 --- a/dialogz/joinPypes.ui +++ b/dialogz/joinPypes.ui @@ -1,6 +1,6 @@ - Dialog + DialogJoinPypes diff --git a/dialogz/protoPypeForm.ui b/dialogz/protoPypeForm.ui index bb98e4a..6d8615b 100644 --- a/dialogz/protoPypeForm.ui +++ b/dialogz/protoPypeForm.ui @@ -1,6 +1,6 @@ - Dialog + DialogProtoPipeForm diff --git a/dialogz/rotAround.ui b/dialogz/rotAround.ui index 6ffb9b5..adbbedd 100644 --- a/dialogz/rotAround.ui +++ b/dialogz/rotAround.ui @@ -1,6 +1,6 @@ - Dialog + DialogRotAround diff --git a/dialogz/route.ui b/dialogz/route.ui index 6b4ad99..a6a9f48 100644 --- a/dialogz/route.ui +++ b/dialogz/route.ui @@ -1,6 +1,6 @@ - Dialog + DialogRoute diff --git a/dialogz/sections.ui b/dialogz/sections.ui index 0a73775..a09fa14 100644 --- a/dialogz/sections.ui +++ b/dialogz/sections.ui @@ -1,6 +1,6 @@ - Dialog + DialogSections diff --git a/dialogz/shapes.ui b/dialogz/shapes.ui index cde96dd..ee03106 100644 --- a/dialogz/shapes.ui +++ b/dialogz/shapes.ui @@ -1,6 +1,6 @@ - Dialog + DialogShapes diff --git a/dialogz/tank.ui b/dialogz/tank.ui index 7c89eb9..360fd5a 100644 --- a/dialogz/tank.ui +++ b/dialogz/tank.ui @@ -1,6 +1,6 @@ - Dialog + DialogTank diff --git a/dialogz/valves.ui b/dialogz/valves.ui index 1f71272..ede5356 100644 --- a/dialogz/valves.ui +++ b/dialogz/valves.ui @@ -1,6 +1,6 @@ - Dialog + DialogValves From f8094ea4b26a71dde9cd5c3e21a885bd2ee20555 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 14 Mar 2024 15:14:05 -0600 Subject: [PATCH 019/135] WIP: Mark missing strings for translation - makeHeader() MenuText & ToolTip - Dialogs - Transactions (undo/redo) - Tree View Labels - Observers messages --- CPipe.py | 5 ++++- CUtils.py | 4 ++-- fFeatures.py | 2 +- fForms.py | 23 ++++++++++++----------- fObservers.py | 29 +++++++++++++++-------------- pForms.py | 3 ++- uCmd.py | 5 +++-- uForms.py | 33 +++++++++++++++++---------------- 8 files changed, 56 insertions(+), 48 deletions(-) diff --git a/CPipe.py b/CPipe.py index 7584c51..d26bc56 100644 --- a/CPipe.py +++ b/CPipe.py @@ -313,7 +313,10 @@ def Activated (self): FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","header.svg"),'MenuText':'Connect to header','ToolTip':'Connect branches to one header pipe\nBranches and header\'s axes must be ortho'} + return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), + "iconz","header.svg"), + 'MenuText':QT_TRANSLATE_NOOP('makeHeader', 'Connect to header'), + 'ToolTip':QT_TRANSLATE_NOOP('makeHeader', 'Connect branches to one header pipe\nBranches and header\'s axes must be ortho')} #--------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager diff --git a/CUtils.py b/CUtils.py index 7cd458b..96111eb 100644 --- a/CUtils.py +++ b/CUtils.py @@ -5,7 +5,6 @@ # import FreeCAD modules import FreeCAD, FreeCADGui,inspect , os from PySide.QtCore import QT_TRANSLATE_NOOP -from DraftGui import translate # helper ------------------------------------------------------------------- # FreeCAD TemplatePyMod module @@ -85,7 +84,8 @@ def Activated(self): sc=[float(x*s) for x in [1,1,.2]] arrow =uCmd.arrow(FreeCAD.DraftWorkingPlane.getPlacement(),scale=sc,offset=s) from PySide.QtGui import QInputDialog as qid - offset=qid.getInt(None,'Offset Work Plane','Offset: ') + from DraftGui import translate + offset=qid.getInt(None, translate('offsetWorkPlane','Offset Work Plane'), translate('offsetWorkPlane','Offset: ')) if offset[1]>0: uCmd.offsetWP(offset[0]) #FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(arrow.node) diff --git a/fFeatures.py b/fFeatures.py index b8ce93f..e94386a 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -745,7 +745,7 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings if FreeCAD.GuiUp: # import FreeCADGui # from PySide import QtCore, QtGui - from DraftTools import translate + from DraftGui import translate from PySide.QtCore import QT_TRANSLATE_NOOP else: # \cond diff --git a/fForms.py b/fForms.py index 2e8bc57..2579499 100644 --- a/fForms.py +++ b/fForms.py @@ -6,6 +6,7 @@ import fCmd, dodoDialogs from PySide.QtCore import * from PySide.QtGui import * +from DraftGui import translate from os.path import join, dirname, abspath from sys import platform from uCmd import label3D @@ -402,35 +403,35 @@ def setProfile(self, typeS): if typeS=='square': self.form.labImg.setPixmap(pixSquare) self.type="R" - self.label="Square" + self.label=translate("profEdit", "Square", "Profile name in the Tree View") elif typeS=='T': self.form.labImg.setPixmap(pixT) self.type="T" - self.label="T-profile" + self.label=translate("profEdit", "T-profile", "Profile name in the Tree View") elif typeS=='U': self.form.labImg.setPixmap(pixU) self.type="U" - self.label="U-profile" + self.label=translate("profEdit", "U-profile", "Profile name in the Tree View") elif typeS=='H': self.form.labImg.setPixmap(pixH) self.type="H" - self.label="H-profile" + self.label=translate("profEdit", "H-profile", "Profile name in the Tree View") elif typeS=='L': self.form.labImg.setPixmap(pixL) self.type="L" - self.label="L-profile" + self.label=translate("profEdit", "L-profile", "Profile name in the Tree View") elif typeS=='Z': self.form.labImg.setPixmap(pixZ) self.type="Z" - self.label="Z-profile" + self.label=translate("profEdit", "Z-profile", "Profile name in the Tree View") elif typeS=='omega': self.form.labImg.setPixmap(pixOmega) self.type="omega" - self.label="Omega-profile" + self.label=translate("profEdit", "Omega-profile", "Profile name in the Tree View") elif typeS=='circle': self.form.labImg.setPixmap(pixCircle) self.type="circle" - self.label="Circle-profile" + self.label=translate("profEdit", "Circle-profile", "Profile name in the Tree View") def accept(self): D, H, B, t1, t2, t3 = float(self.form.editD.text()),\ float(self.form.editH.text()),\ @@ -441,7 +442,7 @@ def accept(self): if not self.form.lineEdit.text(): label=self.label else: label= self.form.lineEdit.text() if FreeCAD.ActiveDocument: - FreeCAD.activeDocument().openTransaction('Insert profile') + FreeCAD.activeDocument().openTransaction(translate("profEdit", "Insert profile", "Transaction, used on undo/redo lists")) if self.type=='R': if not self.form.cbFull.isChecked() and t21: sel=FreeCADGui.Selection.getSelection() beam=sel[len(sel)-1] - FreeCAD.activeDocument().openTransaction('joinTheBeamsEdges') + FreeCAD.activeDocument().openTransaction(translate("fObservers", "joinTheBeamsEdges", "Transaction")) fCmd.joinTheBeamsEdges(beam,self.edges[0],self.edges[1]) FreeCAD.activeDocument().commitTransaction() FreeCAD.Console.PrintMessage('Done.\n') @@ -113,7 +114,7 @@ def addSelection(self,doc,obj,sub,pnt): class stretchBeamObserver(frameObserverPrototype): #OBSOLETE: replaced with dialog def __init__(self): - super(stretchBeamObserver,self).__init__('Select the beam and input the length') + super(stretchBeamObserver,self).__init__(translate("fObservers", "Select the beam and input the length")) self.beam=None def addSelection(self,doc,obj,sub,pnt): Obj=FreeCAD.getDocument(doc).getObject(obj) @@ -130,7 +131,7 @@ def addSelection(self,doc,obj,sub,pnt): class extendObserver(frameObserverPrototype): #OBSOLETE: replaced with dialog def __init__(self): - super(extendObserver,self).__init__('First Select the target shape, then the beams to extend.') + super(extendObserver,self).__init__(translate("fObservers", "First Select the target shape, then the beams to extend.")) self.target=None def addSelection(self,doc,obj,sub,pnt): lastSel=FreeCAD.getDocument(doc).getObject(obj) @@ -143,7 +144,7 @@ def addSelection(self,doc,obj,sub,pnt): class adjustAngleObserver(frameObserverPrototype): def __init__(self): - super(adjustAngleObserver,self).__init__('Select 2 edges') + super(adjustAngleObserver,self).__init__(translate("fObservers", "Select 2 edges")) self.edges=[] self.beams=[] def addSelection(self,doc,obj,sub,pnt): @@ -156,7 +157,7 @@ def addSelection(self,doc,obj,sub,pnt): if (len(self.edges)==len(self.beams)==2): if fCmd.isOrtho(*self.edges): self.beams.reverse() - FreeCAD.ActiveDocument.openTransaction('Adjust angle') + FreeCAD.ActiveDocument.openTransaction(translate("fObservers", "Adjust angle", "Transaction")) for i in range(len(self.edges)): fCmd.extendTheBeam(self.beams[i],self.edges[i]) FreeCAD.ActiveDocument.commitTransaction() @@ -171,7 +172,7 @@ def addSelection(self,doc,obj,sub,pnt): class rotjoinObserver(frameObserverPrototype): # OBSOLETE def __init__(self): - super(rotjoinObserver,self).__init__('Select 2 edges =>[Ctrl]+select') + super(rotjoinObserver,self).__init__(translate("fObservers", "Select 2 edges =>[Ctrl]+select")) self.edges=[] def addSelection(self,doc,obj,sub,pnt): lastSel=FreeCAD.getDocument(doc).getObject(obj) @@ -181,7 +182,7 @@ def addSelection(self,doc,obj,sub,pnt): FreeCAD.Console.PrintMessage('Edge'+str(len(self.edges))+' OK.\n') if len(self.edges)==2: try: - FreeCAD.activeDocument().openTransaction('rotJoin') + FreeCAD.activeDocument().openTransaction(translate("fObservers", "rotJoin", "Transaction")) fCmd.rotjoinTheBeam() FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() diff --git a/pForms.py b/pForms.py index 012431d..699ceb3 100644 --- a/pForms.py +++ b/pForms.py @@ -11,6 +11,7 @@ from PySide.QtGui import * from math import degrees from DraftVecUtils import rounded +from DraftGui import translate mw=FreeCADGui.getMainWindow() x=mw.x()+int(mw.width()/20)#100 @@ -1113,7 +1114,7 @@ def offsetWP(self): s=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") sc=[float(x*s) for x in [1,1,.2]] varrow =uCmd.arrow(FreeCAD.DraftWorkingPlane.getPlacement(),scale=sc,offset=s) - offset=QInputDialog.getInt(None,'Offset Work Plane','Offset: ') + offset=QInputDialog.getInt(None, translate("pForms", "Offset Work Plane"), translate("pForms", "Offset: ")) if offset[1]: uCmd.offsetWP(offset[0]) FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(varrow.node) diff --git a/uCmd.py b/uCmd.py index 1166d57..310450f 100644 --- a/uCmd.py +++ b/uCmd.py @@ -5,6 +5,7 @@ import FreeCAD, FreeCADGui, fCmd, dodoDialogs from os.path import join, dirname, abspath +from DraftGui import translate from pivy import coin def setWP(): #TARGET [working]: deal with App::Parts @@ -157,7 +158,7 @@ def __init__(self, edit, edit2, pl=None, direct=None, M=100.0, objs=None): # draw arrow super(arrow_move,self).__init__(pl=pl, scale=[M/2,M/2,M/10], offset=M/2) def pickAction(self,path=None,event=None,arg=None): - FreeCAD.activeDocument().openTransaction('Quick move') + FreeCAD.activeDocument().openTransaction(translate("uCmd", "Quick move", "Transaction")) if event.wasCtrlDown(): k=-1*float(self.edit.text()) else: k=1*float(self.edit.text()) sel=FreeCADGui.Selection.getSelection() @@ -283,7 +284,7 @@ def offsetWP(self): s=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") sc=[float(x*s) for x in [1,1,.2]] varrow =arrow(FreeCAD.DraftWorkingPlane.getPlacement(),scale=sc,offset=s) - offset=QInputDialog.getInt(None,'Offset Work Plane','Offset: ') + offset=QInputDialog.getInt(None, translate("uCmd", "Offset Work Plane"), translate("uCmd", "Offset: ")) if offset[1]: offsetWP(offset[0]) FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(varrow.node) diff --git a/uForms.py b/uForms.py index a9fcdea..33ffd20 100644 --- a/uForms.py +++ b/uForms.py @@ -7,6 +7,7 @@ from PySide import QtGui, QtCore import FreeCAD,FreeCADGui +from DraftGui import translate # UI Class definitions @@ -21,31 +22,31 @@ def initUI(self): self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) self.setMouseTracking(True) #1st row - self.labName = QtGui.QLabel("(seleziona un oggetto)", self) + self.labName = QtGui.QLabel(translate("uForms", "(seleziona un oggetto)", self)) #2nd row - self.labBaseVal = QtGui.QLabel("(base)", self) + self.labBaseVal = QtGui.QLabel(translate("uForms", "(base)", self)) self.subFLayout1=QtGui.QFormLayout() - self.subFLayout1.addRow('Base: ',self.labBaseVal) + self.subFLayout1.addRow(translate("uForms", "Base: ", self.labBaseVal)) #3rd row - self.labRotAng = QtGui.QLabel("(angle)", self) + self.labRotAng = QtGui.QLabel(translate("uForms", "(angle)", self)) self.subFLayout2=QtGui.QFormLayout() - self.subFLayout2.addRow('Rotation angle: ',self.labRotAng) + self.subFLayout2.addRow(translate("uForms", "Rotation angle: ", self.labRotAng)) # 4th row - self.labRotAx = QtGui.QLabel("v = (x,y,z)", self) + self.labRotAx = QtGui.QLabel(translate("uForms", "v = (x,y,z)", self)) self.subFLayout3=QtGui.QFormLayout() - self.subFLayout3.addRow('Rotation axis: ',self.labRotAx) + self.subFLayout3.addRow(translate("uForms", "Rotation axis: ", self.labRotAx)) # 5th row - self.labSubObj = QtGui.QLabel("(Sub object property)", self) + self.labSubObj = QtGui.QLabel(translate("uForms", "(Sub object property)", self)) # 6th row - self.labBeam = QtGui.QLabel("(Beam property)", self) + self.labBeam = QtGui.QLabel(translate("uForms", "(Beam property)", self)) # 7th row - self.labProfile = QtGui.QLabel("(Profile property)", self) + self.labProfile = QtGui.QLabel(translate("uForms", "(Profile property)", self)) # 8th row - self.pushButton1 = QtGui.QPushButton('QueryObject') + self.pushButton1 = QtGui.QPushButton(translate("uForms", "QueryObject")) self.pushButton1.setDefault(True) self.pushButton1.clicked.connect(self.onPushButton1) self.pushButton1.setMinimumWidth(90) - self.cancelButton = QtGui.QPushButton('Exit') + self.cancelButton = QtGui.QPushButton(translate("uForms", "Exit")) self.cancelButton.clicked.connect(self.onCancel) self.subHLayout1=QtGui.QHBoxLayout() self.subHLayout1.addWidget(self.pushButton1) @@ -118,7 +119,7 @@ class rotWPForm(QDialog): #QWidget): ''' Dialog to rotate the working plane about its axis. ''' - def __init__(self,winTitle='Rotate WP', icon='rotWP.svg'): + def __init__(self,winTitle=translate("uForms", "Rotate WP"), icon="rotWP.svg"): super(rotWPForm,self).__init__() self.move(QPoint(100,250)) self.setWindowFlags(Qt.WindowStaysOnTopHint) @@ -134,7 +135,7 @@ def __init__(self,winTitle='Rotate WP', icon='rotWP.svg'): self.radioX.setChecked(True) self.radioY=QRadioButton('Y') self.radioZ=QRadioButton('Z') - self.lab1=QLabel('Angle:') + self.lab1=QLabel(translate("uForms", "Angle:")) self.edit1=QLineEdit('45') self.edit1.setAlignment(Qt.AlignCenter) self.edit1.setValidator(QDoubleValidator()) @@ -274,9 +275,9 @@ def accept(self): if self.isLiquid: loss=(Q*3600/o.Kv)**2*100000*self.Rho/1000 elif self.form.comboFluid.currentText()=='water' and not self.isLiquid: - pass # TODO formula for steam + pass # TODO: formula for steam else: - pass # TODO formula for gases + pass # TODO: formula for gases if hasattr(o,'ID'): ID = float(o.ID)/1000 v=Q/(ID**2*pi/4) From b9beae7806addebfeefd2c4526fecd8d3245bb0f Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 14 Mar 2024 20:00:25 -0600 Subject: [PATCH 020/135] Update Spanish translation --- translationz/dodo.ts | 212 +++++++++++++++++++++++++++++++++++++ translationz/dodo_es-ES.ts | 212 +++++++++++++++++++++++++++++++++++++ 2 files changed, 424 insertions(+) diff --git a/translationz/dodo.ts b/translationz/dodo.ts index dbe7e72..11a344e 100644 --- a/translationz/dodo.ts +++ b/translationz/dodo.ts @@ -694,6 +694,84 @@ + + fObservers + + + Select one beam and one edge + + + + + First select the base beam, then the edges + + + + + First select the target plane, then the faces to align + + + + + levelTheBeam + Transaction + + + + + Select the target face, then the others + + + + + alignFlange + Transaction + + + + + Select two edges to join. + + + + + joinTheBeamsEdges + Transaction + + + + + Select the beam and input the length + + + + + First Select the target shape, then the beams to extend. + + + + + Select 2 edges + + + + + Adjust angle + Transaction + + + + + Select 2 edges =>[Ctrl]+select + + + + + rotJoin + Transaction + + + flangeQM @@ -989,6 +1067,16 @@ Branches and header's axes must be ortho offsetWorkPlane + + + Offset Work Plane + + + + + Offset: + + offset Workplane @@ -1000,6 +1088,19 @@ Branches and header's axes must be ortho + + pForms + + + Offset Work Plane + + + + + Offset: + + + pipeQM @@ -1034,6 +1135,75 @@ Branches and header's axes must be ortho + + profEdit + + + Square + Profile name in the Tree View + + + + + T-profile + Profile name in the Tree View + + + + + U-profile + Profile name in the Tree View + + + + + H-profile + Profile name in the Tree View + + + + + L-profile + Profile name in the Tree View + + + + + Z-profile + Profile name in the Tree View + + + + + Omega-profile + Profile name in the Tree View + + + + + Circle-profile + Profile name in the Tree View + + + + + Insert profile + Transaction, used on undo/redo lists + + + + + Modify profile + Transaction, used on undo/redo lists + + + + + Shift profile + Transaction, used on undo/redo lists + + + queryModel @@ -1152,6 +1322,48 @@ Branches and header's axes must be ortho + + uCmd + + + Quick move + Transaction + + + + + Offset Work Plane + + + + + Offset: + + + + + uForms + + + QueryObject + + + + + Exit + + + + + Rotate WP + + + + + Angle: + + + valveQM diff --git a/translationz/dodo_es-ES.ts b/translationz/dodo_es-ES.ts index b2ed58d..7341162 100644 --- a/translationz/dodo_es-ES.ts +++ b/translationz/dodo_es-ES.ts @@ -705,6 +705,84 @@ Extiende tubos a la interseccion + + fObservers + + + Select one beam and one edge + + + + + First select the base beam, then the edges + + + + + First select the target plane, then the faces to align + + + + + levelTheBeam + Transaction + + + + + Select the target face, then the others + + + + + alignFlange + Transaction + + + + + Select two edges to join. + + + + + joinTheBeamsEdges + Transaction + + + + + Select the beam and input the length + + + + + First Select the target shape, then the beams to extend. + + + + + Select 2 edges + + + + + Adjust angle + Transaction + + + + + Select 2 edges =>[Ctrl]+select + + + + + rotJoin + Transaction + + + flangeQM @@ -993,6 +1071,16 @@ Branches and header's axes must be ortho offsetWorkPlane + + + Offset Work Plane + Desplazar plano de trabajo + + + + Offset: + Desplazamiento: + offset Workplane @@ -1004,6 +1092,19 @@ Branches and header's axes must be ortho Desplaza el plano de trabajo a lo largo de su normal. + + pForms + + + Offset Work Plane + + + + + Offset: + + + pipeQM @@ -1038,6 +1139,75 @@ Branches and header's axes must be ortho Da clic en puntos subsecuentes. + + profEdit + + + Square + Profile name in the Tree View + + + + + T-profile + Profile name in the Tree View + + + + + U-profile + Profile name in the Tree View + + + + + H-profile + Profile name in the Tree View + + + + + L-profile + Profile name in the Tree View + + + + + Z-profile + Profile name in the Tree View + + + + + Omega-profile + Profile name in the Tree View + + + + + Circle-profile + Profile name in the Tree View + + + + + Insert profile + Transaction, used on undo/redo lists + + + + + Modify profile + Transaction, used on undo/redo lists + + + + + Shift profile + Transaction, used on undo/redo lists + + + queryModel @@ -1157,6 +1327,48 @@ para exportar en formato step Cambia la longituf de la viga, ya sea acorde a la arista preseleccionada o una entrada directa + + uCmd + + + Quick move + Transaction + + + + + Offset Work Plane + + + + + Offset: + + + + + uForms + + + QueryObject + + + + + Exit + + + + + Rotate WP + + + + + Angle: + + + valveQM From 541318bff963ce432cc6e6e81eacf927dab88285 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 16 Mar 2024 21:15:54 -0600 Subject: [PATCH 021/135] Mayor extra translations from code to ts file --- .gitignore | 1 + CPipe.py | 862 ++++++---- dialogz/align.ui | 2 +- dialogz/beamshift.ui | 8 +- dialogz/fbranch.ui | 2 +- dodoDialogs.py | 359 +++-- dodoPM.py | 557 ++++--- fFeatures.py | 2431 ++++++++++++++++++----------- pForms.py | 3027 +++++++++++++++++++++--------------- translationz/dodo.ts | 505 +++++- translationz/dodo_es-ES.qm | Bin 17745 -> 33746 bytes translationz/dodo_es-ES.ts | 830 ++++++++-- uForms.py | 767 +++++---- 13 files changed, 5943 insertions(+), 3408 deletions(-) diff --git a/.gitignore b/.gitignore index bd38df5..242cdac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__/ +test_**.sh diff --git a/CPipe.py b/CPipe.py index d26bc56..95e51fd 100644 --- a/CPipe.py +++ b/CPipe.py @@ -1,398 +1,602 @@ -#(c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD -__title__="pypeTools toolbar" -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" +__title__ = "pypeTools toolbar" +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" # import FreeCAD modules -import FreeCAD, FreeCADGui,inspect, os +import FreeCAD, FreeCADGui, inspect, os from PySide.QtCore import QT_TRANSLATE_NOOP from DraftGui import translate # helper ------------------------------------------------------------------- # FreeCAD TemplatePyMod module # (c) 2007 Juergen Riegel LGPL -def addCommand(name,cmdObject): - (list,num) = inspect.getsourcelines(cmdObject.Activated) - pos = 0 - # check for indentation - while(list[1][pos] == ' ' or list[1][pos] == '\t'): - pos += 1 - source = "" - for i in range(len(list)-1): - source += list[i+1][pos:] - FreeCADGui.addCommand(name,cmdObject,source) - #print(name+":\n"+str(source)) + +def addCommand(name, cmdObject): + (list, num) = inspect.getsourcelines(cmdObject.Activated) + pos = 0 + # check for indentation + while list[1][pos] == " " or list[1][pos] == "\t": + pos += 1 + source = "" + for i in range(len(list) - 1): + source += list[i + 1][pos:] + FreeCADGui.addCommand(name, cmdObject, source) + # print(name+":\n"+str(source)) + def updatesPL(dialogqm): - if FreeCAD.activeDocument(): - pypelines=[o.Label for o in FreeCAD.activeDocument().Objects if hasattr(o,'PType') and o.PType=='PypeLine'] - else: - pypelines=[] - if pypelines: # updates pypelines in combo - dialogqm.QM.comboPL.clear() - dialogqm.QM.comboPL.addItems(pypelines) - -#--------------------------------------------------------------------------- + if FreeCAD.activeDocument(): + pypelines = [ + o.Label + for o in FreeCAD.activeDocument().Objects + if hasattr(o, "PType") and o.PType == "PypeLine" + ] + else: + pypelines = [] + if pypelines: # updates pypelines in combo + dialogqm.QM.comboPL.clear() + dialogqm.QM.comboPL.addItems(pypelines) + + +# --------------------------------------------------------------------------- # The command classes -#--------------------------------------------------------------------------- +# --------------------------------------------------------------------------- + class insertPipe: - def Activated (self): - import pForms - pipForm=pForms.insertPipeForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","pipe.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertPipe','Insert a tube'), - 'ToolTip':QT_TRANSLATE_NOOP('insertPipe','Insert a tube')} + def Activated(self): + import pForms + + pipForm = pForms.insertPipeForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "pipe.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertPipe", "Insert a tube"), + "ToolTip": QT_TRANSLATE_NOOP("insertPipe", "Insert a tube"), + } + class insertElbow: - def Activated (self): - import pForms,FreeCAD - elbForm=pForms.insertElbowForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","elbow.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertElbow','Insert a curve'), - 'ToolTip':QT_TRANSLATE_NOOP('insertElbow','Insert a curve')} + def Activated(self): + import pForms, FreeCAD + + elbForm = pForms.insertElbowForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "elbow.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertElbow", "Insert a curve"), + "ToolTip": QT_TRANSLATE_NOOP("insertElbow", "Insert a curve"), + } + class insertReduct: - def Activated (self): - import pForms - pipeFormObj=pForms.insertReductForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","reduct.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertReduct','Insert a reduction'), - 'ToolTip':QT_TRANSLATE_NOOP('insertReduct','Insert a reduction')} + def Activated(self): + import pForms + + pipeFormObj = pForms.insertReductForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "reduct.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertReduct", "Insert a reduction"), + "ToolTip": QT_TRANSLATE_NOOP("insertReduct", "Insert a reduction"), + } + class insertCap: - def Activated (self): - import pForms - pipeFormObj=pForms.insertCapForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","cap.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertCap','Insert a cap'), - 'ToolTip':QT_TRANSLATE_NOOP('insertCap','Insert a cap')} + def Activated(self): + import pForms + + pipeFormObj = pForms.insertCapForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "cap.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertCap", "Insert a cap"), + "ToolTip": QT_TRANSLATE_NOOP("insertCap", "Insert a cap"), + } + class insertFlange: - def Activated (self): - import pForms - pipeFormObj=pForms.insertFlangeForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","flange.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertFlange','Insert a flange'), - 'ToolTip':QT_TRANSLATE_NOOP('insertFlange','Insert a flange')} + def Activated(self): + import pForms + + pipeFormObj = pForms.insertFlangeForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "flange.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertFlange", "Insert a flange"), + "ToolTip": QT_TRANSLATE_NOOP("insertFlange", "Insert a flange"), + } + class insertUbolt: - def Activated (self): - import pForms - pipeFormObj=pForms.insertUboltForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","clamp.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertUbolt','Insert a U-bolt'), - 'ToolTip':QT_TRANSLATE_NOOP('insertUbolt','Insert a U-bolt')} + def Activated(self): + import pForms + + pipeFormObj = pForms.insertUboltForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "clamp.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertUbolt", "Insert a U-bolt"), + "ToolTip": QT_TRANSLATE_NOOP("insertUbolt", "Insert a U-bolt"), + } + class insertPypeLine: - def Activated (self): - import pForms - pipeFormObj=pForms.insertPypeLineForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","pypeline.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertPypeLine','PypeLine Manager'), - 'ToolTip':QT_TRANSLATE_NOOP('insertPypeLine','Open PypeLine Manager')} + def Activated(self): + import pForms + + pipeFormObj = pForms.insertPypeLineForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "pypeline.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertPypeLine", "PypeLine Manager"), + "ToolTip": QT_TRANSLATE_NOOP("insertPypeLine", "Open PypeLine Manager"), + } + class insertBranch: - def Activated (self): - import pForms - #pCmd.makeBranch() - pipeFormObj=pForms.insertBranchForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","branch.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertBranch','Insert a branch'), - 'ToolTip':QT_TRANSLATE_NOOP('insertBranch','Insert a PypeBranch')} + def Activated(self): + import pForms + + # pCmd.makeBranch() + pipeFormObj = pForms.insertBranchForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "branch.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertBranch", "Insert a branch"), + "ToolTip": QT_TRANSLATE_NOOP("insertBranch", "Insert a PypeBranch"), + } + class breakPipe: - def Activated (self): - import pForms - pipeFormObj=pForms.breakForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","break.svg"), - 'MenuText':QT_TRANSLATE_NOOP('breakPipe','Break the pipe'), - 'ToolTip':QT_TRANSLATE_NOOP('breakPipe','Break one pipe at point and insert gap')} + def Activated(self): + import pForms + + pipeFormObj = pForms.breakForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "break.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("breakPipe", "Break the pipe"), + "ToolTip": QT_TRANSLATE_NOOP( + "breakPipe", "Break one pipe at point and insert gap" + ), + } + class mateEdges: - def Activated (self): - import pCmd - FreeCAD.activeDocument().openTransaction('Mate') - pCmd.alignTheTube() - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","mate.svg"), - 'Accel':"M,E", - 'MenuText':QT_TRANSLATE_NOOP('mateEdges','Mate pipes edges'), - 'ToolTip':QT_TRANSLATE_NOOP('mateEdges','Mate two terminations through their edges')} + def Activated(self): + import pCmd + + FreeCAD.activeDocument().openTransaction("Mate") + pCmd.alignTheTube() + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "mate.svg" + ), + "Accel": "M,E", + "MenuText": QT_TRANSLATE_NOOP("mateEdges", "Mate pipes edges"), + "ToolTip": QT_TRANSLATE_NOOP( + "mateEdges", "Mate two terminations through their edges" + ), + } + class flat: - def Activated (self): - import pCmd - pCmd.flatten() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","flat.svg"), - 'MenuText':QT_TRANSLATE_NOOP('flat','Fit one elbow'), - 'ToolTip':QT_TRANSLATE_NOOP('flat','Place the elbow between two pipes or beams')} + def Activated(self): + import pCmd + + pCmd.flatten() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "flat.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("flat", "Fit one elbow"), + "ToolTip": QT_TRANSLATE_NOOP( + "flat", "Place the elbow between two pipes or beams" + ), + } + class extend2intersection: - def Activated (self): - import pCmd - FreeCAD.activeDocument().openTransaction('Xtend2int') - pCmd.extendTheTubes2intersection() - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","intersect.svg"), - 'MenuText':QT_TRANSLATE_NOOP('extend2intersection','Extends pipes to intersection'), - 'ToolTip':QT_TRANSLATE_NOOP('extend2intersection','Extends pipes to intersection')} + def Activated(self): + import pCmd + + FreeCAD.activeDocument().openTransaction("Xtend2int") + pCmd.extendTheTubes2intersection() + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "intersect.svg" + ), + "MenuText": QT_TRANSLATE_NOOP( + "extend2intersection", "Extends pipes to intersection" + ), + "ToolTip": QT_TRANSLATE_NOOP( + "extend2intersection", "Extends pipes to intersection" + ), + } + class extend1intersection: - def Activated (self): - import pCmd - FreeCAD.activeDocument().openTransaction('Xtend1int') - pCmd.extendTheTubes2intersection(both=False) - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","intersect1.svg"), - 'MenuText':QT_TRANSLATE_NOOP('extend1intersection','Extends pipe to intersection'), - 'ToolTip':QT_TRANSLATE_NOOP('extend1intersection','Extends pipe to intersection')} + def Activated(self): + import pCmd + + FreeCAD.activeDocument().openTransaction("Xtend1int") + pCmd.extendTheTubes2intersection(both=False) + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "intersect1.svg" + ), + "MenuText": QT_TRANSLATE_NOOP( + "extend1intersection", "Extends pipe to intersection" + ), + "ToolTip": QT_TRANSLATE_NOOP( + "extend1intersection", "Extends pipe to intersection" + ), + } + class laydown: - def Activated (self): - import pCmd, fCmd - from Part import Plane - refFace=[f for f in fCmd.faces() if type(f.Surface)==Plane][0] - FreeCAD.activeDocument().openTransaction('Lay-down the pipe') - for b in fCmd.beams(): - if pCmd.isPipe(b): - pCmd.laydownTheTube(b,refFace) - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","laydown.svg"), - 'MenuText':QT_TRANSLATE_NOOP('laydown','Lay-down the pipe'), - 'ToolTip':QT_TRANSLATE_NOOP('laydown','Lay-down the pipe on the support plane')} + def Activated(self): + import pCmd, fCmd + from Part import Plane + + refFace = [f for f in fCmd.faces() if type(f.Surface) == Plane][0] + FreeCAD.activeDocument().openTransaction("Lay-down the pipe") + for b in fCmd.beams(): + if pCmd.isPipe(b): + pCmd.laydownTheTube(b, refFace) + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "laydown.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("laydown", "Lay-down the pipe"), + "ToolTip": QT_TRANSLATE_NOOP( + "laydown", "Lay-down the pipe on the support plane" + ), + } + class raiseup: - def Activated (self): - import pCmd, fCmd - from Part import Plane - selex=FreeCADGui.Selection.getSelectionEx() - for sx in selex: - sxFaces=[f for f in fCmd.faces([sx]) if type(f.Surface)==Plane] - if len(sxFaces)>0: - refFace=sxFaces[0] - support=sx.Object - FreeCAD.activeDocument().openTransaction('Raise-up the support') - for b in fCmd.beams(): - if pCmd.isPipe(b): - pCmd.laydownTheTube(b,refFace,support) - break - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","raiseup.svg"), - 'MenuText':QT_TRANSLATE_NOOP('raiseup','Raise-up the support'), - 'ToolTip':QT_TRANSLATE_NOOP('raiseup','Raise the support to the pipe')} + def Activated(self): + import pCmd, fCmd + from Part import Plane + + selex = FreeCADGui.Selection.getSelectionEx() + for sx in selex: + sxFaces = [f for f in fCmd.faces([sx]) if type(f.Surface) == Plane] + if len(sxFaces) > 0: + refFace = sxFaces[0] + support = sx.Object + FreeCAD.activeDocument().openTransaction("Raise-up the support") + for b in fCmd.beams(): + if pCmd.isPipe(b): + pCmd.laydownTheTube(b, refFace, support) + break + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "raiseup.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("raiseup", "Raise-up the support"), + "ToolTip": QT_TRANSLATE_NOOP("raiseup", "Raise the support to the pipe"), + } + class joinPype: - ''' + """ """ + + def Activated(self): + import FreeCAD, FreeCADGui, pForms # pObservers - ''' - def Activated(self): - import FreeCAD, FreeCADGui, pForms #pObservers - # s=pObservers.joinObserver() - FreeCADGui.Control.showDialog(pForms.joinForm()) #.Selection.addObserver(s) + # s=pObservers.joinObserver() + FreeCADGui.Control.showDialog(pForms.joinForm()) # .Selection.addObserver(s) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "join.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("joinPype", "Join pypes"), + "ToolTip": QT_TRANSLATE_NOOP( + "joinPype", "Select the part-pype and the port" + ), + } - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","join.svg"), - 'MenuText':QT_TRANSLATE_NOOP('joinPype','Join pypes'), - 'ToolTip':QT_TRANSLATE_NOOP('joinPype','Select the part-pype and the port')} class insertValve: - def Activated (self): - import pForms - #pipeFormObj=pForms.insertValveForm() - #FreeCADGui.Control.showDialog(pForms.insertValveForm()) - pipeFormObj=pForms.insertValveForm() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","valve.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertValve','Insert a valve'), - 'ToolTip':QT_TRANSLATE_NOOP('insertValve','Insert a valve')} + def Activated(self): + import pForms + + # pipeFormObj=pForms.insertValveForm() + # FreeCADGui.Control.showDialog(pForms.insertValveForm()) + pipeFormObj = pForms.insertValveForm() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "valve.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertValve", "Insert a valve"), + "ToolTip": QT_TRANSLATE_NOOP("insertValve", "Insert a valve"), + } + class attach2tube: - def Activated (self): - import pCmd - FreeCAD.activeDocument().openTransaction('Attach to tube') - pCmd.attachToTube() - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","attach.svg"), - 'MenuText':QT_TRANSLATE_NOOP('attach2tube','Attach to tube'), - 'ToolTip':QT_TRANSLATE_NOOP('attach2tube','Attach one pype to the nearest port of selected pipe')} + def Activated(self): + import pCmd + + FreeCAD.activeDocument().openTransaction("Attach to tube") + pCmd.attachToTube() + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "attach.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("attach2tube", "Attach to tube"), + "ToolTip": QT_TRANSLATE_NOOP( + "attach2tube", "Attach one pype to the nearest port of selected pipe" + ), + } + class point2point: + def Activated(self): + import pForms - def Activated(self): - import pForms - form = pForms.point2pointPipe() + form = pForms.point2pointPipe() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "point2point.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("point2point", "draw a tube point-to-point"), + "ToolTip": QT_TRANSLATE_NOOP("point2point", "Click on subsequent points."), + } - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","point2point.svg"), - 'MenuText':QT_TRANSLATE_NOOP('point2point','draw a tube point-to-point'), - 'ToolTip':QT_TRANSLATE_NOOP('point2point','Click on subsequent points.')} class insertAnyz: - ''' - Dialog to insert any object saved as .STEP, .IGES or .BREP in folder ../Mod/dodo/shapez or subfolders. - ''' - def Activated(self): - import anyShapez - FreeCADGui.Control.showDialog(anyShapez.shapezDialog()) + """ + Dialog to insert any object saved as .STEP, .IGES or .BREP in folder ../Mod/dodo/shapez or subfolders. + """ + + def Activated(self): + import anyShapez + + FreeCADGui.Control.showDialog(anyShapez.shapezDialog()) + + def GetResources(self): + return { + "MenuText": QT_TRANSLATE_NOOP("insertAnyz", "Insert any shape"), + "ToolTip": QT_TRANSLATE_NOOP("insertAnyz", "Insert a STEP, IGES or BREP"), + } - def GetResources(self): - return{'MenuText':QT_TRANSLATE_NOOP('insertAnyz','Insert any shape'), - 'ToolTip':QT_TRANSLATE_NOOP('insertAnyz','Insert a STEP, IGES or BREP')} class insertTank: - def Activated(self): - import FreeCADGui, pForms - FreeCADGui.Control.showDialog(pForms.insertTankForm()) + def Activated(self): + import FreeCADGui, pForms + + FreeCADGui.Control.showDialog(pForms.insertTankForm()) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "tank.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertTank", "Insert a tank"), + "ToolTip": QT_TRANSLATE_NOOP("insertTank", "Create tank and nozzles"), + } - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","tank.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertTank','Insert a tank'), - 'ToolTip':QT_TRANSLATE_NOOP('insertTank','Create tank and nozzles')} class insertRoute: - def Activated(self): - import FreeCADGui, pForms - FreeCADGui.Control.showDialog(pForms.insertRouteForm()) + def Activated(self): + import FreeCADGui, pForms + + FreeCADGui.Control.showDialog(pForms.insertRouteForm()) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "route.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("insertRoute", "Insert a pipe route"), + "ToolTip": QT_TRANSLATE_NOOP( + "insertRoute", "Create a sketch attached to a circular edge" + ), + } - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","route.svg"), - 'MenuText':QT_TRANSLATE_NOOP('insertRoute','Insert a pipe route'), - 'ToolTip':QT_TRANSLATE_NOOP('insertRoute','Create a sketch attached to a circular edge')} class makeHeader: - def Activated (self): - import pCmd - FreeCAD.activeDocument().openTransaction('Connect to header') - pCmd.header() - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","header.svg"), - 'MenuText':QT_TRANSLATE_NOOP('makeHeader', 'Connect to header'), - 'ToolTip':QT_TRANSLATE_NOOP('makeHeader', 'Connect branches to one header pipe\nBranches and header\'s axes must be ortho')} - -#--------------------------------------------------------------------------- + def Activated(self): + import pCmd + + FreeCAD.activeDocument().openTransaction("Connect to header") + pCmd.header() + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "header.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("makeHeader", "Connect to header"), + "ToolTip": QT_TRANSLATE_NOOP( + "makeHeader", + "Connect branches to one header pipe\nBranches and header's axes must be ortho", + ), + } + + +# --------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager -#--------------------------------------------------------------------------- -addCommand('insertPipe',insertPipe()) -addCommand('insertElbow',insertElbow()) -addCommand('insertReduct',insertReduct()) -addCommand('insertCap',insertCap()) -addCommand('insertValve',insertValve()) -addCommand('insertFlange',insertFlange()) -addCommand('insertUbolt',insertUbolt()) -addCommand('insertPypeLine',insertPypeLine()) -addCommand('insertBranch',insertBranch()) -addCommand('insertTank',insertTank()) -addCommand('insertRoute',insertRoute()) -addCommand('breakPipe',breakPipe()) -addCommand('mateEdges',mateEdges()) -addCommand('joinPype',joinPype()) -addCommand('attach2tube',attach2tube()) -addCommand('flat',flat()) -addCommand('extend2intersection',extend2intersection()) -addCommand('extend1intersection',extend1intersection()) -addCommand('laydown',laydown()) -addCommand('raiseup',raiseup()) -addCommand('point2point',point2point()) -addCommand('insertAnyz',insertAnyz()) -addCommand('makeHeader',makeHeader()) +# --------------------------------------------------------------------------- +addCommand("insertPipe", insertPipe()) +addCommand("insertElbow", insertElbow()) +addCommand("insertReduct", insertReduct()) +addCommand("insertCap", insertCap()) +addCommand("insertValve", insertValve()) +addCommand("insertFlange", insertFlange()) +addCommand("insertUbolt", insertUbolt()) +addCommand("insertPypeLine", insertPypeLine()) +addCommand("insertBranch", insertBranch()) +addCommand("insertTank", insertTank()) +addCommand("insertRoute", insertRoute()) +addCommand("breakPipe", breakPipe()) +addCommand("mateEdges", mateEdges()) +addCommand("joinPype", joinPype()) +addCommand("attach2tube", attach2tube()) +addCommand("flat", flat()) +addCommand("extend2intersection", extend2intersection()) +addCommand("extend1intersection", extend1intersection()) +addCommand("laydown", laydown()) +addCommand("raiseup", raiseup()) +addCommand("point2point", point2point()) +addCommand("insertAnyz", insertAnyz()) +addCommand("makeHeader", makeHeader()) + ### QkMenus ### class pipeQM: - def Activated(self): - import dodoPM - #dodoPM.pqm.updatePL() - dodoPM.pqm.show() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","pipe.svg"), - 'MenuText':QT_TRANSLATE_NOOP('pipeQM','QM for pipes')} -addCommand('pipeQM',pipeQM()) - -class elbowQM(): - def Activated (self): - import dodoPM - dodoPM.eqm.show() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","elbow.svg"), - 'MenuText':QT_TRANSLATE_NOOP('elbowQM','QM for elbows')} -addCommand('elbowQM',elbowQM()) - -class flangeQM(): - def Activated (self): - import dodoPM - dodoPM.fqm.show() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","flange.svg"), - 'MenuText':QT_TRANSLATE_NOOP('flangeQM','QM for flanges')} -addCommand('flangeQM',flangeQM()) - -class valveQM(): - def Activated (self): - import dodoPM - dodoPM.vqm.show() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","valve.svg"), - 'MenuText':QT_TRANSLATE_NOOP('valveQM','QM for valves')} -addCommand('valveQM',valveQM()) - -class capQM(): - def Activated (self): - import dodoPM - dodoPM.cqm.show() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","cap.svg"), - 'MenuText':QT_TRANSLATE_NOOP('capQM','QM for caps')} -addCommand('capQM',capQM()) + def Activated(self): + import dodoPM + + # dodoPM.pqm.updatePL() + dodoPM.pqm.show() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "pipe.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("pipeQM", "QM for pipes"), + } + + +addCommand("pipeQM", pipeQM()) + + +class elbowQM: + def Activated(self): + import dodoPM + + dodoPM.eqm.show() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "elbow.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("elbowQM", "QM for elbows"), + } + + +addCommand("elbowQM", elbowQM()) + + +class flangeQM: + def Activated(self): + import dodoPM + + dodoPM.fqm.show() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "flange.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("flangeQM", "QM for flanges"), + } + + +addCommand("flangeQM", flangeQM()) + + +class valveQM: + def Activated(self): + import dodoPM + + dodoPM.vqm.show() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "valve.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("valveQM", "QM for valves"), + } + + +addCommand("valveQM", valveQM()) + + +class capQM: + def Activated(self): + import dodoPM + + dodoPM.cqm.show() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "cap.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("capQM", "QM for caps"), + } + + +addCommand("capQM", capQM()) diff --git a/dialogz/align.ui b/dialogz/align.ui index 140a38c..bfb9521 100644 --- a/dialogz/align.ui +++ b/dialogz/align.ui @@ -145,7 +145,7 @@ - Set notmal + Set normal diff --git a/dialogz/beamshift.ui b/dialogz/beamshift.ui index 51a5cb6..d985290 100644 --- a/dialogz/beamshift.ui +++ b/dialogz/beamshift.ui @@ -73,7 +73,7 @@ - Z: + Z: true @@ -113,7 +113,7 @@ - Steps: + Steps: edit5 @@ -123,7 +123,7 @@ - Y: + Y: true @@ -147,7 +147,7 @@ - X: + X: true diff --git a/dialogz/fbranch.ui b/dialogz/fbranch.ui index 36665ca..cf9796f 100644 --- a/dialogz/fbranch.ui +++ b/dialogz/fbranch.ui @@ -73,7 +73,7 @@ - Add single + Add single beam diff --git a/dodoDialogs.py b/dodoDialogs.py index c0ef2d8..1e7d725 100644 --- a/dodoDialogs.py +++ b/dodoDialogs.py @@ -4,154 +4,215 @@ from os.path import join, dirname, abspath from os import listdir import FreeCAD, FreeCADGui, csv +from DraftGui import translate -class protoTypeDialog(object): - 'prototype for dialogs.ui with callback function' - def __init__(self,dialog='anyFile.ui'): - dialogPath=join(dirname(abspath(__file__)),"dialogz",dialog) - self.form=FreeCADGui.PySideUic.loadUi(dialogPath) - ### new shortcuts procedure - self.mw = FreeCADGui.getMainWindow() - for act in self.mw.findChildren(QAction): - if act.objectName() in ["actionX", "actionS"]: - self.mw.removeAction(act) - self.actionX = QAction(self.mw) - self.actionX.setObjectName("actionX") # define X action - self.actionX.setShortcut(QKeySequence("X")) - self.actionX.triggered.connect(self.accept) - self.mw.addAction(self.actionX) - self.actionS = QAction(self.mw) - self.actionS.setObjectName("actionS") # define S action - self.actionS.setShortcut(QKeySequence("S")) - self.actionS.triggered.connect(self.selectAction) - self.mw.addAction(self.actionS) - self.actionESC = QAction(self.mw) - FreeCAD.Console.PrintMessage('"%s" to select; "%s" to execute\n' %(self.actionS.shortcuts()[0].toString(),self.actionX.shortcuts()[0].toString())) - try: - self.view=FreeCADGui.activeDocument().activeView() - self.call=self.view.addEventCallback("SoMouseButtonEvent", self.action) # SoKeyboardEvents replaced by QAction' - except: - FreeCAD.Console.PrintError('No view available.\n') - def action(self,arg): - 'Defines functions executed by the callback self.call when "SoMouseButtonEvent"' - # SoKeyboardEvents replaced by QAction': - CtrlAltShift=[arg['CtrlDown'],arg['AltDown'],arg['ShiftDown']] - if arg['Button']=='BUTTON1' and arg['State']=='DOWN': self.mouseActionB1(CtrlAltShift) - elif arg['Button']=='BUTTON2' and arg['State']=='DOWN': self.mouseActionB2(CtrlAltShift) - elif arg['Button']=='BUTTON3' and arg['State']=='DOWN': self.mouseActionB3(CtrlAltShift) - def selectAction(self): - 'MUST be redefined in the child class' - print('"selectAction" performed') - pass - def mouseActionB1(self,CtrlAltShift): - 'MUST be redefined in the child class' - pass - def mouseActionB2(self,CtrlAltShift): - 'MUST be redefined in the child class' - pass - def mouseActionB3(self,CtrlAltShift): - 'MUST be redefined in the child class' - pass - def reject(self): - 'CAN be redefined to remove other attributes, such as arrow()s or label()s' - self.mw.removeAction(self.actionX) - self.mw.removeAction(self.actionS) - FreeCAD.Console.PrintMessage('Actions "%s" and "%s" removed\n' %(self.actionX.objectName(),self.actionS.objectName())) - try: self.view.removeEventCallback('SoMouseButtonEvent',self.call) - except: pass - FreeCADGui.Control.closeDialog() - if FreeCAD.ActiveDocument: FreeCAD.ActiveDocument.recompute() - -class protoPypeForm(QDialog): - 'prototype dialog for insert pFeatures' - def __init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD', icon='dodo.svg',x=100,y=350): - ''' - __init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD') - winTitle: the window's title - PType: the pipeFeature type - PRating: the pipeFeature pressure rating class - It lookups in the directory ./tablez the file PType+"_"+PRating+".csv", - imports it's content in a list of dictionaries -> .pipeDictList and - shows a summary in the QListWidget -> .sizeList - Also create a property -> PRatingsList with the list of available PRatings for the - selected PType. - ''' - super(protoPypeForm,self).__init__() - self.move(QPoint(x,y)) - self.mw = FreeCADGui.getMainWindow() - self.PType=PType - self.PRating=PRating - self.setWindowFlags(Qt.WindowStaysOnTopHint) - self.setWindowTitle(winTitle) - iconPath=join(dirname(abspath(__file__)),"iconz",icon) - from PySide.QtGui import QIcon - Icon=QIcon() - Icon.addFile(iconPath) - self.setWindowIcon(Icon) - self.mainHL=QHBoxLayout() - self.setLayout(self.mainHL) - self.firstCol=QWidget() - self.firstCol.setLayout(QVBoxLayout()) - self.mainHL.addWidget(self.firstCol) - self.currentRatingLab=QLabel('Rating: '+self.PRating) - self.firstCol.layout().addWidget(self.currentRatingLab) - self.sizeList=QListWidget() - self.firstCol.layout().addWidget(self.sizeList) - self.pipeDictList=[] - self.fileList=listdir(join(dirname(abspath(__file__)),"tablez")) - self.fillSizes() - self.PRatingsList=[s.lstrip(PType+"_").rstrip(".csv") for s in self.fileList if s.startswith(PType) and s.endswith('.csv')] - self.secondCol=QWidget() - self.secondCol.setLayout(QVBoxLayout()) - self.combo=QComboBox() - self.combo.addItem('') - try: - self.combo.addItems([o.Label for o in FreeCAD.activeDocument().Objects if hasattr(o,'PType') and o.PType=='PypeLine']) - except: - None - self.combo.currentIndexChanged.connect(self.setCurrentPL) - if FreeCAD.__activePypeLine__ and FreeCAD.__activePypeLine__ in [self.combo.itemText(i) for i in range(self.combo.count())]: - self.combo.setCurrentIndex(self.combo.findText(FreeCAD.__activePypeLine__)) - self.secondCol.layout().addWidget(self.combo) - self.ratingList=QListWidget() - self.ratingList.addItems(self.PRatingsList) - self.ratingList.itemClicked.connect(self.changeRating) - self.ratingList.setCurrentRow(0) - self.secondCol.layout().addWidget(self.ratingList) - self.btn1=QPushButton('Insert') - self.secondCol.layout().addWidget(self.btn1) - self.mainHL.addWidget(self.secondCol) - self.resize(max(350,int(self.mw.width()/4)),max(350,int(self.mw.height()/2))) - self.mainHL.setContentsMargins(0,0,0,0) - def setCurrentPL(self,PLName=None): - if self.combo.currentText() not in ['','']: - FreeCAD.__activePypeLine__= self.combo.currentText() - else: - FreeCAD.__activePypeLine__=None - def fillSizes(self): - self.sizeList.clear() - for fileName in self.fileList: - if fileName==self.PType+'_'+self.PRating+'.csv': - f=open(join(dirname(abspath(__file__)),"tablez",fileName),'r') - reader=csv.DictReader(f,delimiter=';') - self.pipeDictList=[DNx for DNx in reader] - f.close() + +class protoTypeDialog(object): + "prototype for dialogs.ui with callback function" + + def __init__(self, dialog="anyFile.ui"): + dialogPath = join(dirname(abspath(__file__)), "dialogz", dialog) + self.form = FreeCADGui.PySideUic.loadUi(dialogPath) + ### new shortcuts procedure + self.mw = FreeCADGui.getMainWindow() + for act in self.mw.findChildren(QAction): + if act.objectName() in ["actionX", "actionS"]: + self.mw.removeAction(act) + self.actionX = QAction(self.mw) + self.actionX.setObjectName("actionX") # define X action + self.actionX.setShortcut(QKeySequence("X")) + self.actionX.triggered.connect(self.accept) + self.mw.addAction(self.actionX) + self.actionS = QAction(self.mw) + self.actionS.setObjectName("actionS") # define S action + self.actionS.setShortcut(QKeySequence("S")) + self.actionS.triggered.connect(self.selectAction) + self.mw.addAction(self.actionS) + self.actionESC = QAction(self.mw) + FreeCAD.Console.PrintMessage( + translate("protoTypeDialog", '"%s" to select; "%s" to execute\n') + % ( + self.actionS.shortcuts()[0].toString(), + self.actionX.shortcuts()[0].toString(), + ) + ) + try: + self.view = FreeCADGui.activeDocument().activeView() + self.call = self.view.addEventCallback( + "SoMouseButtonEvent", self.action + ) # SoKeyboardEvents replaced by QAction' + except: + FreeCAD.Console.PrintError( + translate("protoTypeDialog", "No view available.\n") + ) + + def action(self, arg): + 'Defines functions executed by the callback self.call when "SoMouseButtonEvent"' + # SoKeyboardEvents replaced by QAction': + CtrlAltShift = [arg["CtrlDown"], arg["AltDown"], arg["ShiftDown"]] + if arg["Button"] == "BUTTON1" and arg["State"] == "DOWN": + self.mouseActionB1(CtrlAltShift) + elif arg["Button"] == "BUTTON2" and arg["State"] == "DOWN": + self.mouseActionB2(CtrlAltShift) + elif arg["Button"] == "BUTTON3" and arg["State"] == "DOWN": + self.mouseActionB3(CtrlAltShift) + + def selectAction(self): + "MUST be redefined in the child class" + print('"selectAction" performed') + pass + + def mouseActionB1(self, CtrlAltShift): + "MUST be redefined in the child class" + pass + + def mouseActionB2(self, CtrlAltShift): + "MUST be redefined in the child class" + pass + + def mouseActionB3(self, CtrlAltShift): + "MUST be redefined in the child class" + pass + + def reject(self): + "CAN be redefined to remove other attributes, such as arrow()s or label()s" + self.mw.removeAction(self.actionX) + self.mw.removeAction(self.actionS) + FreeCAD.Console.PrintMessage( + translate("protoTypeDialog", 'Actions "%s" and "%s" removed\n') + % (self.actionX.objectName(), self.actionS.objectName()) + ) + try: + self.view.removeEventCallback("SoMouseButtonEvent", self.call) + except: + pass + FreeCADGui.Control.closeDialog() + if FreeCAD.ActiveDocument: + FreeCAD.ActiveDocument.recompute() + + +class protoPypeForm(QDialog): + "prototype dialog for insert pFeatures" + + def __init__( + self, + winTitle="Title", + PType="Pipe", + PRating="SCH-STD", + icon="dodo.svg", + x=100, + y=350, + ): + """ + __init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD') + winTitle: the window's title + PType: the pipeFeature type + PRating: the pipeFeature pressure rating class + It lookups in the directory ./tablez the file PType+"_"+PRating+".csv", + imports it's content in a list of dictionaries -> .pipeDictList and + shows a summary in the QListWidget -> .sizeList + Also create a property -> PRatingsList with the list of available PRatings for the + selected PType. + """ + super(protoPypeForm, self).__init__() + self.move(QPoint(x, y)) + self.mw = FreeCADGui.getMainWindow() + self.PType = PType + self.PRating = PRating + self.setWindowFlags(Qt.WindowStaysOnTopHint) + self.setWindowTitle(winTitle) + iconPath = join(dirname(abspath(__file__)), "iconz", icon) + from PySide.QtGui import QIcon + + Icon = QIcon() + Icon.addFile(iconPath) + self.setWindowIcon(Icon) + self.mainHL = QHBoxLayout() + self.setLayout(self.mainHL) + self.firstCol = QWidget() + self.firstCol.setLayout(QVBoxLayout()) + self.mainHL.addWidget(self.firstCol) + self.currentRatingLab = QLabel( + translate("protoPypeForm", "Rating: ") + self.PRating + ) + self.firstCol.layout().addWidget(self.currentRatingLab) + self.sizeList = QListWidget() + self.firstCol.layout().addWidget(self.sizeList) + self.pipeDictList = [] + self.fileList = listdir(join(dirname(abspath(__file__)), "tablez")) + self.fillSizes() + self.PRatingsList = [ + s.lstrip(PType + "_").rstrip(".csv") + for s in self.fileList + if s.startswith(PType) and s.endswith(".csv") + ] + self.secondCol = QWidget() + self.secondCol.setLayout(QVBoxLayout()) + self.combo = QComboBox() + self.combo.addItem("") + try: + self.combo.addItems( + [ + o.Label + for o in FreeCAD.activeDocument().Objects + if hasattr(o, "PType") and o.PType == "PypeLine" + ] + ) + except: + None + self.combo.currentIndexChanged.connect(self.setCurrentPL) + if FreeCAD.__activePypeLine__ and FreeCAD.__activePypeLine__ in [ + self.combo.itemText(i) for i in range(self.combo.count()) + ]: + self.combo.setCurrentIndex(self.combo.findText(FreeCAD.__activePypeLine__)) + self.secondCol.layout().addWidget(self.combo) + self.ratingList = QListWidget() + self.ratingList.addItems(self.PRatingsList) + self.ratingList.itemClicked.connect(self.changeRating) + self.ratingList.setCurrentRow(0) + self.secondCol.layout().addWidget(self.ratingList) + self.btn1 = QPushButton(translate("protoPypeForm", "Insert")) + self.secondCol.layout().addWidget(self.btn1) + self.mainHL.addWidget(self.secondCol) + self.resize( + max(350, int(self.mw.width() / 4)), max(350, int(self.mw.height() / 2)) + ) + self.mainHL.setContentsMargins(0, 0, 0, 0) + + def setCurrentPL(self, PLName=None): + if self.combo.currentText() not in ["", ""]: + FreeCAD.__activePypeLine__ = self.combo.currentText() + else: + FreeCAD.__activePypeLine__ = None + + def fillSizes(self): + self.sizeList.clear() + for fileName in self.fileList: + if fileName == self.PType + "_" + self.PRating + ".csv": + f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") + reader = csv.DictReader(f, delimiter=";") + self.pipeDictList = [DNx for DNx in reader] + f.close() + for row in self.pipeDictList: + s = row["PSize"] + if "OD" in row.keys(): + s += " - " + row["OD"] + if "thk" in row.keys(): + s += "x" + row["thk"] + self.sizeList.addItem(s) + break + + def changeRating(self, item): + self.PRating = item.text() + self.currentRatingLab.setText( + translate("protoPypeForm", "Rating: ") + self.PRating + ) + self.fillSizes() + + def findDN(self, DN): + result = None for row in self.pipeDictList: - s=row['PSize'] - if 'OD' in row.keys(): - s+=" - "+row['OD'] - if 'thk' in row.keys(): - s+="x"+row['thk'] - self.sizeList.addItem(s) - break - def changeRating(self,item): - self.PRating=item.text() - self.currentRatingLab.setText('Rating: '+self.PRating) - self.fillSizes() - def findDN(self,DN): - result=None - for row in self.pipeDictList: - if row['PSize']==DN: - result=row - break - return result + if row["PSize"] == DN: + result = row + break + return result diff --git a/dodoPM.py b/dodoPM.py index f5d4a4d..a304584 100644 --- a/dodoPM.py +++ b/dodoPM.py @@ -11,9 +11,10 @@ from PySide import QtGui from os.path import join, dirname, abspath from os import listdir +from DraftGui import translate # definition of style -styleButton = (""" +styleButton = """ QToolButton { background-color: lightGray; border: 1px outset silver; @@ -36,8 +37,8 @@ subcontrol-position: center center; } - """) -styleMenuClose = (""" + """ +styleMenuClose = """ QToolButton { background-color: rgba(60,60,60,235); border: 1px solid #1e1e1e; @@ -48,25 +49,30 @@ subcontrol-position: center center; } - """) -styleContainer = ("QMenu{background: transparent}") + """ +styleContainer = "QMenu{background: transparent}" # styleCombo = (""" - # QComboBox { - # background: transparent; - # border: 1px solid transparent; - # } +# QComboBox { +# background: transparent; +# border: 1px solid transparent; +# } - # """) +# """) # styleQuickMenu = ("padding: 5px") iconClose = QtGui.QApplication.style().standardIcon(QtGui.QStyle.SP_DialogCloseButton) + + def radiusSize(buttonSize): radius = str(buttonSize / 2) return "QToolButton {border-radius: " + radius + "px}" + + def iconSize(buttonSize): - icon = buttonSize# / 3 * 2 + icon = buttonSize # / 3 * 2 return icon -# definition of widgets + +# definition of widgets def closeButton(buttonSize=50): icon = iconSize(buttonSize) radius = radiusSize(buttonSize) @@ -78,15 +84,19 @@ def closeButton(buttonSize=50): button.setIcon(iconClose) button.setStyleSheet(styleMenuClose + radius) button.setAttribute(QtCore.Qt.WA_TranslucentBackground) + def onButton(): PieMenuInstance.hide() + button.clicked.connect(onButton) return button + # main classes class HoverButton(QtGui.QToolButton): def __init__(self, parent=None): super(HoverButton, self).__init__() + def enterEvent(self, event): paramGet = FreeCAD.ParamGet("User parameter:BaseApp/PieMenu") mode = paramGet.GetString("TriggerMode") @@ -95,6 +105,7 @@ def enterEvent(self, event): self.defaultAction().trigger() else: pass + def mouseReleaseEvent(self, event): paramGet = FreeCAD.ParamGet("User parameter:BaseApp/PieMenu") mode = paramGet.GetString("TriggerMode") @@ -104,6 +115,7 @@ def mouseReleaseEvent(self, event): else: pass + class PieMenu: def __init__(self): self.radius = 100 @@ -112,12 +124,15 @@ def __init__(self): self.menu = QtGui.QMenu(mw) self.menuSize = 0 self.menu.setStyleSheet(styleContainer) - self.menu.setWindowFlags(self.menu.windowFlags() | QtCore.Qt.FramelessWindowHint) + self.menu.setWindowFlags( + self.menu.windowFlags() | QtCore.Qt.FramelessWindowHint + ) self.menu.setAttribute(QtCore.Qt.WA_TranslucentBackground) if compositingManager: pass else: self.menu.setAttribute(QtCore.Qt.WA_PaintOnScreen) + def add_commands(self, commands): # paramGet = FreeCAD.ParamGet("User parameter:BaseApp/PieMenu") for i in self.buttons: @@ -165,10 +180,12 @@ def add_commands(self, commands): button.setDefaultAction(commands[commands.index(i)]) button.setGeometry(0, 0, buttonSize, buttonSize) button.setIconSize(QtCore.QSize(icon, icon)) - button.setProperty("ButtonX", self.radius * - (math.cos(angle * num + angleStart))) - button.setProperty("ButtonY", self.radius * - (math.sin(angle * num + angleStart))) + button.setProperty( + "ButtonX", self.radius * (math.cos(angle * num + angleStart)) + ) + button.setProperty( + "ButtonY", self.radius * (math.sin(angle * num + angleStart)) + ) self.buttons.append(button) num = num + 1 buttonClose = closeButton() @@ -179,15 +196,24 @@ def add_commands(self, commands): else: for i in self.buttons: i.setAttribute(QtCore.Qt.WA_PaintOnScreen) + def hide(self): for i in self.buttons: i.hide() self.menu.hide() + def showAtMouse(self): - actionDict=dict([(a.objectName(),a) for a in FreeCADGui.getMainWindow().findChildren(QtGui.QAction)]) - try: actions.pop('') - except:pass - commands=[actionDict[n] for n in toolList if n in actionDict] + actionDict = dict( + [ + (a.objectName(), a) + for a in FreeCADGui.getMainWindow().findChildren(QtGui.QAction) + ] + ) + try: + actions.pop("") + except: + pass + commands = [actionDict[n] for n in toolList if n in actionDict] self.add_commands(commands) if self.menu.isVisible(): self.hide() @@ -197,245 +223,316 @@ def showAtMouse(self): self.menu.popup(QtCore.QPoint(mw.pos())) self.menu.setGeometry(mw.geometry()) for i in self.buttons: - i.move(i.property("ButtonX") + pos.x() - i.width() / 2, - i.property("ButtonY") + pos.y() - i.height() / 2) + i.move( + i.property("ButtonX") + pos.x() - i.width() / 2, + i.property("ButtonY") + pos.y() - i.height() / 2, + ) i.setVisible(True) for i in self.buttons: i.repaint() else: pos = QtGui.QCursor.pos() for i in self.buttons: - i.move(i.property("ButtonX") + (self.menuSize - i.size().width()) / 2, - i.property("ButtonY") + (self.menuSize - i.size().height()) / 2) + i.move( + i.property("ButtonX") + (self.menuSize - i.size().width()) / 2, + i.property("ButtonY") + (self.menuSize - i.size().height()) / 2, + ) i.setVisible(True) - self.menu.popup(QtCore.QPoint(pos.x() - self.menuSize / 2, pos.y() - self.menuSize / 2)) + self.menu.popup( + QtCore.QPoint( + pos.x() - self.menuSize / 2, pos.y() - self.menuSize / 2 + ) + ) + # QkMenus: + class QkMenu(object): - def setupUi(self, Dialog): - self.gridLayout = QtGui.QGridLayout(Dialog) - self.gridLayout.setObjectName("gridLayout") - self.comboRating = QtGui.QComboBox(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.comboRating.sizePolicy().hasHeightForWidth()) - self.comboRating.setSizePolicy(sizePolicy) - self.comboRating.setObjectName("comboRating") - self.gridLayout.addWidget(self.comboRating, 1, 1, 1, 1) - self.labRating = QtGui.QLabel("Rating:",Dialog) - self.labRating.setAlignment(QtCore.Qt.AlignCenter) - self.labRating.setObjectName("labRating") - self.gridLayout.addWidget(self.labRating, 1, 0, 1, 1) - self.comboPL = QtGui.QComboBox(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.comboPL.sizePolicy().hasHeightForWidth()) - self.comboPL.setSizePolicy(sizePolicy) - self.comboPL.setObjectName("comboPL") - self.comboPL.addItem("") - self.gridLayout.addWidget(self.comboPL, 0, 1, 1, 1) - self.btnGO = QtGui.QPushButton("GO",Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.btnGO.sizePolicy().hasHeightForWidth()) - self.btnGO.setSizePolicy(sizePolicy) - self.btnGO.setMinimumSize(QtCore.QSize(50, 50)) - self.btnGO.setMaximumSize(QtCore.QSize(80, 80)) - self.btnGO.setObjectName("btnGO") - self.gridLayout.addWidget(self.btnGO, 0, 2, 2, 1) - self.labPL = QtGui.QLabel("PypeLine: ",Dialog) - self.labPL.setAlignment(QtCore.Qt.AlignCenter) - self.labPL.setObjectName("labPL") - self.gridLayout.addWidget(self.labPL, 0, 0, 1, 1) - self.listSize = QtGui.QListWidget(Dialog) - self.listSize.setStyleSheet("QListWidget{background: transparent}") - self.listSize.setObjectName("listSize") - for i in range(3): - self.listSize.addItem("item "+str(i)) - self.gridLayout.addWidget(self.listSize, 2, 0, 1, 3) - QtCore.QMetaObject.connectSlotsByName(Dialog) - Dialog.setTabOrder(self.listSize, self.btnGO) - Dialog.setTabOrder(self.btnGO, self.comboRating) - Dialog.setTabOrder(self.comboRating, self.comboPL) + def setupUi(self, Dialog): + self.gridLayout = QtGui.QGridLayout(Dialog) + self.gridLayout.setObjectName("gridLayout") + self.comboRating = QtGui.QComboBox(Dialog) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed + ) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.comboRating.sizePolicy().hasHeightForWidth()) + self.comboRating.setSizePolicy(sizePolicy) + self.comboRating.setObjectName("comboRating") + self.gridLayout.addWidget(self.comboRating, 1, 1, 1, 1) + self.labRating = QtGui.QLabel("Rating:", Dialog) + self.labRating.setAlignment(QtCore.Qt.AlignCenter) + self.labRating.setObjectName("labRating") + self.gridLayout.addWidget(self.labRating, 1, 0, 1, 1) + self.comboPL = QtGui.QComboBox(Dialog) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed + ) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.comboPL.sizePolicy().hasHeightForWidth()) + self.comboPL.setSizePolicy(sizePolicy) + self.comboPL.setObjectName("comboPL") + self.comboPL.addItem("") + self.gridLayout.addWidget(self.comboPL, 0, 1, 1, 1) + self.btnGO = QtGui.QPushButton("GO", Dialog) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.MinimumExpanding + ) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.btnGO.sizePolicy().hasHeightForWidth()) + self.btnGO.setSizePolicy(sizePolicy) + self.btnGO.setMinimumSize(QtCore.QSize(50, 50)) + self.btnGO.setMaximumSize(QtCore.QSize(80, 80)) + self.btnGO.setObjectName("btnGO") + self.gridLayout.addWidget(self.btnGO, 0, 2, 2, 1) + self.labPL = QtGui.QLabel("PypeLine: ", Dialog) + self.labPL.setAlignment(QtCore.Qt.AlignCenter) + self.labPL.setObjectName("labPL") + self.gridLayout.addWidget(self.labPL, 0, 0, 1, 1) + self.listSize = QtGui.QListWidget(Dialog) + self.listSize.setStyleSheet("QListWidget{background: transparent}") + self.listSize.setObjectName("listSize") + for i in range(3): + self.listSize.addItem("item " + str(i)) + self.gridLayout.addWidget(self.listSize, 2, 0, 1, 3) + QtCore.QMetaObject.connectSlotsByName(Dialog) + Dialog.setTabOrder(self.listSize, self.btnGO) + Dialog.setTabOrder(self.btnGO, self.comboRating) + Dialog.setTabOrder(self.comboRating, self.comboPL) + class DialogQM(QtGui.QDialog): - def __init__(self, winTitle="Quick Insert", PType='Pipe'): - super(DialogQM,self).__init__(FreeCADGui.getMainWindow()) - self.setWindowTitle(winTitle) - self.setObjectName("DQkMenu") - self.resize(300, 300) - self.setStyleSheet(("Qself{background: transparent}")) - self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.QM=QkMenu() - self.QM.setupUi(self) - self.QM.btnGO.clicked.connect(self.go) - self.QM.comboRating.currentIndexChanged.connect(self.updateSizes) - self.QM.comboPL.currentIndexChanged.connect(self.setCurrentPL) - ### pype stuff ### - self.PType=PType - self.PRating='' - self.dictList=list() - self.files=listdir(join(dirname(abspath(__file__)),"tablez")) - ratings=[s.lstrip(PType+"_").rstrip(".csv") for s in self.files if s.startswith(PType) and s.endswith('.csv')] - if ratings: # adds ratings in combo - self.QM.comboRating.addItems(ratings) - self.updateSizes() - self.updatePL() - # self.show() - def show(self): - self.updatePL() - super(DialogQM,self).show() - def setCurrentPL(self,PLName=None): - if self.QM.comboPL.currentText() not in ['','']: - FreeCAD.__activePypeLine__= self.QM.comboPL.currentText() - else: - FreeCAD.__activePypeLine__=None - def updateSizes(self): - self.QM.listSize.clear() - self.PRating=self.QM.comboRating.currentText() - for fileName in self.files: #adds sizes in list - if fileName==self.PType+'_'+self.PRating+'.csv': - f=open(join(dirname(abspath(__file__)),"tablez",fileName),'r') - reader=csv.DictReader(f,delimiter=';') - self.dictList=[DNx for DNx in reader] - f.close() - for row in self.dictList: - s=row['PSize'] - if 'OD' in row.keys(): - s+=" - "+row['OD'] - if 'thk' in row.keys(): - s+="x"+row['thk'] - self.QM.listSize.addItem(s) - break - def updatePL(self): - if FreeCAD.activeDocument(): - pypelines=[o.Label for o in FreeCAD.activeDocument().Objects if hasattr(o,'PType') and o.PType=='PypeLine'] - else: - pypelines=[] - if pypelines: # updates pypelines in combo - pl=FreeCAD.__activePypeLine__ - self.QM.comboPL.clear() - pypelines.insert(0,'') - self.QM.comboPL.addItems(pypelines) - if pl and pl in pypelines: - self.QM.comboPL.setCurrentIndex(self.QM.comboPL.findText(pl)) - def go(self): - self.close() + def __init__(self, winTitle=translate("DialogQM", "Quick Insert"), PType="Pipe"): + super(DialogQM, self).__init__(FreeCADGui.getMainWindow()) + self.setWindowTitle(winTitle) + self.setObjectName("DQkMenu") + self.resize(300, 300) + self.setStyleSheet(("Qself{background: transparent}")) + self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) + self.setAttribute(QtCore.Qt.WA_TranslucentBackground) + self.QM = QkMenu() + self.QM.setupUi(self) + self.QM.btnGO.clicked.connect(self.go) + self.QM.comboRating.currentIndexChanged.connect(self.updateSizes) + self.QM.comboPL.currentIndexChanged.connect(self.setCurrentPL) + ### pype stuff ### + self.PType = PType + self.PRating = "" + self.dictList = list() + self.files = listdir(join(dirname(abspath(__file__)), "tablez")) + ratings = [ + s.lstrip(PType + "_").rstrip(".csv") + for s in self.files + if s.startswith(PType) and s.endswith(".csv") + ] + if ratings: # adds ratings in combo + self.QM.comboRating.addItems(ratings) + self.updateSizes() + self.updatePL() + # self.show() + + def show(self): + self.updatePL() + super(DialogQM, self).show() + + def setCurrentPL(self, PLName=None): + if self.QM.comboPL.currentText() not in ["", ""]: + FreeCAD.__activePypeLine__ = self.QM.comboPL.currentText() + else: + FreeCAD.__activePypeLine__ = None + + def updateSizes(self): + self.QM.listSize.clear() + self.PRating = self.QM.comboRating.currentText() + for fileName in self.files: # adds sizes in list + if fileName == self.PType + "_" + self.PRating + ".csv": + f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") + reader = csv.DictReader(f, delimiter=";") + self.dictList = [DNx for DNx in reader] + f.close() + for row in self.dictList: + s = row["PSize"] + if "OD" in row.keys(): + s += " - " + row["OD"] + if "thk" in row.keys(): + s += "x" + row["thk"] + self.QM.listSize.addItem(s) + break + + def updatePL(self): + if FreeCAD.activeDocument(): + pypelines = [ + o.Label + for o in FreeCAD.activeDocument().Objects + if hasattr(o, "PType") and o.PType == "PypeLine" + ] + else: + pypelines = [] + if pypelines: # updates pypelines in combo + pl = FreeCAD.__activePypeLine__ + self.QM.comboPL.clear() + pypelines.insert(0, "") + self.QM.comboPL.addItems(pypelines) + if pl and pl in pypelines: + self.QM.comboPL.setCurrentIndex(self.QM.comboPL.findText(pl)) + + def go(self): + self.close() + # DEFINITION OF QKMENUS DIALOGS: alternative to the commands created in CPipe.py + class pQM(DialogQM): - def __init__(self): - super(pQM,self).__init__('Insert pipe', 'Pipe') - self.QM.lineEdit = QtGui.QLineEdit(self) - self.QM.lineEdit.setAlignment(QtCore.Qt.AlignCenter) - self.QM.lineEdit.setObjectName("lineEdit") - self.QM.gridLayout.addWidget(self.QM.lineEdit, 3, 0, 1, 3) - self.QM.lineEdit.setPlaceholderText("") - self.QM.lineEdit.setValidator(QtGui.QDoubleValidator()) - self.QM.lineEdit.validator().setBottom(0) - def go(self): - d=self.dictList[self.QM.listSize.currentRow()] - if self.QM.lineEdit.text(): - L=float(self.QM.lineEdit.text()) - else: - L=1000 - pCmd.doPipes([d['PSize'],float(d['OD']),float(d['thk']),L],FreeCAD.__activePypeLine__) - super(pQM,self).go() + def __init__(self): + super(pQM, self).__init__("Insert pipe", "Pipe") + self.QM.lineEdit = QtGui.QLineEdit(self) + self.QM.lineEdit.setAlignment(QtCore.Qt.AlignCenter) + self.QM.lineEdit.setObjectName("lineEdit") + self.QM.gridLayout.addWidget(self.QM.lineEdit, 3, 0, 1, 3) + self.QM.lineEdit.setPlaceholderText("") + self.QM.lineEdit.setValidator(QtGui.QDoubleValidator()) + self.QM.lineEdit.validator().setBottom(0) + + def go(self): + d = self.dictList[self.QM.listSize.currentRow()] + if self.QM.lineEdit.text(): + L = float(self.QM.lineEdit.text()) + else: + L = 1000 + pCmd.doPipes( + [d["PSize"], float(d["OD"]), float(d["thk"]), L], FreeCAD.__activePypeLine__ + ) + super(pQM, self).go() + class eQM(DialogQM): - def __init__(self): - super(eQM,self).__init__('Insert elbow', 'Elbow') - self.QM.lineEdit = QtGui.QLineEdit(self) - self.QM.lineEdit.setAlignment(QtCore.Qt.AlignCenter) - self.QM.lineEdit.setObjectName("lineEdit") - self.QM.gridLayout.addWidget(self.QM.lineEdit, 3, 0, 1, 3) - self.QM.lineEdit.setPlaceholderText("") - self.QM.lineEdit.setValidator(QtGui.QDoubleValidator()) - self.QM.lineEdit.validator().setBottom(0) - self.QM.lineEdit.validator().setTop(90) - self.QM.lineEdit2 = QtGui.QLineEdit(self) - self.QM.lineEdit2.setAlignment(QtCore.Qt.AlignCenter) - self.QM.lineEdit2.setObjectName("lineEdit2") - self.QM.gridLayout.addWidget(self.QM.lineEdit2, 4, 0, 1, 3) - self.QM.lineEdit2.setPlaceholderText("") - self.QM.lineEdit2.setValidator(QtGui.QDoubleValidator()) - def go(self): - d=self.dictList[self.QM.listSize.currentRow()] - if self.QM.lineEdit.text(): - ang=float(self.QM.lineEdit.text()) - if ang>180: - ang=180 - self.QM.lineEdit.setText('180') - else: - ang=90 - if self.QM.lineEdit2.text(): - rad=float(self.QM.lineEdit2.text()) - if rad") + self.QM.lineEdit.setValidator(QtGui.QDoubleValidator()) + self.QM.lineEdit.validator().setBottom(0) + self.QM.lineEdit.validator().setTop(90) + self.QM.lineEdit2 = QtGui.QLineEdit(self) + self.QM.lineEdit2.setAlignment(QtCore.Qt.AlignCenter) + self.QM.lineEdit2.setObjectName("lineEdit2") + self.QM.gridLayout.addWidget(self.QM.lineEdit2, 4, 0, 1, 3) + self.QM.lineEdit2.setPlaceholderText("") + self.QM.lineEdit2.setValidator(QtGui.QDoubleValidator()) + + def go(self): + d = self.dictList[self.QM.listSize.currentRow()] + if self.QM.lineEdit.text(): + ang = float(self.QM.lineEdit.text()) + if ang > 180: + ang = 180 + self.QM.lineEdit.setText("180") + else: + ang = 90 + if self.QM.lineEdit2.text(): + rad = float(self.QM.lineEdit2.text()) + if rad < float(d["OD"]) / 2: + rad = float(d["OD"]) / 2 * 1.1 + self.QM.lineEdit.setText(str(rad)) + else: + rad = d["BendRadius"] + pCmd.doElbow( + [d["PSize"], float(d["OD"]), float(d["thk"]), ang, rad], + FreeCAD.__activePypeLine__, + ) + super(eQM, self).go() + class fQM(DialogQM): - def __init__(self): - super(fQM,self).__init__('Insert flange', 'Flange') - def go(self): - d=self.dictList[self.QM.listSize.currentRow()] - proplist=[d['PSize'],d['FlangeType'],float(d['D']),float(d['d']),float(d['df']),float(d['f']),float(d['t']),int(d['n'])] - try: # for raised-face - proplist.append(float(d['trf'])) - proplist.append(float(d['drf'])) - except: - pass - try: # for welding-neck - proplist.append(float(d['twn'])) - proplist.append(float(d['dwn'])) - proplist.append(float(d['ODp'])) - except: - pass - pCmd.doFlanges(proplist ,FreeCAD.__activePypeLine__) - super(fQM,self).go() + def __init__(self): + super(fQM, self).__init__("Insert flange", "Flange") + + def go(self): + d = self.dictList[self.QM.listSize.currentRow()] + proplist = [ + d["PSize"], + d["FlangeType"], + float(d["D"]), + float(d["d"]), + float(d["df"]), + float(d["f"]), + float(d["t"]), + int(d["n"]), + ] + try: # for raised-face + proplist.append(float(d["trf"])) + proplist.append(float(d["drf"])) + except: + pass + try: # for welding-neck + proplist.append(float(d["twn"])) + proplist.append(float(d["dwn"])) + proplist.append(float(d["ODp"])) + except: + pass + pCmd.doFlanges(proplist, FreeCAD.__activePypeLine__) + super(fQM, self).go() + class vQM(DialogQM): - def __init__(self): - super(vQM,self).__init__('Insert valve', 'Valve') - self.QM.slider = QtGui.QSlider(self) - self.QM.slider.setOrientation(QtCore.Qt.Horizontal) - self.QM.slider.setObjectName("slider") - self.QM.gridLayout.addWidget(self.QM.slider, 4, 0, 1, 3) - def go(self): - d=self.dictList[self.QM.listSize.currentRow()] - proplist=[d['PSize'],d['VType'],float(d['OD']),float(d['ID']),float(d['H']),float(d['Kv'])] - pCmd.doValves(proplist ,FreeCAD.__activePypeLine__, self.QM.slider.value()) - super(vQM,self).go() + def __init__(self): + super(vQM, self).__init__("Insert valve", "Valve") + self.QM.slider = QtGui.QSlider(self) + self.QM.slider.setOrientation(QtCore.Qt.Horizontal) + self.QM.slider.setObjectName("slider") + self.QM.gridLayout.addWidget(self.QM.slider, 4, 0, 1, 3) + + def go(self): + d = self.dictList[self.QM.listSize.currentRow()] + proplist = [ + d["PSize"], + d["VType"], + float(d["OD"]), + float(d["ID"]), + float(d["H"]), + float(d["Kv"]), + ] + pCmd.doValves(proplist, FreeCAD.__activePypeLine__, self.QM.slider.value()) + super(vQM, self).go() + class cQM(DialogQM): - def __init__(self): - super(cQM,self).__init__('Insert cap', 'Cap') - def go(self): - d=self.dictList[self.QM.listSize.currentRow()] - proplist=[ ] - pCmd.doCaps([d['PSize'],float(d['OD']),float(d['thk'])],FreeCAD.__activePypeLine__) - super(cQM,self).go() + def __init__(self): + super(cQM, self).__init__("Insert cap", "Cap") + + def go(self): + d = self.dictList[self.QM.listSize.currentRow()] + proplist = [] + pCmd.doCaps( + [d["PSize"], float(d["OD"]), float(d["thk"])], FreeCAD.__activePypeLine__ + ) + super(cQM, self).go() + # create instances of qkMenu dialogs -pqm=pQM() -eqm=eQM() -fqm=fQM() -vqm=vQM() -cqm=cQM() +pqm = pQM() +eqm = eQM() +fqm = fQM() +vqm = vQM() +cqm = cQM() # main mw = FreeCADGui.getMainWindow() -toolList=["pipeQM","elbowQM","flangeQM","valveQM","capQM"]#["insertPipe","insertElbow","insertReduct","insertCap","insertValve","insertFlange","insertUbolt"] +toolList = [ + "pipeQM", + "elbowQM", + "flangeQM", + "valveQM", + "capQM", +] # ["insertPipe","insertElbow","insertReduct","insertCap","insertValve","insertFlange","insertUbolt"] compositingManager = True if QtCore.qVersion() < "5": windowShadow = False diff --git a/fFeatures.py b/fFeatures.py index e94386a..66e3b41 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -1,9 +1,9 @@ -#(c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD -__title__="frameTools objects" -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" +__title__ = "frameTools objects" +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" import FreeCAD, FreeCADGui, Part, csv, fCmd, pCmd, ArchProfile from Arch import makeStructure @@ -19,729 +19,1029 @@ ################ FUNCTIONS ########################### + def newProfile(prop): - ''' - Auxiliary function to create profiles with ArchProfiles - ''' - if prop['stype']=='C': - profile=makeCircle(float(prop['H'])) - else: - profile=ArchProfile.makeProfile([0,'SECTION',prop['SSize']+'-000',prop['stype'],float(prop['W']),float(prop['H']),float(prop['ta']),float(prop['tf'])]) - return profile - -def indexEdge(edge,listedges): - ''' - Auxiliary function to find the index of an edge - ''' - for e in listedges: - if e.isSame(edge): - return listedges.index(e) - return None + """ + Auxiliary function to create profiles with ArchProfiles + """ + if prop["stype"] == "C": + profile = makeCircle(float(prop["H"])) + else: + profile = ArchProfile.makeProfile( + [ + 0, + "SECTION", + prop["SSize"] + "-000", + prop["stype"], + float(prop["W"]), + float(prop["H"]), + float(prop["ta"]), + float(prop["tf"]), + ] + ) + return profile + + +def indexEdge(edge, listedges): + """ + Auxiliary function to find the index of an edge + """ + for e in listedges: + if e.isSame(edge): + return listedges.index(e) + return None + def findFB(beamName=None, baseName=None): - Branches=[o.Name for o in FreeCAD.ActiveDocument.Objects if hasattr(o,'FType') and o.FType=='FrameBranch'] - if beamName: - for name in Branches: - if beamName in FreeCAD.ActiveDocument.getObject(name).Beams: #if beam.Name in activeFB.Beams: - return FreeCAD.ActiveDocument.getObject(name) - elif baseName: - for name in Branches: - if baseName==FreeCAD.ActiveDocument.getObject(name).Base.Name: #if beam.Name in activeFB.Beams: - return FreeCAD.ActiveDocument.getObject(name) - return None + Branches = [ + o.Name + for o in FreeCAD.ActiveDocument.Objects + if hasattr(o, "FType") and o.FType == "FrameBranch" + ] + if beamName: + for name in Branches: + if ( + beamName in FreeCAD.ActiveDocument.getObject(name).Beams + ): # if beam.Name in activeFB.Beams: + return FreeCAD.ActiveDocument.getObject(name) + elif baseName: + for name in Branches: + if ( + baseName == FreeCAD.ActiveDocument.getObject(name).Base.Name + ): # if beam.Name in activeFB.Beams: + return FreeCAD.ActiveDocument.getObject(name) + return None + def refresh(): - for b in [o for o in FreeCAD.ActiveDocument.Objects if hasattr(o,'FType') and o.FType=='FrameBranch']: - b.touch() - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() + for b in [ + o + for o in FreeCAD.ActiveDocument.Objects + if hasattr(o, "FType") and o.FType == "FrameBranch" + ]: + b.touch() + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + ################ DIALOGS ############################# + class frameLineForm(QDialog): - ''' - Dialog for fFeatures management. - From this you can: - - insert a new Frameline object in the model, - - select its profile, - - select its path, - - redraw it, - - clear it. - To select profiles, the 2D objects msut be included insied the "Profiles_set" - group, either created manually or automatically by "Insert Std. Section" - ''' - def __init__(self,winTitle='FrameLine Manager', icon='frameline.svg'): - super(frameLineForm,self).__init__() - self.move(QPoint(100,250)) - self.setWindowFlags(Qt.WindowStaysOnTopHint) - self.setWindowTitle(winTitle) - from PySide.QtGui import QIcon - Icon=QIcon() - iconPath=join(dirname(abspath(__file__)),"iconz",icon) - Icon.addFile(iconPath) - self.setWindowIcon(Icon) - self.mainHL=QHBoxLayout() - self.setLayout(self.mainHL) - self.firstCol=QWidget() - self.firstCol.setLayout(QVBoxLayout()) - self.lab1=QLabel(' Profiles:') - self.firstCol.layout().addWidget(self.lab1) - self.sectList=QListWidget() - self.sectList.setMaximumWidth(120) - self.updateSections() - self.firstCol.layout().addWidget(self.sectList) - self.cb1=QCheckBox(' Copy profile') - self.cb1.setChecked(True) - self.cb2=QCheckBox(' Move to origin') - self.cb2.setChecked(True) - self.radios=QWidget() - self.radios.setLayout(QFormLayout()) - self.radios.layout().setAlignment(Qt.AlignHCenter) - self.radios.layout().addRow(self.cb1) - self.radios.layout().addRow(self.cb2) - self.firstCol.layout().addWidget(self.radios) - self.mainHL.addWidget(self.firstCol) - self.secondCol=QWidget() - self.secondCol.setLayout(QVBoxLayout()) - self.current=None - self.combo=QComboBox() - self.combo.addItem('') - #self.combo.activated[str].connect(self.setCurrent) - try: - self.combo.addItems([o.Label for o in FreeCAD.activeDocument().Objects if hasattr(o,'FType') and o.FType=='FrameLine']) - except: - None - self.combo.setMaximumWidth(100) - self.combo.currentIndexChanged.connect(self.setCurrentFL) - if FreeCAD.__activeFrameLine__ and FreeCAD.__activeFrameLine__ in [self.combo.itemText(i) for i in range(self.combo.count())]: - self.combo.setCurrentIndex(self.combo.findText(FreeCAD.__activeFrameLine__)) - self.secondCol.layout().addWidget(self.combo) - self.btn0=QPushButton('Insert') - self.btn0.setMaximumWidth(100) - self.secondCol.layout().addWidget(self.btn0) - self.btn0.clicked.connect(self.insert) - self.edit1=QLineEdit() - self.edit1.setPlaceholderText('') - self.edit1.setAlignment(Qt.AlignHCenter) - self.edit1.setMaximumWidth(100) - self.secondCol.layout().addWidget(self.edit1) - self.btn1=QPushButton('Redraw') - self.btn1.clicked.connect(self.redraw) - self.btn1.setMaximumWidth(100) - self.secondCol.layout().addWidget(self.btn1) - self.btn2=QPushButton('Get Path') - self.btn2.clicked.connect(self.getPath) - self.btn2.setMaximumWidth(100) - self.secondCol.layout().addWidget(self.btn2) - self.btn3=QPushButton('Get Profile') - self.btn3.clicked.connect(self.getProfile) - self.btn3.setMaximumWidth(100) - self.secondCol.layout().addWidget(self.btn3) - self.btn4=QPushButton('Clear') - self.btn4.clicked.connect(self.clear) - self.btn4.setMaximumWidth(100) - self.secondCol.layout().addWidget(self.btn4) - self.mainHL.addWidget(self.secondCol) - self.show() - def setCurrentFL(self,FLName=None): - if self.combo.currentText() not in ['','']: - FreeCAD.__activeFrameLine__= self.combo.currentText() - self.current=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] - FreeCAD.Console.PrintMessage('current FrameLine = '+self.current.Label+'\n') - if self.current.Profile: - FreeCAD.Console.PrintMessage('Profile: %s\n'%self.current.Profile.Label) - else: - FreeCAD.Console.PrintMessage('Profile not defined\n') - if self.current.Base: - FreeCAD.Console.PrintMessage('Path: %s\n'%self.current.Base.Label) - else: - FreeCAD.Console.PrintMessage('Path not defined\n') - else: - FreeCAD.__activeFrameLine__=None - self.current=None - FreeCAD.Console.PrintMessage('current FrameLine = None\n') - def updateSections(self): - self.sectList.clear() - result=FreeCAD.ActiveDocument.findObjects("App::DocumentObjectGroup","Profiles_set") - if result: - self.sectList.addItems([o.Label for o in result[0].OutList if hasattr(o,'Shape') and ((type(o.Shape)==Part.Wire and o.Shape.isClosed()) or (type(o.Shape)==Part.Face and type(o.Shape.Surface)==Part.Plane))]) - if self.sectList.count(): - self.sectList.setCurrentRow(0) - else: - FreeCAD.Console.PrintError('No set of profiles in this document.\nCreate the sections first.\n') - def setCurrent(self,flname): - if flname!='': - self.current=FreeCAD.ActiveDocument.getObjectsByLabel(flname)[0] - FreeCAD.Console.PrintMessage('current FrameLine = '+self.current.Label+'\n') - else: - self.current=None - FreeCAD.Console.PrintMessage('current FrameLine = None\n') - def insert(self): - from pCmd import moveToPyLi - if self.combo.currentText()=='': - name=self.edit1.text() - if not name: name='Telaio' - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name) - FrameLine(a) - a.ViewObject.Proxy=0 - self.combo.addItem(a.Label) - self.combo.setCurrentIndex(self.combo.count()-1) - if self.sectList.selectedItems(): - self.getProfile() - elif self.sectList.selectedItems(): - prof= FreeCAD.ActiveDocument.getObjectsByLabel(self.sectList.selectedItems()[0].text())[0] - for e in fCmd.edges(): - if self.cb1.isChecked(): - s=makeStructure(FreeCAD.ActiveDocument.copyObject(prof)) + """ + Dialog for fFeatures management. + From this you can: + - insert a new Frameline object in the model, + - select its profile, + - select its path, + - redraw it, + - clear it. + To select profiles, the 2D objects msut be included insied the "Profiles_set" + group, either created manually or automatically by "Insert Std. Section" + """ + + def __init__(self, winTitle="FrameLine Manager", icon="frameline.svg"): + super(frameLineForm, self).__init__() + self.move(QPoint(100, 250)) + self.setWindowFlags(Qt.WindowStaysOnTopHint) + self.setWindowTitle(winTitle) + from PySide.QtGui import QIcon + + Icon = QIcon() + iconPath = join(dirname(abspath(__file__)), "iconz", icon) + Icon.addFile(iconPath) + self.setWindowIcon(Icon) + self.mainHL = QHBoxLayout() + self.setLayout(self.mainHL) + self.firstCol = QWidget() + self.firstCol.setLayout(QVBoxLayout()) + self.lab1 = QLabel(" Profiles:") + self.firstCol.layout().addWidget(self.lab1) + self.sectList = QListWidget() + self.sectList.setMaximumWidth(120) + self.updateSections() + self.firstCol.layout().addWidget(self.sectList) + self.cb1 = QCheckBox(" Copy profile") + self.cb1.setChecked(True) + self.cb2 = QCheckBox(" Move to origin") + self.cb2.setChecked(True) + self.radios = QWidget() + self.radios.setLayout(QFormLayout()) + self.radios.layout().setAlignment(Qt.AlignHCenter) + self.radios.layout().addRow(self.cb1) + self.radios.layout().addRow(self.cb2) + self.firstCol.layout().addWidget(self.radios) + self.mainHL.addWidget(self.firstCol) + self.secondCol = QWidget() + self.secondCol.setLayout(QVBoxLayout()) + self.current = None + self.combo = QComboBox() + self.combo.addItem("") + # self.combo.activated[str].connect(self.setCurrent) + try: + self.combo.addItems( + [ + o.Label + for o in FreeCAD.activeDocument().Objects + if hasattr(o, "FType") and o.FType == "FrameLine" + ] + ) + except: + None + self.combo.setMaximumWidth(100) + self.combo.currentIndexChanged.connect(self.setCurrentFL) + if FreeCAD.__activeFrameLine__ and FreeCAD.__activeFrameLine__ in [ + self.combo.itemText(i) for i in range(self.combo.count()) + ]: + self.combo.setCurrentIndex(self.combo.findText(FreeCAD.__activeFrameLine__)) + self.secondCol.layout().addWidget(self.combo) + self.btn0 = QPushButton("Insert") + self.btn0.setMaximumWidth(100) + self.secondCol.layout().addWidget(self.btn0) + self.btn0.clicked.connect(self.insert) + self.edit1 = QLineEdit() + self.edit1.setPlaceholderText("") + self.edit1.setAlignment(Qt.AlignHCenter) + self.edit1.setMaximumWidth(100) + self.secondCol.layout().addWidget(self.edit1) + self.btn1 = QPushButton("Redraw") + self.btn1.clicked.connect(self.redraw) + self.btn1.setMaximumWidth(100) + self.secondCol.layout().addWidget(self.btn1) + self.btn2 = QPushButton("Get Path") + self.btn2.clicked.connect(self.getPath) + self.btn2.setMaximumWidth(100) + self.secondCol.layout().addWidget(self.btn2) + self.btn3 = QPushButton("Get Profile") + self.btn3.clicked.connect(self.getProfile) + self.btn3.setMaximumWidth(100) + self.secondCol.layout().addWidget(self.btn3) + self.btn4 = QPushButton("Clear") + self.btn4.clicked.connect(self.clear) + self.btn4.setMaximumWidth(100) + self.secondCol.layout().addWidget(self.btn4) + self.mainHL.addWidget(self.secondCol) + self.show() + + def setCurrentFL(self, FLName=None): + if self.combo.currentText() not in ["", ""]: + FreeCAD.__activeFrameLine__ = self.combo.currentText() + self.current = FreeCAD.ActiveDocument.getObjectsByLabel( + self.combo.currentText() + )[0] + FreeCAD.Console.PrintMessage( + "current FrameLine = " + self.current.Label + "\n" + ) + if self.current.Profile: + FreeCAD.Console.PrintMessage( + "Profile: %s\n" % self.current.Profile.Label + ) + else: + FreeCAD.Console.PrintMessage("Profile not defined\n") + if self.current.Base: + FreeCAD.Console.PrintMessage("Path: %s\n" % self.current.Base.Label) + else: + FreeCAD.Console.PrintMessage("Path not defined\n") else: - s=makeStructure(prof) - fCmd.placeTheBeam(s,e) - moveToPyLi(s,self.current.Name) - FreeCAD.ActiveDocument.recompute() - def redraw(self): - if self.current and self.current.Profile and self.current.Base: - if self.cb1.isChecked(): - self.current.Proxy.update(self.current) - else: - self.current.Proxy.update(self.current, copyProfile=False) - self.updateSections() - else: - FreeCAD.Console.PrintError('Select a Path and a Profile before\n') - def clear(self): - if self.current: - self.current.Proxy.purge(self.current) - self.updateSections() - def getPath(self): - if self.current: - sel=FreeCADGui.Selection.getSelection() - if sel: - base=sel[0] - if base.TypeId in ['Part::Part2DObjectPython','Sketcher::SketchObject']: - self.current.Base=base - FreeCAD.Console.PrintWarning(self.current.Label+' base set to '+base.TypeId.split('::')[1]+'.\n') + FreeCAD.__activeFrameLine__ = None + self.current = None + FreeCAD.Console.PrintMessage("current FrameLine = None\n") + + def updateSections(self): + self.sectList.clear() + result = FreeCAD.ActiveDocument.findObjects( + "App::DocumentObjectGroup", "Profiles_set" + ) + if result: + self.sectList.addItems( + [ + o.Label + for o in result[0].OutList + if hasattr(o, "Shape") + and ( + (type(o.Shape) == Part.Wire and o.Shape.isClosed()) + or ( + type(o.Shape) == Part.Face + and type(o.Shape.Surface) == Part.Plane + ) + ) + ] + ) + if self.sectList.count(): + self.sectList.setCurrentRow(0) + else: + FreeCAD.Console.PrintError( + "No set of profiles in this document.\nCreate the sections first.\n" + ) + + def setCurrent(self, flname): + if flname != "": + self.current = FreeCAD.ActiveDocument.getObjectsByLabel(flname)[0] + FreeCAD.Console.PrintMessage( + "current FrameLine = " + self.current.Label + "\n" + ) + else: + self.current = None + FreeCAD.Console.PrintMessage("current FrameLine = None\n") + + def insert(self): + from pCmd import moveToPyLi + + if self.combo.currentText() == "": + name = self.edit1.text() + if not name: + name = "Telaio" + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", name) + FrameLine(a) + a.ViewObject.Proxy = 0 + self.combo.addItem(a.Label) + self.combo.setCurrentIndex(self.combo.count() - 1) + if self.sectList.selectedItems(): + self.getProfile() + elif self.sectList.selectedItems(): + prof = FreeCAD.ActiveDocument.getObjectsByLabel( + self.sectList.selectedItems()[0].text() + )[0] + for e in fCmd.edges(): + if self.cb1.isChecked(): + s = makeStructure(FreeCAD.ActiveDocument.copyObject(prof)) + else: + s = makeStructure(prof) + fCmd.placeTheBeam(s, e) + moveToPyLi(s, self.current.Name) + FreeCAD.ActiveDocument.recompute() + + def redraw(self): + if self.current and self.current.Profile and self.current.Base: + if self.cb1.isChecked(): + self.current.Proxy.update(self.current) + else: + self.current.Proxy.update(self.current, copyProfile=False) + self.updateSections() else: - FreeCAD.Console.PrintError('Not a Wire nor Sketch\n') - else: - self.current.Base=None - FreeCAD.Console.PrintWarning(self.current.Label+' base set to None.\n') - def getProfile(self): - if self.current: - if fCmd.beams(): - self.current.Profile=fCmd.beams()[0].Base - elif self.sectList.selectedItems(): - prof= FreeCAD.ActiveDocument.getObjectsByLabel(self.sectList.selectedItems()[0].text())[0] - if prof.Shape.ShapeType=='Wire' and self.cb2.isChecked(): - prof.Placement.move(FreeCAD.Vector(0,0,0)-prof.Shape.CenterOfMass) - prof.Placement.Rotation=FreeCAD.Base.Rotation() - self.current.Profile=prof + FreeCAD.Console.PrintError("Select a Path and a Profile before\n") + + def clear(self): + if self.current: + self.current.Proxy.purge(self.current) + self.updateSections() + + def getPath(self): + if self.current: + sel = FreeCADGui.Selection.getSelection() + if sel: + base = sel[0] + if base.TypeId in [ + "Part::Part2DObjectPython", + "Sketcher::SketchObject", + ]: + self.current.Base = base + FreeCAD.Console.PrintWarning( + self.current.Label + + " base set to " + + base.TypeId.split("::")[1] + + ".\n" + ) + else: + FreeCAD.Console.PrintError("Not a Wire nor Sketch\n") + else: + self.current.Base = None + FreeCAD.Console.PrintWarning( + self.current.Label + " base set to None.\n" + ) + + def getProfile(self): + if self.current: + if fCmd.beams(): + self.current.Profile = fCmd.beams()[0].Base + elif self.sectList.selectedItems(): + prof = FreeCAD.ActiveDocument.getObjectsByLabel( + self.sectList.selectedItems()[0].text() + )[0] + if prof.Shape.ShapeType == "Wire" and self.cb2.isChecked(): + prof.Placement.move( + FreeCAD.Vector(0, 0, 0) - prof.Shape.CenterOfMass + ) + prof.Placement.Rotation = FreeCAD.Base.Rotation() + self.current.Profile = prof + class insertSectForm(QWidget): - ''' dialog for Arch.makeProfile - This allows to create in the model the 2D profiles to be used - for beams objects. - It creates a group named "Profiles_set where the 2D objects are - conveniently gathered and retrieved by the Frameline Manager. - NOTE: It's also possible to create customized 2D profiles and drag-and-drop - them inside this group." - ''' - def __init__(self,winTitle='Insert section', icon='dodo.svg'): - ''' - __init__(self,winTitle='Title',icon='filename.svg') - ''' - super(insertSectForm,self).__init__() - self.move(QPoint(100,250)) - self.setWindowFlags(Qt.WindowStaysOnTopHint) - self.setWindowTitle(winTitle) - iconPath=join(dirname(abspath(__file__)),"iconz",icon) - from PySide.QtGui import QIcon - Icon=QIcon() - Icon.addFile(iconPath) - self.setWindowIcon(Icon) - self.mainHL=QHBoxLayout() - self.setLayout(self.mainHL) - self.firstCol=QWidget() - self.firstCol.setLayout(QVBoxLayout()) - self.mainHL.addWidget(self.firstCol) - self.SType='IPE' - self.currentRatingLab=QLabel('Section: '+self.SType) - self.firstCol.layout().addWidget(self.currentRatingLab) - self.sizeList=QListWidget() - self.sizeList.setMaximumWidth(120) - self.firstCol.layout().addWidget(self.sizeList) - self.sectDictList=[] - self.fileList=listdir(join(dirname(abspath(__file__)),"tablez")) - self.fillSizes() - self.PRatingsList=[s.lstrip("Section_").rstrip(".csv") for s in self.fileList if s.startswith("Section")] - self.secondCol=QWidget() - self.secondCol.setLayout(QVBoxLayout()) - self.lab1=QLabel('Section types:') - self.secondCol.layout().addWidget(self.lab1) - self.ratingList=QListWidget() - self.ratingList.setMaximumWidth(100) - self.ratingList.addItems(self.PRatingsList) - self.ratingList.itemClicked.connect(self.changeRating) - self.ratingList.setCurrentRow(0) - self.secondCol.layout().addWidget(self.ratingList) - self.btn1=QPushButton('Insert') - self.btn1.setMaximumWidth(100) - self.btn1.clicked.connect(self.insert) - self.secondCol.layout().addWidget(self.btn1) - self.mainHL.addWidget(self.secondCol) - self.show() - def fillSizes(self): - self.sizeList.clear() - for fileName in self.fileList: - if fileName=='Section_'+self.SType+'.csv': - f=open(join(dirname(abspath(__file__)),"tablez",fileName),'r') - reader=csv.DictReader(f,delimiter=';') - self.sectDictList=[x for x in reader] - f.close() - for row in self.sectDictList: - s=row['SSize'] - self.sizeList.addItem(s) - def changeRating(self,item): - self.SType=item.text() - self.currentRatingLab.setText('Section: '+self.SType) - self.fillSizes() - def insert(self): # insert the section - result=FreeCAD.ActiveDocument.findObjects("App::DocumentObjectGroup","Profiles_set") - if result: - group= result[0] - else: - group=FreeCAD.activeDocument().addObject("App::DocumentObjectGroup","Profiles_set") - if self.sizeList.selectedItems(): - prop=self.sectDictList[self.sizeList.currentRow()] - if prop['stype']=='C': - s=makeCircle(float(prop['H'])) - else: - s=ArchProfile.makeProfile([0,'SECTION',prop['SSize']+'-000',prop['stype'],float(prop['W']),float(prop['H']),float(prop['ta']),float(prop['tf'])]) - group.addObject(s) - FreeCAD.activeDocument().recompute() + """dialog for Arch.makeProfile + This allows to create in the model the 2D profiles to be used + for beams objects. + It creates a group named "Profiles_set where the 2D objects are + conveniently gathered and retrieved by the Frameline Manager. + NOTE: It's also possible to create customized 2D profiles and drag-and-drop + them inside this group." + """ + + def __init__(self, winTitle="Insert section", icon="dodo.svg"): + """ + __init__(self,winTitle='Title',icon='filename.svg') + """ + super(insertSectForm, self).__init__() + self.move(QPoint(100, 250)) + self.setWindowFlags(Qt.WindowStaysOnTopHint) + self.setWindowTitle(winTitle) + iconPath = join(dirname(abspath(__file__)), "iconz", icon) + from PySide.QtGui import QIcon + + Icon = QIcon() + Icon.addFile(iconPath) + self.setWindowIcon(Icon) + self.mainHL = QHBoxLayout() + self.setLayout(self.mainHL) + self.firstCol = QWidget() + self.firstCol.setLayout(QVBoxLayout()) + self.mainHL.addWidget(self.firstCol) + self.SType = "IPE" + self.currentRatingLab = QLabel("Section: " + self.SType) + self.firstCol.layout().addWidget(self.currentRatingLab) + self.sizeList = QListWidget() + self.sizeList.setMaximumWidth(120) + self.firstCol.layout().addWidget(self.sizeList) + self.sectDictList = [] + self.fileList = listdir(join(dirname(abspath(__file__)), "tablez")) + self.fillSizes() + self.PRatingsList = [ + s.lstrip("Section_").rstrip(".csv") + for s in self.fileList + if s.startswith("Section") + ] + self.secondCol = QWidget() + self.secondCol.setLayout(QVBoxLayout()) + self.lab1 = QLabel("Section types:") + self.secondCol.layout().addWidget(self.lab1) + self.ratingList = QListWidget() + self.ratingList.setMaximumWidth(100) + self.ratingList.addItems(self.PRatingsList) + self.ratingList.itemClicked.connect(self.changeRating) + self.ratingList.setCurrentRow(0) + self.secondCol.layout().addWidget(self.ratingList) + self.btn1 = QPushButton("Insert") + self.btn1.setMaximumWidth(100) + self.btn1.clicked.connect(self.insert) + self.secondCol.layout().addWidget(self.btn1) + self.mainHL.addWidget(self.secondCol) + self.show() + + def fillSizes(self): + self.sizeList.clear() + for fileName in self.fileList: + if fileName == "Section_" + self.SType + ".csv": + f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") + reader = csv.DictReader(f, delimiter=";") + self.sectDictList = [x for x in reader] + f.close() + for row in self.sectDictList: + s = row["SSize"] + self.sizeList.addItem(s) + + def changeRating(self, item): + self.SType = item.text() + self.currentRatingLab.setText("Section: " + self.SType) + self.fillSizes() + + def insert(self): # insert the section + result = FreeCAD.ActiveDocument.findObjects( + "App::DocumentObjectGroup", "Profiles_set" + ) + if result: + group = result[0] + else: + group = FreeCAD.activeDocument().addObject( + "App::DocumentObjectGroup", "Profiles_set" + ) + if self.sizeList.selectedItems(): + prop = self.sectDictList[self.sizeList.currentRow()] + if prop["stype"] == "C": + s = makeCircle(float(prop["H"])) + else: + s = ArchProfile.makeProfile( + [ + 0, + "SECTION", + prop["SSize"] + "-000", + prop["stype"], + float(prop["W"]), + float(prop["H"]), + float(prop["ta"]), + float(prop["tf"]), + ] + ) + group.addObject(s) + FreeCAD.activeDocument().recompute() + import dodoDialogs + class frameBranchForm(dodoDialogs.protoTypeDialog): - 'dialog for framebranches' - def __init__(self): - super(frameBranchForm,self).__init__('fbranch.ui') - self.sectDictList=[] # list (sizes) of properties (dictionaries) of the current type of section - self.form.editAngle.setValidator(QDoubleValidator()) - self.form.editAngle.editingFinished.connect(self.changeAngle) - self.form.editHead.setValidator(QDoubleValidator()) - self.form.editHead.editingFinished.connect(self.changeHeadOffset) - self.form.editTail.setValidator(QDoubleValidator()) - self.form.editTail.editingFinished.connect(self.changeTailOffset) - self.form.editLength.setValidator(QDoubleValidator()) - tablez=listdir(join(dirname(abspath(__file__)),"tablez")) - files=[name for name in tablez if name.startswith("Section")] - RatingsList=[s.lstrip("Section_").rstrip(".csv") for s in files] - self.form.comboRatings.addItems(RatingsList) - self.form.comboRatings.addItems(['']) - self.form.comboRatings.currentIndexChanged.connect(self.fillSizes) - self.form.btnRemove.clicked.connect(self.removeBeams) - self.form.btnAdd.clicked.connect(self.addBeams) - self.form.btnProfile.clicked.connect(self.changeProfile) - self.form.btnRefresh.clicked.connect(self.refresh) - self.form.btnTargets.clicked.connect(self.selectAction) - self.form.btnTrim.clicked.connect(self.trim) - self.form.btnSingle.clicked.connect(self.makeSingle) - self.form.sliTail.valueChanged.connect(self.stretchTail) - self.form.sliHead.valueChanged.connect(self.stretchHead) - self.form.dialAngle.valueChanged.connect(self.spinAngle) - self.fillSizes() - self.targets=list() - self.labTail=None - self.actionX.triggered.disconnect(self.accept) # disconnect from accept() - self.actionX.triggered.connect(self.trim) # reconnect to trim() - def makeSingle(self): - FreeCAD.activeDocument().openTransaction('Insert Single Struct') - if self.SType=='': - profile=FreeCAD.ActiveDocument.getObjectsByLabel(self.form.listSizes.currentItem().text())[0] - else: - prop=self.sectDictList[self.form.listSizes.currentRow()] - profile=newProfile(prop) - if fCmd.faces(): - Z=FreeCAD.Vector(0,0,1) - for f in fCmd.faces(): - beam=makeStructure(profile) - beam.Placement=FreeCAD.Placement(f.CenterOfMass,FreeCAD.Rotation(Z,f.normalAt(0,0))) - if self.form.editLength.text(): beam.Height=float(self.form.editLength.text()) - elif fCmd.edges(): - for e in fCmd.edges(): - beam=makeStructure(profile) - fCmd.placeTheBeam(beam,e) - if self.form.editLength.text(): beam.Height=float(self.form.editLength.text()) - elif [v for sx in FreeCADGui.Selection.getSelectionEx() for so in sx.SubObjects for v in so.Vertexes]: - vs=[v for sx in FreeCADGui.Selection.getSelectionEx() for so in sx.SubObjects for v in so.Vertexes] - for v in vs: - beam=makeStructure(profile) - beam.Placement.Base=v.Point - else: - beam=makeStructure(profile) - if self.form.editLength.text(): beam.Height=float(self.form.editLength.text()) - FreeCAD.ActiveDocument.recompute() - def accept(self): - if FreeCAD.ActiveDocument: - # GET BASE - bases=[b for b in FreeCADGui.Selection.getSelection() if hasattr(b,'Shape')] - if bases and self.form.listSizes.selectedItems(): - FreeCAD.activeDocument().openTransaction('Insert FrameBranch') - if self.SType=='': - profile=FreeCAD.ActiveDocument.getObjectsByLabel(self.form.listSizes.currentItem().text())[0] + "dialog for framebranches" + + def __init__(self): + super(frameBranchForm, self).__init__("fbranch.ui") + self.sectDictList = [] # list (sizes) of properties (dictionaries) of the current type of section + self.form.editAngle.setValidator(QDoubleValidator()) + self.form.editAngle.editingFinished.connect(self.changeAngle) + self.form.editHead.setValidator(QDoubleValidator()) + self.form.editHead.editingFinished.connect(self.changeHeadOffset) + self.form.editTail.setValidator(QDoubleValidator()) + self.form.editTail.editingFinished.connect(self.changeTailOffset) + self.form.editLength.setValidator(QDoubleValidator()) + tablez = listdir(join(dirname(abspath(__file__)), "tablez")) + files = [name for name in tablez if name.startswith("Section")] + RatingsList = [s.lstrip("Section_").rstrip(".csv") for s in files] + self.form.comboRatings.addItems(RatingsList) + self.form.comboRatings.addItems([""]) + self.form.comboRatings.currentIndexChanged.connect(self.fillSizes) + self.form.btnRemove.clicked.connect(self.removeBeams) + self.form.btnAdd.clicked.connect(self.addBeams) + self.form.btnProfile.clicked.connect(self.changeProfile) + self.form.btnRefresh.clicked.connect(self.refresh) + self.form.btnTargets.clicked.connect(self.selectAction) + self.form.btnTrim.clicked.connect(self.trim) + self.form.btnSingle.clicked.connect(self.makeSingle) + self.form.sliTail.valueChanged.connect(self.stretchTail) + self.form.sliHead.valueChanged.connect(self.stretchHead) + self.form.dialAngle.valueChanged.connect(self.spinAngle) + self.fillSizes() + self.targets = list() + self.labTail = None + self.actionX.triggered.disconnect(self.accept) # disconnect from accept() + self.actionX.triggered.connect(self.trim) # reconnect to trim() + + def makeSingle(self): + FreeCAD.activeDocument().openTransaction("Insert Single Struct") + if self.SType == "": + profile = FreeCAD.ActiveDocument.getObjectsByLabel( + self.form.listSizes.currentItem().text() + )[0] else: - prop=self.sectDictList[self.form.listSizes.currentRow()] - profile=newProfile(prop) - # MAKE FRAMEBRANCH - if self.form.editName.text(): - name=self.form.editName.text() + prop = self.sectDictList[self.form.listSizes.currentRow()] + profile = newProfile(prop) + if fCmd.faces(): + Z = FreeCAD.Vector(0, 0, 1) + for f in fCmd.faces(): + beam = makeStructure(profile) + beam.Placement = FreeCAD.Placement( + f.CenterOfMass, FreeCAD.Rotation(Z, f.normalAt(0, 0)) + ) + if self.form.editLength.text(): + beam.Height = float(self.form.editLength.text()) + elif fCmd.edges(): + for e in fCmd.edges(): + beam = makeStructure(profile) + fCmd.placeTheBeam(beam, e) + if self.form.editLength.text(): + beam.Height = float(self.form.editLength.text()) + elif [ + v + for sx in FreeCADGui.Selection.getSelectionEx() + for so in sx.SubObjects + for v in so.Vertexes + ]: + vs = [ + v + for sx in FreeCADGui.Selection.getSelectionEx() + for so in sx.SubObjects + for v in so.Vertexes + ] + for v in vs: + beam = makeStructure(profile) + beam.Placement.Base = v.Point else: - name='Travatura' - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name) - FrameBranch(a,bases[0],profile) - ViewProviderFrameBranch(a.ViewObject) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().recompute() - def reject(self): # redefined to remove label from the scene - if self.labTail: - self.labTail.removeLabel() - super(frameBranchForm,self).reject() - def selectAction(self): - self.targets=[] - selex=FreeCADGui.Selection.getSelectionEx() - shapes=[(sx.SubObjects[0],sx.Object.Label) for sx in selex if sx.SubObjects] - for shape in shapes: - self.targets.append(shape[0]) - if len(shapes)>1: - self.form.lab2.setText('') - else: - self.form.lab2.setText(shapes[0][1]+': '+shapes[0][0].ShapeType) - def mouseActionB1(self, CtrlAltShift): - v = FreeCADGui.ActiveDocument.ActiveView - i = v.getObjectInfo(v.getCursorPos()) - if i: - labText=i['Object'] - obj=FreeCAD.ActiveDocument.getObject(i['Object']) - if hasattr(obj,'tailOffset') and hasattr(obj,'headOffset') and hasattr(obj,'spin'): - self.form.editTail.setText(str(obj.tailOffset)) - self.form.editHead.setText(str(obj.headOffset)) - self.form.editAngle.setText(str(obj.spin)) - fb=findFB(i['Object']) - if fb: - labText+=': part of '+fb.Label - if self.labTail: - self.labTail.removeLabel() - self.labTail=label3D(pl=obj.Placement, text='____TAIL') - else: + beam = makeStructure(profile) + if self.form.editLength.text(): + beam.Height = float(self.form.editLength.text()) + FreeCAD.ActiveDocument.recompute() + + def accept(self): + if FreeCAD.ActiveDocument: + # GET BASE + bases = [ + b for b in FreeCADGui.Selection.getSelection() if hasattr(b, "Shape") + ] + if bases and self.form.listSizes.selectedItems(): + FreeCAD.activeDocument().openTransaction("Insert FrameBranch") + if self.SType == "": + profile = FreeCAD.ActiveDocument.getObjectsByLabel( + self.form.listSizes.currentItem().text() + )[0] + else: + prop = self.sectDictList[self.form.listSizes.currentRow()] + profile = newProfile(prop) + # MAKE FRAMEBRANCH + if self.form.editName.text(): + name = self.form.editName.text() + else: + name = "Travatura" + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", name) + FrameBranch(a, bases[0], profile) + ViewProviderFrameBranch(a.ViewObject) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().recompute() + + def reject(self): # redefined to remove label from the scene if self.labTail: - self.labTail.removeLabel() - self.labTail=label3D(pl=FreeCAD.Placement(), text='') - self.form.editTail.clear() - self.form.editHead.clear() - self.form.editAngle.clear() - self.form.sliHead.setValue(0) - self.form.sliTail.setValue(0) - self.form.dialAngle.setValue(0) - self.form.lab1.setText(labText) - else: - if self.labTail: - self.labTail.removeLabel() - self.labTail=label3D(pl=FreeCAD.Placement(), text='') - self.form.sliHead.setValue(0) - self.form.sliTail.setValue(0) - self.form.dialAngle.setValue(0) - self.form.lab1.setText('') - def fillSizes(self): - self.SType=self.form.comboRatings.currentText() - self.form.listSizes.clear() - if self.SType=='': - self.form.listSizes.addItems([s.Label for s in FreeCAD.ActiveDocument.Objects if s.TypeId=='Sketcher::SketchObject']) - obj2D=[s.Label for s in FreeCAD.ActiveDocument.Objects if hasattr (s,'Shape') and s.Shape.Faces and not s.Shape.Solids] - self.form.listSizes.addItems(obj2D) - else: - fileName = "Section_"+self.SType+".csv" - f=open(join(dirname(abspath(__file__)),"tablez",fileName),'r') - reader=csv.DictReader(f,delimiter=';') - self.sectDictList=[x for x in reader] - f.close() - for row in self.sectDictList: - s=row['SSize'] - self.form.listSizes.addItem(s) - def addBeams(self): - # find selected FB - try: - FB=findFB(baseName=FreeCADGui.Selection.getSelection()[0].Name) - except: - return - if FB: - beamsList=FB.Beams - for edge in fCmd.edges(): - i=indexEdge(edge,FB.Base.Shape.Edges) - beam=makeStructure(FB.Profile) - beam.addProperty("App::PropertyFloat","tailOffset","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The extension of the tail")) - beam.addProperty("App::PropertyFloat","headOffset","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The extension of the head")) - beam.addProperty("App::PropertyFloat","spin","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The rotation of the section")) - if int(FreeCAD.Version()[1])>19: #20220704 - beam.addExtension("Part::AttachExtensionPython") + self.labTail.removeLabel() + super(frameBranchForm, self).reject() + + def selectAction(self): + self.targets = [] + selex = FreeCADGui.Selection.getSelectionEx() + shapes = [(sx.SubObjects[0], sx.Object.Label) for sx in selex if sx.SubObjects] + for shape in shapes: + self.targets.append(shape[0]) + if len(shapes) > 1: + self.form.lab2.setText("") else: - beam.addExtension("Part::AttachExtensionPython",beam) - beam.Support=[(FB.Base,'Edge'+str(i+1))] - beam.MapMode='NormalToEdge' - beam.MapReversed=True - beamsList[i]=str(beam.Name) - FB.Beams=beamsList - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() - def removeBeams(self): - for beam in fCmd.beams(): - FB=findFB(beamName=beam.Name) - if FB: - i=FB.Beams.index(beam.Name) - FB.Proxy.remove(i) - def changeProfile(self): - # find selected FB - try: - FB=findFB(baseName=FreeCADGui.Selection.getSelection()[0].Name) - if not FB: - FB=findFB(beamName=fCmd.beams()[0].Name) - except: - FreeCAD.Console.PrintError('Nothing selected\n') - return - if FB and self.form.listSizes.selectedItems(): - if self.SType=='': - profile=FreeCAD.ActiveDocument.getObjectsByLabel(self.form.listSizes.currentItem().text())[0] - else: - prop=self.sectDictList[self.form.listSizes.currentRow()] - profile=newProfile(prop) - name=FB.Profile.Name - FB.Profile=profile - FB.Proxy.redraw(FB) - FreeCAD.ActiveDocument.removeObject(name) - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() - else: - FreeCAD.Console.PrintError('No frameBranch or profile selected\n') - def changeHeadOffset(self): - for beam in fCmd.beams(): - if hasattr(beam,'headOffset'): - beam.headOffset=float(self.form.editHead.text()) - FB=findFB(beam.Name) - FB.touch() - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() - def changeTailOffset(self): - for beam in fCmd.beams(): - if hasattr(beam,'tailOffset'): - beam.tailOffset=float(self.form.editTail.text()) - FB=findFB(beam.Name) - FB.touch() - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() - def changeAngle(self): - for beam in fCmd.beams(): - if hasattr(beam,'spin'): - FB=findFB(beam.Name) - beam.spin=float(self.form.editAngle.text()) - FB.touch() - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() - def stretchTail(self): - beams=fCmd.beams() - if beams: - L=float(beams[0].Height)/2 - ext=L*(self.form.sliTail.value()/100.0) - self.form.editTail.setText("%.3f" %ext) - self.changeTailOffset() - def stretchHead(self): - beams=fCmd.beams() - if beams: - L=float(beams[0].Height)/2 - ext=L*(self.form.sliHead.value()/100.0) - self.form.editHead.setText("%.3f" %ext) - self.changeHeadOffset() - def spinAngle(self): - self.form.editAngle.setText(str(self.form.dialAngle.value())) - self.changeAngle() - def trim(self): - FreeCAD.ActiveDocument.openTransaction('Trim FB') - for target in self.targets: - for b in fCmd.beams(): - if hasattr(b,'tailOffset') and hasattr(b,'headOffset'): - edge=b.Support[0][0].Shape.getElement(b.Support[0][1][0]) - ax=edge.tangentAt(0).normalize() #fCmd.beamAx(b).normalize() - tail=edge.valueAt(0) #b.Placement.Base - head=edge.valueAt(edge.LastParameter) #tail+ax*float(b.Height) - if target.ShapeType=="Vertex": - P=target.Point - elif target.ShapeType=="Face" and not fCmd.isOrtho(target,ax): - P=fCmd.intersectionPlane(tail,ax,target) - elif hasattr(target,"CenterOfMass"): - P=target.CenterOfMass - else: - P=None - if P: - deltaTail=(P-tail).dot(ax) - deltaHead=(P-head).dot(ax) - if abs(deltaTail)") + + def fillSizes(self): + self.SType = self.form.comboRatings.currentText() + self.form.listSizes.clear() + if self.SType == "": + self.form.listSizes.addItems( + [ + s.Label + for s in FreeCAD.ActiveDocument.Objects + if s.TypeId == "Sketcher::SketchObject" + ] + ) + obj2D = [ + s.Label + for s in FreeCAD.ActiveDocument.Objects + if hasattr(s, "Shape") and s.Shape.Faces and not s.Shape.Solids + ] + self.form.listSizes.addItems(obj2D) + else: + fileName = "Section_" + self.SType + ".csv" + f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") + reader = csv.DictReader(f, delimiter=";") + self.sectDictList = [x for x in reader] + f.close() + for row in self.sectDictList: + s = row["SSize"] + self.form.listSizes.addItem(s) + + def addBeams(self): + # find selected FB + try: + FB = findFB(baseName=FreeCADGui.Selection.getSelection()[0].Name) + except: + return + if FB: + beamsList = FB.Beams + for edge in fCmd.edges(): + i = indexEdge(edge, FB.Base.Shape.Edges) + beam = makeStructure(FB.Profile) + beam.addProperty( + "App::PropertyFloat", + "tailOffset", + "FrameBranch", + QT_TRANSLATE_NOOP( + "App::PropertyFloat", "The extension of the tail" + ), + ) + beam.addProperty( + "App::PropertyFloat", + "headOffset", + "FrameBranch", + QT_TRANSLATE_NOOP( + "App::PropertyFloat", "The extension of the head" + ), + ) + beam.addProperty( + "App::PropertyFloat", + "spin", + "FrameBranch", + QT_TRANSLATE_NOOP( + "App::PropertyFloat", "The rotation of the section" + ), + ) + if int(FreeCAD.Version()[1]) > 19: # 20220704 + beam.addExtension("Part::AttachExtensionPython") + else: + beam.addExtension("Part::AttachExtensionPython", beam) + beam.Support = [(FB.Base, "Edge" + str(i + 1))] + beam.MapMode = "NormalToEdge" + beam.MapReversed = True + beamsList[i] = str(beam.Name) + FB.Beams = beamsList + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + + def removeBeams(self): + for beam in fCmd.beams(): + FB = findFB(beamName=beam.Name) + if FB: + i = FB.Beams.index(beam.Name) + FB.Proxy.remove(i) + + def changeProfile(self): + # find selected FB + try: + FB = findFB(baseName=FreeCADGui.Selection.getSelection()[0].Name) + if not FB: + FB = findFB(beamName=fCmd.beams()[0].Name) + except: + FreeCAD.Console.PrintError("Nothing selected\n") + return + if FB and self.form.listSizes.selectedItems(): + if self.SType == "": + profile = FreeCAD.ActiveDocument.getObjectsByLabel( + self.form.listSizes.currentItem().text() + )[0] + else: + prop = self.sectDictList[self.form.listSizes.currentRow()] + profile = newProfile(prop) + name = FB.Profile.Name + FB.Profile = profile + FB.Proxy.redraw(FB) + FreeCAD.ActiveDocument.removeObject(name) + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + else: + FreeCAD.Console.PrintError("No frameBranch or profile selected\n") + + def changeHeadOffset(self): + for beam in fCmd.beams(): + if hasattr(beam, "headOffset"): + beam.headOffset = float(self.form.editHead.text()) + FB = findFB(beam.Name) + FB.touch() + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + + def changeTailOffset(self): + for beam in fCmd.beams(): + if hasattr(beam, "tailOffset"): + beam.tailOffset = float(self.form.editTail.text()) + FB = findFB(beam.Name) + FB.touch() + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + + def changeAngle(self): + for beam in fCmd.beams(): + if hasattr(beam, "spin"): + FB = findFB(beam.Name) + beam.spin = float(self.form.editAngle.text()) + FB.touch() + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + + def stretchTail(self): + beams = fCmd.beams() + if beams: + L = float(beams[0].Height) / 2 + ext = L * (self.form.sliTail.value() / 100.0) + self.form.editTail.setText("%.3f" % ext) + self.changeTailOffset() + + def stretchHead(self): + beams = fCmd.beams() + if beams: + L = float(beams[0].Height) / 2 + ext = L * (self.form.sliHead.value() / 100.0) + self.form.editHead.setText("%.3f" % ext) + self.changeHeadOffset() + + def spinAngle(self): + self.form.editAngle.setText(str(self.form.dialAngle.value())) + self.changeAngle() + + def trim(self): + FreeCAD.ActiveDocument.openTransaction("Trim FB") + for target in self.targets: + for b in fCmd.beams(): + if hasattr(b, "tailOffset") and hasattr(b, "headOffset"): + edge = b.Support[0][0].Shape.getElement(b.Support[0][1][0]) + ax = edge.tangentAt(0).normalize() # fCmd.beamAx(b).normalize() + tail = edge.valueAt(0) # b.Placement.Base + head = edge.valueAt(edge.LastParameter) # tail+ax*float(b.Height) + if target.ShapeType == "Vertex": + P = target.Point + elif target.ShapeType == "Face" and not fCmd.isOrtho(target, ax): + P = fCmd.intersectionPlane(tail, ax, target) + elif hasattr(target, "CenterOfMass"): + P = target.CenterOfMass + else: + P = None + if P: + deltaTail = (P - tail).dot(ax) + deltaHead = (P - head).dot(ax) + if abs(deltaTail) < abs(deltaHead): + b.tailOffset = -deltaTail + else: + b.headOffset = deltaHead + refresh() + FreeCAD.ActiveDocument.commitTransaction() + + def refresh(self): + obj = findFB(fCmd.beams()[0].Name) + if not obj: + obj = findFB(baseName=FreeCADGui.Selection.getSelection()[0]) + if obj: + obj.Proxy.redraw(obj) + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + ################ CLASSES ########################### + class FrameLine(object): - '''Class for object FrameLine - Has attributes Base (the path) and Profile to define the frame shape and - the type section's profile. - Creates a group to collect the Structure objects. - Provides methods update() and purge() to redraw the Structure objects - when the Base is modified. - ''' - def __init__(self, obj, section="IPE200", lab=None): - obj.Proxy = self - obj.addProperty("App::PropertyString","FType","FrameLine",QT_TRANSLATE_NOOP("App::PropertyString","Type of frameFeature")).FType='FrameLine' - obj.addProperty("App::PropertyString","FSize","FrameLine",QT_TRANSLATE_NOOP("App::PropertyString","Size of frame")).FSize=section - if lab: - obj.Label=lab - obj.addProperty("App::PropertyString","Group","FrameLine",QT_TRANSLATE_NOOP("App::PropertyString","The group.")).Group=obj.Label+"_pieces" - group=FreeCAD.activeDocument().addObject("App::DocumentObjectGroup",obj.Group) - group.addObject(obj) - FreeCAD.Console.PrintWarning("Created group "+obj.Group+"\n") - obj.addProperty("App::PropertyLink","Base","FrameLine",QT_TRANSLATE_NOOP("App::PropertyLink","the edges")) - obj.addProperty("App::PropertyLink","Profile","FrameLine",QT_TRANSLATE_NOOP("App::PropertyLink","the profile")) - def onChanged(self, fp, prop): - if prop=='Label' and len(fp.InList): - fp.InList[0].Label=fp.Label+"_pieces" - fp.Group=fp.Label+"_pieces" - if prop=='Base' and fp.Base: - FreeCAD.Console.PrintWarning(fp.Label+' Base has changed to '+fp.Base.Label+'\n') - if prop=='Profile' and fp.Profile: - fp.Profile.ViewObject.Visibility=False - FreeCAD.Console.PrintWarning(fp.Label+' Profile has changed to '+fp.Profile.Label+'\n') - def purge(self,fp): - group=FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] - beams2purge=fCmd.beams(group.OutList) - if beams2purge: - for b in beams2purge: - profiles=b.OutList - FreeCAD.ActiveDocument.removeObject(b.Name) - for p in profiles: - FreeCAD.ActiveDocument.removeObject(p.Name) - def update(self,fp,copyProfile=True): - if hasattr(fp.Base,'Shape'): - edges=fp.Base.Shape.Edges - if not edges: - FreeCAD.Console.PrintError('Base has not valid edges\n') - return - group=FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] - if fp.Profile: - FreeCAD.activeDocument().openTransaction('Update frameLine') - for e in edges: - if copyProfile: - p=FreeCAD.activeDocument().copyObject(fp.Profile,True) - else: - p=fp.Profile - beam=makeStructure(p) - fCmd.placeTheBeam(beam,e) - pCmd.moveToPyLi(beam,fp.Name) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - def execute(self, fp): - return None + """Class for object FrameLine + Has attributes Base (the path) and Profile to define the frame shape and + the type section's profile. + Creates a group to collect the Structure objects. + Provides methods update() and purge() to redraw the Structure objects + when the Base is modified. + """ + + def __init__(self, obj, section="IPE200", lab=None): + obj.Proxy = self + obj.addProperty( + "App::PropertyString", + "FType", + "FrameLine", + QT_TRANSLATE_NOOP("App::PropertyString", "Type of frameFeature"), + ).FType = "FrameLine" + obj.addProperty( + "App::PropertyString", + "FSize", + "FrameLine", + QT_TRANSLATE_NOOP("App::PropertyString", "Size of frame"), + ).FSize = section + if lab: + obj.Label = lab + obj.addProperty( + "App::PropertyString", + "Group", + "FrameLine", + QT_TRANSLATE_NOOP("App::PropertyString", "The group."), + ).Group = obj.Label + "_pieces" + group = FreeCAD.activeDocument().addObject( + "App::DocumentObjectGroup", obj.Group + ) + group.addObject(obj) + FreeCAD.Console.PrintWarning("Created group " + obj.Group + "\n") + obj.addProperty( + "App::PropertyLink", + "Base", + "FrameLine", + QT_TRANSLATE_NOOP("App::PropertyLink", "the edges"), + ) + obj.addProperty( + "App::PropertyLink", + "Profile", + "FrameLine", + QT_TRANSLATE_NOOP("App::PropertyLink", "the profile"), + ) + + def onChanged(self, fp, prop): + if prop == "Label" and len(fp.InList): + fp.InList[0].Label = fp.Label + "_pieces" + fp.Group = fp.Label + "_pieces" + if prop == "Base" and fp.Base: + FreeCAD.Console.PrintWarning( + fp.Label + " Base has changed to " + fp.Base.Label + "\n" + ) + if prop == "Profile" and fp.Profile: + fp.Profile.ViewObject.Visibility = False + FreeCAD.Console.PrintWarning( + fp.Label + " Profile has changed to " + fp.Profile.Label + "\n" + ) + + def purge(self, fp): + group = FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] + beams2purge = fCmd.beams(group.OutList) + if beams2purge: + for b in beams2purge: + profiles = b.OutList + FreeCAD.ActiveDocument.removeObject(b.Name) + for p in profiles: + FreeCAD.ActiveDocument.removeObject(p.Name) + + def update(self, fp, copyProfile=True): + if hasattr(fp.Base, "Shape"): + edges = fp.Base.Shape.Edges + if not edges: + FreeCAD.Console.PrintError("Base has not valid edges\n") + return + group = FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] + if fp.Profile: + FreeCAD.activeDocument().openTransaction("Update frameLine") + for e in edges: + if copyProfile: + p = FreeCAD.activeDocument().copyObject(fp.Profile, True) + else: + p = fp.Profile + beam = makeStructure(p) + fCmd.placeTheBeam(beam, e) + pCmd.moveToPyLi(beam, fp.Name) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + + def execute(self, fp): + return None + class FrameBranch(object): - def __init__(self,obj, base=None, profile=None): - obj.Proxy=self - # PROXY CLASS PROPERTIES - self.objName=obj.Name - # FEATUREPYTHON OBJECT PROPERTIES - obj.addProperty("App::PropertyString","FType","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyString","Type of frameFeature")).FType='FrameBranch' - obj.addProperty("App::PropertyStringList","Beams","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyStringList","The beams names")) - obj.addProperty("App::PropertyLink","Base","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyLink","The path.")).Base=base - obj.addProperty("App::PropertyLink","Profile","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyLink","The profile")).Profile=profile - self.redraw(obj) - def execute(self,obj): - X=FreeCAD.Vector(1,0,0) - Z=FreeCAD.Vector(0,0,1) - if hasattr(obj,'Base') and obj.Base and hasattr(obj,'Beams'): - n=obj.Base.Placement.Rotation.multVec(Z) - for i in range(len(obj.Beams)): - if obj.Beams[i]: - edge=obj.Base.Shape.Edges[i] - beam=FreeCAD.ActiveDocument.getObject(obj.Beams[i]) - beam.Height=float(obj.Base.Shape.Edges[i].Length)+beam.tailOffset+beam.headOffset - offset=FreeCAD.Vector(0,0,beam.tailOffset).negative() - spin=FreeCAD.Rotation() - beam.AttachmentOffset = FreeCAD.Placement(offset, spin) - angle=degrees(fCmd.beamAx(beam,X).getAngle(n)) - beam.AttachmentOffset.Rotation=FreeCAD.Rotation(Z,angle+beam.spin) - def redraw(self, obj): - # clear all - for o in obj.Beams: FreeCAD.ActiveDocument.removeObject(o) - # create new beams - i=0 - beamsList=[] - for e in obj.Base.Shape.Edges: - if e.curvatureAt(0)==0: - beam=makeStructure(obj.Profile) - beam.addProperty("App::PropertyFloat","tailOffset","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The extension of the tail")) - beam.addProperty("App::PropertyFloat","headOffset","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The extension of the head")) - beam.addProperty("App::PropertyFloat","spin","FrameBranch",QT_TRANSLATE_NOOP("App::PropertyFloat","The rotation of the section")) - if int(FreeCAD.Version()[1])>19: #20220704 - beam.addExtension("Part::AttachExtensionPython") - else: - beam.addExtension("Part::AttachExtensionPython",beam) - beam.Support=[(obj.Base,'Edge'+str(i+1))] - beam.MapMode='NormalToEdge' - beam.MapReversed=True - beamsList.append(str(beam.Name)) - i+=1 - obj.Beams=beamsList - def remove(self,i): - obj=FreeCAD.ActiveDocument.getObject(self.objName) - FreeCAD.ActiveDocument.removeObject(obj.Beams[i]) - b=[str(n) for n in obj.Beams] - b[i]='' - obj.Beams=b + def __init__(self, obj, base=None, profile=None): + obj.Proxy = self + # PROXY CLASS PROPERTIES + self.objName = obj.Name + # FEATUREPYTHON OBJECT PROPERTIES + obj.addProperty( + "App::PropertyString", + "FType", + "FrameBranch", + QT_TRANSLATE_NOOP("App::PropertyString", "Type of frameFeature"), + ).FType = "FrameBranch" + obj.addProperty( + "App::PropertyStringList", + "Beams", + "FrameBranch", + QT_TRANSLATE_NOOP("App::PropertyStringList", "The beams names"), + ) + obj.addProperty( + "App::PropertyLink", + "Base", + "FrameBranch", + QT_TRANSLATE_NOOP("App::PropertyLink", "The path."), + ).Base = base + obj.addProperty( + "App::PropertyLink", + "Profile", + "FrameBranch", + QT_TRANSLATE_NOOP("App::PropertyLink", "The profile"), + ).Profile = profile + self.redraw(obj) + + def execute(self, obj): + X = FreeCAD.Vector(1, 0, 0) + Z = FreeCAD.Vector(0, 0, 1) + if hasattr(obj, "Base") and obj.Base and hasattr(obj, "Beams"): + n = obj.Base.Placement.Rotation.multVec(Z) + for i in range(len(obj.Beams)): + if obj.Beams[i]: + edge = obj.Base.Shape.Edges[i] + beam = FreeCAD.ActiveDocument.getObject(obj.Beams[i]) + beam.Height = ( + float(obj.Base.Shape.Edges[i].Length) + + beam.tailOffset + + beam.headOffset + ) + offset = FreeCAD.Vector(0, 0, beam.tailOffset).negative() + spin = FreeCAD.Rotation() + beam.AttachmentOffset = FreeCAD.Placement(offset, spin) + angle = degrees(fCmd.beamAx(beam, X).getAngle(n)) + beam.AttachmentOffset.Rotation = FreeCAD.Rotation( + Z, angle + beam.spin + ) + + def redraw(self, obj): + # clear all + for o in obj.Beams: + FreeCAD.ActiveDocument.removeObject(o) + # create new beams + i = 0 + beamsList = [] + for e in obj.Base.Shape.Edges: + if e.curvatureAt(0) == 0: + beam = makeStructure(obj.Profile) + beam.addProperty( + "App::PropertyFloat", + "tailOffset", + "FrameBranch", + QT_TRANSLATE_NOOP( + "App::PropertyFloat", "The extension of the tail" + ), + ) + beam.addProperty( + "App::PropertyFloat", + "headOffset", + "FrameBranch", + QT_TRANSLATE_NOOP( + "App::PropertyFloat", "The extension of the head" + ), + ) + beam.addProperty( + "App::PropertyFloat", + "spin", + "FrameBranch", + QT_TRANSLATE_NOOP( + "App::PropertyFloat", "The rotation of the section" + ), + ) + if int(FreeCAD.Version()[1]) > 19: # 20220704 + beam.addExtension("Part::AttachExtensionPython") + else: + beam.addExtension("Part::AttachExtensionPython", beam) + beam.Support = [(obj.Base, "Edge" + str(i + 1))] + beam.MapMode = "NormalToEdge" + beam.MapReversed = True + beamsList.append(str(beam.Name)) + i += 1 + obj.Beams = beamsList + + def remove(self, i): + obj = FreeCAD.ActiveDocument.getObject(self.objName) + FreeCAD.ActiveDocument.removeObject(obj.Beams[i]) + b = [str(n) for n in obj.Beams] + b[i] = "" + obj.Beams = b + class ViewProviderFrameBranch: - def __init__(self,vobj): - vobj.Proxy = self - def getIcon(self): - return join(dirname(abspath(__file__)),"iconz","framebranch.svg") - def attach(self, vobj): - self.ViewObject = vobj - self.Object = vobj.Object - def setEdit(self,vobj,mode): - return False - def unsetEdit(self,vobj,mode): - return - def __getstate__(self): - return None - def __setstate__(self,state): - return None - def dumps(self): - return None - def loads(self,state): - return None - def claimChildren(self): - children=[FreeCAD.ActiveDocument.getObject(name) for name in self.Object.Beams] - return children - def onDelete(self, feature, subelements): # subelements is a tuple of strings - return True + def __init__(self, vobj): + vobj.Proxy = self + + def getIcon(self): + return join(dirname(abspath(__file__)), "iconz", "framebranch.svg") + + def attach(self, vobj): + self.ViewObject = vobj + self.Object = vobj.Object + + def setEdit(self, vobj, mode): + return False + + def unsetEdit(self, vobj, mode): + return + + def __getstate__(self): + return None + + def __setstate__(self, state): + return None + + def dumps(self): + return None + + def loads(self, state): + return None + + def claimChildren(self): + children = [ + FreeCAD.ActiveDocument.getObject(name) for name in self.Object.Beams + ] + return children + + def onDelete(self, feature, subelements): # subelements is a tuple of strings + return True + ######### customArchProfile ############ import Draft from FreeCAD import Vector + if FreeCAD.GuiUp: # import FreeCADGui # from PySide import QtCore, QtGui @@ -749,274 +1049,573 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings from PySide.QtCore import QT_TRANSLATE_NOOP else: # \cond - def translate(ctxt,txt): + def translate(ctxt, txt): return txt - def QT_TRANSLATE_NOOP(ctxt,txt): + + def QT_TRANSLATE_NOOP(ctxt, txt): return txt + # \endcond -def doProfile(typeS="RH", label="Square", dims=[50,100,5]): # rearrange args in a better mnemonic way - 'doProfile(typeS, label, dims)' - if typeS in["RH", "R", "H", "U", "L", "T", "Z", "omega","circle"]: - profile=[0,'SECTION',label,typeS]+dims # for py2.6 versions - obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython",profile[2]) - obj.Label = translate("Arch",profile[2]) - if profile[3]=="RH": - _ProfileRH(obj, profile) - elif profile[3]=="R": - _ProfileR(obj, profile) - elif profile[3]=="U": - _ProfileU(obj, profile) - elif profile[3]=="T": - _ProfileT(obj, profile) - elif profile[3]=="H": - _ProfileH(obj, profile) - elif profile[3]=="L": - _ProfileL(obj, profile) - elif profile[3]=="Z": - _ProfileZ(obj, profile) - elif profile[3]=="omega": - _ProfileOmega(obj, profile) - elif profile[3]=="circle": - _ProfileCircle(obj, profile) - else : - print("Profile not supported") - if FreeCAD.GuiUp: - Draft._ViewProviderDraft(obj.ViewObject) - return obj - else: - FreeCAD.Console.PrintError('Not such section!\n') - -def drawAndCenter (points): + +def doProfile( + typeS="RH", label="Square", dims=[50, 100, 5] +): # rearrange args in a better mnemonic way + "doProfile(typeS, label, dims)" + if typeS in ["RH", "R", "H", "U", "L", "T", "Z", "omega", "circle"]: + profile = [0, "SECTION", label, typeS] + dims # for py2.6 versions + obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython", profile[2]) + obj.Label = translate("Arch", profile[2]) + if profile[3] == "RH": + _ProfileRH(obj, profile) + elif profile[3] == "R": + _ProfileR(obj, profile) + elif profile[3] == "U": + _ProfileU(obj, profile) + elif profile[3] == "T": + _ProfileT(obj, profile) + elif profile[3] == "H": + _ProfileH(obj, profile) + elif profile[3] == "L": + _ProfileL(obj, profile) + elif profile[3] == "Z": + _ProfileZ(obj, profile) + elif profile[3] == "omega": + _ProfileOmega(obj, profile) + elif profile[3] == "circle": + _ProfileCircle(obj, profile) + else: + print("Profile not supported") + if FreeCAD.GuiUp: + Draft._ViewProviderDraft(obj.ViewObject) + return obj + else: + FreeCAD.Console.PrintError("Not such section!\n") + + +def drawAndCenter(points): p = Part.makePolygon(points) s = Part.Face(p) - v=s.CenterOfMass + v = s.CenterOfMass points2 = [point.add(v.negative()) for point in points] p2 = Part.makePolygon(points2) return Part.Face(p2) + ############ pointsXXX() functions ################# + def pointsH(H, W, D, t1, t2, t3): - p1 = Vector(0,0,0) - p2 = Vector(W,0,0) - p3 = Vector(W,t2,0) - p4 = Vector(W/2+t1/2,t2,0) - p5 = Vector(W/2+t1/2,H-t3,0) - p6 = Vector(W/2+D/2,H-t3,0) - p7 = Vector(W/2+D/2,H,0) - p8 = Vector(W/2-D/2,H,0) - p9 = Vector(W/2-D/2,H-t3,0) - p10 = Vector(W/2-t1/2,H-t3,0) - p11 = Vector(W/2-t1/2,t2,0) - p12 = Vector(0,t2,0) - return [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p1] - -def pointsL(H,W,t1,t2): - p1 = Vector(-W/2,-H/2,0) - p2 = Vector(W/2,-H/2,0) - p3 = Vector(W/2,H/2,0) - p4 = Vector(W/2-t1,H/2,0) - p5 = Vector(W/2-t1,t2-H/2,0) - p6 = Vector(-W/2,t2-H/2,0) - return [p1,p2,p3,p4,p5,p6,p1] + p1 = Vector(0, 0, 0) + p2 = Vector(W, 0, 0) + p3 = Vector(W, t2, 0) + p4 = Vector(W / 2 + t1 / 2, t2, 0) + p5 = Vector(W / 2 + t1 / 2, H - t3, 0) + p6 = Vector(W / 2 + D / 2, H - t3, 0) + p7 = Vector(W / 2 + D / 2, H, 0) + p8 = Vector(W / 2 - D / 2, H, 0) + p9 = Vector(W / 2 - D / 2, H - t3, 0) + p10 = Vector(W / 2 - t1 / 2, H - t3, 0) + p11 = Vector(W / 2 - t1 / 2, t2, 0) + p12 = Vector(0, t2, 0) + return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p1] + + +def pointsL(H, W, t1, t2): + p1 = Vector(-W / 2, -H / 2, 0) + p2 = Vector(W / 2, -H / 2, 0) + p3 = Vector(W / 2, H / 2, 0) + p4 = Vector(W / 2 - t1, H / 2, 0) + p5 = Vector(W / 2 - t1, t2 - H / 2, 0) + p6 = Vector(-W / 2, t2 - H / 2, 0) + return [p1, p2, p3, p4, p5, p6, p1] + def pointsOmega(H, W, D, t1, t2, t3): - p1 = Vector(0,0,0) - p2 = Vector(W,0,0) - p3 = Vector(W,H-t3,0) - p4 = Vector(W+D-t1,H-t3,0) - p5 = Vector(W+D-t1,H,0) - p6 = Vector(W-t1,H,0) - p7 = Vector(W-t1,t2,0) - p8 = Vector(t1,t2,0) - p9 = Vector(t1,H,0) - p10 = Vector(t1-D,H,0) - p11 = Vector(t1-D,H-t3,0) - p12 = Vector(0,H-t3,0) - return [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p1] + p1 = Vector(0, 0, 0) + p2 = Vector(W, 0, 0) + p3 = Vector(W, H - t3, 0) + p4 = Vector(W + D - t1, H - t3, 0) + p5 = Vector(W + D - t1, H, 0) + p6 = Vector(W - t1, H, 0) + p7 = Vector(W - t1, t2, 0) + p8 = Vector(t1, t2, 0) + p9 = Vector(t1, H, 0) + p10 = Vector(t1 - D, H, 0) + p11 = Vector(t1 - D, H - t3, 0) + p12 = Vector(0, H - t3, 0) + return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p1] + def pointsT(H, W, t1, t2): - p1 = Vector(-W/2,-H/2,0) - p2 = Vector(W/2,-H/2,0) - p3 = Vector(W/2,(-H/2)+t2,0) - p4 = Vector(t1/2,(-H/2)+t2,0) - p5 = Vector(t1/2,H/2,0) - p6 = Vector(-t1/2,H/2,0) - p7 = Vector(-t1/2,(-H/2)+t2,0) - p8 = Vector(-W/2,(-H/2)+t2,0) - return [p1,p2,p3,p4,p5,p6,p7,p8,p1] + p1 = Vector(-W / 2, -H / 2, 0) + p2 = Vector(W / 2, -H / 2, 0) + p3 = Vector(W / 2, (-H / 2) + t2, 0) + p4 = Vector(t1 / 2, (-H / 2) + t2, 0) + p5 = Vector(t1 / 2, H / 2, 0) + p6 = Vector(-t1 / 2, H / 2, 0) + p7 = Vector(-t1 / 2, (-H / 2) + t2, 0) + p8 = Vector(-W / 2, (-H / 2) + t2, 0) + return [p1, p2, p3, p4, p5, p6, p7, p8, p1] + def pointsU(H, W, D, t1, t2, t3): - p1 = Vector(0,0,0) - p2 = Vector(W,0,0) - p3 = Vector(W,H,0) - p4 = Vector(W-D,H,0) - p5 = Vector(W-D,H-t3,0) - p6 = Vector(W-t1,H-t3,0) - p7 = Vector(W-t1,t2,0) - p8 = Vector(0,t2,0) - return [p1,p2,p3,p4,p5,p6,p7,p8,p1] - -def pointsZ(H,W,t1,t2): - p1 = Vector(-t1/2,-W/2,0) - p2 = Vector(-t1/2,(W/2)-t2,0) - p3 = Vector(t1/2-H,(W/2)-t2,0) - p4 = Vector(t1/2-H,W/2,0) - p5 = Vector(t1/2,W/2,0) - p6 = Vector(t1/2,t2-W/2,0) - p7 = Vector(H-t1/2,t2-W/2,0) - p8 = Vector(H-t1/2,-W/2,0) - return [p1,p8,p7,p6,p5,p4,p3,p2,p1] + p1 = Vector(0, 0, 0) + p2 = Vector(W, 0, 0) + p3 = Vector(W, H, 0) + p4 = Vector(W - D, H, 0) + p5 = Vector(W - D, H - t3, 0) + p6 = Vector(W - t1, H - t3, 0) + p7 = Vector(W - t1, t2, 0) + p8 = Vector(0, t2, 0) + return [p1, p2, p3, p4, p5, p6, p7, p8, p1] + + +def pointsZ(H, W, t1, t2): + p1 = Vector(-t1 / 2, -W / 2, 0) + p2 = Vector(-t1 / 2, (W / 2) - t2, 0) + p3 = Vector(t1 / 2 - H, (W / 2) - t2, 0) + p4 = Vector(t1 / 2 - H, W / 2, 0) + p5 = Vector(t1 / 2, W / 2, 0) + p6 = Vector(t1 / 2, t2 - W / 2, 0) + p7 = Vector(H - t1 / 2, t2 - W / 2, 0) + p8 = Vector(H - t1 / 2, -W / 2, 0) + return [p1, p8, p7, p6, p5, p4, p3, p2, p1] + ########### _ ProfileXXX() classes ############### # class _Profile(Draft._DraftObject): - # '''Superclass for Profile classes''' +# '''Superclass for Profile classes''' - # def __init__(self,obj, profile): - # self.Profile=profile - # Draft._DraftObject.__init__(self,obj,"Profile") +# def __init__(self,obj, profile): +# self.Profile=profile +# Draft._DraftObject.__init__(self,obj,"Profile") from ArchProfile import _Profile + class _ProfileRH(_Profile): - '''A parametric Rectangular hollow beam profile. Profile data: [width, height, thickness]''' - def __init__(self,obj, profile): - obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::PropertyString","Type of section")).FType = 'RH' - obj.addProperty("App::PropertyLength","W","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Width of the beam")).W = profile[4] - obj.addProperty("App::PropertyLength","H","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Height of the beam")).H = profile[5] - obj.addProperty("App::PropertyLength","t1","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Thickness of the vertical sides")).t1 = profile[6] - obj.addProperty("App::PropertyLength","t2","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Thickness of the horizontal sides")).t2 = profile[7] - _Profile.__init__(self,obj,profile) - def execute(self,obj): - W, H, t1, t2= obj.W.Value, obj.H.Value, obj.t1.Value, obj.t2.Value - p1 = Vector(-W/2,-H/2,0) - p2 = Vector(W/2,-H/2,0) - p3 = Vector(W/2,H/2,0) - p4 = Vector(-W/2,H/2,0) - q1 = Vector(-W/2+t1,-H/2+t2,0) - q2 = Vector(W/2-t1,-H/2+t2,0) - q3 = Vector(W/2-t1,H/2-t2,0) - q4 = Vector(-W/2+t1,H/2-t2,0) - p = Part.makePolygon([p1,p2,p3,p4,p1]) - q = Part.makePolygon([q1,q2,q3,q4,q1]) + """A parametric Rectangular hollow beam profile. Profile data: [width, height, thickness]""" + + def __init__(self, obj, profile): + obj.addProperty( + "App::PropertyString", + "FType", + "Profile", + QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + ).FType = "RH" + obj.addProperty( + "App::PropertyLength", + "W", + "Draft", + QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the beam"), + ).W = profile[4] + obj.addProperty( + "App::PropertyLength", + "H", + "Draft", + QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + ).H = profile[5] + obj.addProperty( + "App::PropertyLength", + "t1", + "Draft", + QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness of the vertical sides"), + ).t1 = profile[6] + obj.addProperty( + "App::PropertyLength", + "t2", + "Draft", + QT_TRANSLATE_NOOP( + "App::PropertyLength", "Thickness of the horizontal sides" + ), + ).t2 = profile[7] + _Profile.__init__(self, obj, profile) + + def execute(self, obj): + W, H, t1, t2 = obj.W.Value, obj.H.Value, obj.t1.Value, obj.t2.Value + p1 = Vector(-W / 2, -H / 2, 0) + p2 = Vector(W / 2, -H / 2, 0) + p3 = Vector(W / 2, H / 2, 0) + p4 = Vector(-W / 2, H / 2, 0) + q1 = Vector(-W / 2 + t1, -H / 2 + t2, 0) + q2 = Vector(W / 2 - t1, -H / 2 + t2, 0) + q3 = Vector(W / 2 - t1, H / 2 - t2, 0) + q4 = Vector(-W / 2 + t1, H / 2 - t2, 0) + p = Part.makePolygon([p1, p2, p3, p4, p1]) + q = Part.makePolygon([q1, q2, q3, q4, q1]) obj.Shape = Part.Face(p).cut(Part.Face(q)) + class _ProfileR(_Profile): - '''A parametric Rectangular solid beam profile. Profile data: [width, height]''' - def __init__(self,obj, profile): - obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::PropertyString","Type of section")).FType = 'R' - obj.addProperty("App::PropertyLength","W","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Width of the beam")).W = profile[4] - obj.addProperty("App::PropertyLength","H","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Height of the beam")).H = profile[5] - _Profile.__init__(self,obj,profile) - def execute(self,obj): - W, H= obj.W.Value, obj.H.Value - p1 = Vector(-W/2,-H/2,0) - p2 = Vector(W/2,-H/2,0) - p3 = Vector(W/2,H/2,0) - p4 = Vector(-W/2,H/2,0) - p = Part.makePolygon([p1,p2,p3,p4,p1]) + """A parametric Rectangular solid beam profile. Profile data: [width, height]""" + + def __init__(self, obj, profile): + obj.addProperty( + "App::PropertyString", + "FType", + "Profile", + QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + ).FType = "R" + obj.addProperty( + "App::PropertyLength", + "W", + "Draft", + QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the beam"), + ).W = profile[4] + obj.addProperty( + "App::PropertyLength", + "H", + "Draft", + QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + ).H = profile[5] + _Profile.__init__(self, obj, profile) + + def execute(self, obj): + W, H = obj.W.Value, obj.H.Value + p1 = Vector(-W / 2, -H / 2, 0) + p2 = Vector(W / 2, -H / 2, 0) + p3 = Vector(W / 2, H / 2, 0) + p4 = Vector(-W / 2, H / 2, 0) + p = Part.makePolygon([p1, p2, p3, p4, p1]) obj.Shape = Part.Face(p) + class _ProfileCircle(_Profile): - '''A parametric circular beam profile. + """A parametric circular beam profile. Profile data: D: diameter - t1: thickness (optional; "0" for solid section)''' - def __init__(self,obj, profile): - obj.addProperty("App::PropertyString","FType","Profile",QT_TRANSLATE_NOOP("App::PropertyString","Type of section")).FType = 'circle' - obj.addProperty("App::PropertyLength","D","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Diameter of the beam")).D = profile[4] - obj.addProperty("App::PropertyLength","t1","Draft",QT_TRANSLATE_NOOP("App::PropertyLength","Thickness")).t1 = profile[5] - _Profile.__init__(self,obj,profile) - def execute(self,obj): - D,t1= obj.D.Value, obj.t1.Value + t1: thickness (optional; "0" for solid section)""" + + def __init__(self, obj, profile): + obj.addProperty( + "App::PropertyString", + "FType", + "Profile", + QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + ).FType = "circle" + obj.addProperty( + "App::PropertyLength", + "D", + "Draft", + QT_TRANSLATE_NOOP("App::PropertyLength", "Diameter of the beam"), + ).D = profile[4] + obj.addProperty( + "App::PropertyLength", + "t1", + "Draft", + QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness"), + ).t1 = profile[5] + _Profile.__init__(self, obj, profile) + + def execute(self, obj): + D, t1 = obj.D.Value, obj.t1.Value if not t1: - obj.Shape = Part.makeFace([Part.makeCircle(D/2)],"Part::FaceMakerSimple") - elif t1') - self.edit1.setAlignment(Qt.AlignHCenter) - self.edit1.setValidator(QDoubleValidator()) - self.edit1.editingFinished.connect(lambda: self.sli.setValue(100)) - self.secondCol.layout().addWidget(self.edit1) - self.btn2=QPushButton('Reverse') - self.secondCol.layout().addWidget(self.btn2) - self.btn2.clicked.connect(self.reverse) - self.btn3=QPushButton('Apply') - self.secondCol.layout().addWidget(self.btn3) - self.btn3.clicked.connect(self.apply) - self.btn1.setDefault(True) - self.btn1.setFocus() - self.sli=QSlider(Qt.Vertical) - self.sli.setMaximum(200) - self.sli.setMinimum(1) - self.sli.setValue(100) - self.mainHL.addWidget(self.sli) - self.sli.valueChanged.connect(self.changeL) - self.show() - self.lastPipe=None - self.H=200 - def reverse(self): # revert orientation of selected or last inserted pipe - selPipes=[p for p in FreeCADGui.Selection.getSelection() if hasattr(p,'PType') and p.PType=='Pipe'] - if len(selPipes): - for p in selPipes: - pCmd.rotateTheTubeAx(p,FreeCAD.Vector(1,0,0),180) - else: - pCmd.rotateTheTubeAx(self.lastPipe,FreeCAD.Vector(1,0,0),180) - def insert(self): # insert the pipe - self.lastPipe=None - d=self.pipeDictList[self.sizeList.currentRow()] - if self.edit1.text(): - self.H=float(self.edit1.text()) - self.sli.setValue(100) - # DEFINE PROPERTIES - selex=FreeCADGui.Selection.getSelectionEx() - if selex: - for objex in selex: - o=objex.Object - if hasattr(o,'PSize') and hasattr(o,'OD') and hasattr(o,'thk'): - if o.PType=='Reduct' and o.Proxy.nearestPort(objex.SubObjects[0].CenterOfMass)[0]==1: # props of a reduction - propList=[o.PSize,o.OD2,o.thk2,self.H] - break - else: - propList=[o.PSize,o.OD,o.thk,self.H] # props of other pypes - break + """ + Dialog to insert tubes. + For position and orientation you can select + - one or more straight edges (centerlines) + - one or more curved edges (axis and origin across the center) + - one or more vertexes + - nothing + Default length = 200 mm. + Available one button to reverse the orientation of the last or selected tubes. + """ + + def __init__(self): + super(insertPipeForm, self).__init__( + translate("insertPipeForm", "Insert pipes"), + "Pipe", + "SCH-STD", + "pipe.svg", + x, + y, + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.btn1.clicked.connect(self.insert) + self.edit1 = QLineEdit() + self.edit1.setPlaceholderText("") + self.edit1.setAlignment(Qt.AlignHCenter) + self.edit1.setValidator(QDoubleValidator()) + self.edit1.editingFinished.connect(lambda: self.sli.setValue(100)) + self.secondCol.layout().addWidget(self.edit1) + self.btn2 = QPushButton(translate("insertPipeForm", "Reverse")) + self.secondCol.layout().addWidget(self.btn2) + self.btn2.clicked.connect(self.reverse) + self.btn3 = QPushButton(translate("insertPipeForm", "Apply")) + self.secondCol.layout().addWidget(self.btn3) + self.btn3.clicked.connect(self.apply) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.sli = QSlider(Qt.Vertical) + self.sli.setMaximum(200) + self.sli.setMinimum(1) + self.sli.setValue(100) + self.mainHL.addWidget(self.sli) + self.sli.valueChanged.connect(self.changeL) + self.show() + self.lastPipe = None + self.H = 200 + + def reverse(self): # revert orientation of selected or last inserted pipe + selPipes = [ + p + for p in FreeCADGui.Selection.getSelection() + if hasattr(p, "PType") and p.PType == "Pipe" + ] + if len(selPipes): + for p in selPipes: + pCmd.rotateTheTubeAx(p, FreeCAD.Vector(1, 0, 0), 180) else: - propList=[d['PSize'],float(pq(d['OD'])),float(pq(d['thk'])),self.H] #props of the dialog - break - else: - propList=[d['PSize'],float(pq(d['OD'])),float(pq(d['thk'])),self.H] - # INSERT PIPES - self.lastPipe=pCmd.doPipes(propList,FreeCAD.__activePypeLine__)[-1] - self.H=float(self.lastPipe.Height) - self.edit1.setText(str(float(self.H))) - # TODO: SET PRATING - FreeCAD.activeDocument().recompute() - def apply(self): - self.lastPipe=None - if self.edit1.text(): - self.H=float(self.edit1.text()) - else: - self.H=200.0 - self.sli.setValue(100) - for obj in FreeCADGui.Selection.getSelection(): - d=self.pipeDictList[self.sizeList.currentRow()] - if hasattr(obj,'PType') and obj.PType==self.PType: - obj.PSize=d['PSize'] - obj.OD=pq(d['OD']) - obj.thk=pq(d['thk']) - obj.PRating=self.PRating + pCmd.rotateTheTubeAx(self.lastPipe, FreeCAD.Vector(1, 0, 0), 180) + + def insert(self): # insert the pipe + self.lastPipe = None + d = self.pipeDictList[self.sizeList.currentRow()] if self.edit1.text(): - obj.Height=self.H + self.H = float(self.edit1.text()) + self.sli.setValue(100) + # DEFINE PROPERTIES + selex = FreeCADGui.Selection.getSelectionEx() + if selex: + for objex in selex: + o = objex.Object + if hasattr(o, "PSize") and hasattr(o, "OD") and hasattr(o, "thk"): + if ( + o.PType == "Reduct" + and o.Proxy.nearestPort(objex.SubObjects[0].CenterOfMass)[0] + == 1 + ): # props of a reduction + propList = [o.PSize, o.OD2, o.thk2, self.H] + break + else: + propList = [ + o.PSize, + o.OD, + o.thk, + self.H, + ] # props of other pypes + break + else: + propList = [ + d["PSize"], + float(pq(d["OD"])), + float(pq(d["thk"])), + self.H, + ] # props of the dialog + break + else: + propList = [d["PSize"], float(pq(d["OD"])), float(pq(d["thk"])), self.H] + # INSERT PIPES + self.lastPipe = pCmd.doPipes(propList, FreeCAD.__activePypeLine__)[-1] + self.H = float(self.lastPipe.Height) + self.edit1.setText(str(float(self.H))) + # TODO: SET PRATING FreeCAD.activeDocument().recompute() - def changeL(self): - if self.edit1.text(): - newL=self.H*self.sli.value()/100 - self.edit1.setText(str(newL)) - if self.lastPipe: - self.lastPipe.Height=newL - FreeCAD.ActiveDocument.recompute() -class insertElbowForm(dodoDialogs.protoPypeForm): - ''' - Dialog to insert one elbow. - For position and orientation you can select - - one vertex, - - one circular edge - - a pair of edges or pipes or beams - - one pipe at one of its ends - - nothing. - In case one pipe is selected, its properties are applied to the elbow and - the tube or tubes are trimmed or extended automatically. - Also available one button to trim/extend one selected pipe to the selected - edges, if necessary. - ''' - def __init__(self): - super(insertElbowForm,self).__init__("Insert elbows","Elbow","SCH-STD","elbow.svg",x,y) - self.sizeList.setCurrentRow(0) - self.ratingList.setCurrentRow(0) - self.btn1.clicked.connect(self.insert) - self.edit1=QLineEdit() - self.edit1.setPlaceholderText('') - self.edit1.setAlignment(Qt.AlignHCenter) - self.edit1.setValidator(QDoubleValidator()) - self.secondCol.layout().addWidget(self.edit1) - self.edit2=QLineEdit() - self.edit2.setPlaceholderText('') - self.edit2.setAlignment(Qt.AlignHCenter) - self.edit2.setValidator(QDoubleValidator()) - self.secondCol.layout().addWidget(self.edit2) - self.btn2=QPushButton('Trim/Extend') - self.btn2.clicked.connect(self.trim) - self.secondCol.layout().addWidget(self.btn2) - self.btn3=QPushButton('Reverse') - self.secondCol.layout().addWidget(self.btn3) - self.btn3.clicked.connect(self.reverse) - self.btn4=QPushButton('Apply') - self.secondCol.layout().addWidget(self.btn4) - self.btn4.clicked.connect(self.apply) - self.btn1.setDefault(True) - self.btn1.setFocus() - self.screenDial=QWidget() - self.screenDial.setLayout(QHBoxLayout()) - self.dial=QDial() - self.dial.setMaximumSize(80,80) - self.dial.setWrapping(True) - self.dial.setMaximum(180) - self.dial.setMinimum(-180) - self.dial.setNotchTarget(15) - self.dial.setNotchesVisible(True) - self.dial.setMaximumSize(70,70) - self.screenDial.layout().addWidget(self.dial) - self.lab=QLabel('0 deg') - self.lab.setAlignment(Qt.AlignCenter) - self.dial.valueChanged.connect(self.rotatePort) - self.screenDial.layout().addWidget(self.lab) - self.firstCol.layout().addWidget(self.screenDial) - self.show() - self.lastElbow=None - self.lastAngle=0 - def insert(self): - self.lastAngle=0 - self.dial.setValue(0) - DN=OD=thk=PRating=None - propList=[] - d=self.pipeDictList[self.sizeList.currentRow()] - try: - if float(self.edit1.text())>180: - self.edit1.setText("180") - ang=float(self.edit1.text()) - except: - ang=float(pq(d['BendAngle'])) - selex=FreeCADGui.Selection.getSelectionEx() - # DEFINE PROPERTIES - for sx in selex: - if hasattr(sx.Object,'PType') and sx.Object.PType in ['Pipe','Elbow','Cap','Reduct']: - DN=sx.Object.PSize - OD=float(sx.Object.OD) - thk=float(sx.Object.thk) - BR=None - for prop in self.pipeDictList: - if prop['PSize']==DN: - BR=float(pq(prop['BendRadius'])) - if BR==None: - BR=1.5*OD/2 - propList=[DN,OD,thk,ang,BR] - break - if not propList: - propList=[d['PSize'],float(pq(d['OD'])),float(pq(d['thk'])),ang,float(d['BendRadius'])] - if self.edit2.text(): - propList[-1]=float(self.edit2.text()) - # INSERT ELBOW - self.lastElbow=pCmd.doElbow(propList, FreeCAD.__activePypeLine__)[-1] - # TODO: SET PRATING - FreeCAD.activeDocument().recompute() - def trim(self): - if len(fCmd.beams())==1: - pipe=fCmd.beams()[0] - comPipeEdges=[e.CenterOfMass for e in pipe.Shape.Edges] - eds=[e for e in fCmd.edges() if not e.CenterOfMass in comPipeEdges] - FreeCAD.activeDocument().openTransaction('Trim pipes') - for edge in eds: - fCmd.extendTheBeam(fCmd.beams()[0],edge) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - else: - FreeCAD.Console.PrintError("Wrong selection\n") - def rotatePort(self): - if self.lastElbow: - pCmd.rotateTheElbowPort(self.lastElbow,0,self.lastAngle*-1) - self.lastAngle=self.dial.value() - pCmd.rotateTheElbowPort(self.lastElbow,0,self.lastAngle) - self.lab.setText(str(self.dial.value())+' deg') - def apply(self): - for obj in FreeCADGui.Selection.getSelection(): - d=self.pipeDictList[self.sizeList.currentRow()] - if hasattr(obj,'PType') and obj.PType==self.PType: - obj.PSize=d['PSize'] - obj.OD=pq(d['OD']) - obj.thk=pq(d['thk']) + def apply(self): + self.lastPipe = None if self.edit1.text(): - obj.BendAngle=float(self.edit1.text()) + self.H = float(self.edit1.text()) else: - obj.BendAngle=pq(d['BendAngle']) + self.H = 200.0 + self.sli.setValue(100) + for obj in FreeCADGui.Selection.getSelection(): + d = self.pipeDictList[self.sizeList.currentRow()] + if hasattr(obj, "PType") and obj.PType == self.PType: + obj.PSize = d["PSize"] + obj.OD = pq(d["OD"]) + obj.thk = pq(d["thk"]) + obj.PRating = self.PRating + if self.edit1.text(): + obj.Height = self.H + FreeCAD.activeDocument().recompute() + + def changeL(self): + if self.edit1.text(): + newL = self.H * self.sli.value() / 100 + self.edit1.setText(str(newL)) + if self.lastPipe: + self.lastPipe.Height = newL + FreeCAD.ActiveDocument.recompute() + + +class insertElbowForm(dodoDialogs.protoPypeForm): + """ + Dialog to insert one elbow. + For position and orientation you can select + - one vertex, + - one circular edge + - a pair of edges or pipes or beams + - one pipe at one of its ends + - nothing. + In case one pipe is selected, its properties are applied to the elbow and + the tube or tubes are trimmed or extended automatically. + Also available one button to trim/extend one selected pipe to the selected + edges, if necessary. + """ + + def __init__(self): + super(insertElbowForm, self).__init__( + translate("insertElbowForm", "Insert elbows"), + "Elbow", + "SCH-STD", + "elbow.svg", + x, + y, + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.btn1.clicked.connect(self.insert) + self.edit1 = QLineEdit() + self.edit1.setPlaceholderText(translate("insertElbowForm", "")) + self.edit1.setAlignment(Qt.AlignHCenter) + self.edit1.setValidator(QDoubleValidator()) + self.secondCol.layout().addWidget(self.edit1) + self.edit2 = QLineEdit() + self.edit2.setPlaceholderText(translate("insertElbowForm", "")) + self.edit2.setAlignment(Qt.AlignHCenter) + self.edit2.setValidator(QDoubleValidator()) + self.secondCol.layout().addWidget(self.edit2) + self.btn2 = QPushButton(translate("insertElbowForm", "Trim/Extend")) + self.btn2.clicked.connect(self.trim) + self.secondCol.layout().addWidget(self.btn2) + self.btn3 = QPushButton(translate("insertElbowForm", "Reverse")) + self.secondCol.layout().addWidget(self.btn3) + self.btn3.clicked.connect(self.reverse) + self.btn4 = QPushButton(translate("insertElbowForm", "Apply")) + self.secondCol.layout().addWidget(self.btn4) + self.btn4.clicked.connect(self.apply) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.screenDial = QWidget() + self.screenDial.setLayout(QHBoxLayout()) + self.dial = QDial() + self.dial.setMaximumSize(80, 80) + self.dial.setWrapping(True) + self.dial.setMaximum(180) + self.dial.setMinimum(-180) + self.dial.setNotchTarget(15) + self.dial.setNotchesVisible(True) + self.dial.setMaximumSize(70, 70) + self.screenDial.layout().addWidget(self.dial) + self.lab = QLabel(translate("insertElbowForm", "0 deg")) + self.lab.setAlignment(Qt.AlignCenter) + self.dial.valueChanged.connect(self.rotatePort) + self.screenDial.layout().addWidget(self.lab) + self.firstCol.layout().addWidget(self.screenDial) + self.show() + self.lastElbow = None + self.lastAngle = 0 + + def insert(self): + self.lastAngle = 0 + self.dial.setValue(0) + DN = OD = thk = PRating = None + propList = [] + d = self.pipeDictList[self.sizeList.currentRow()] + try: + if float(self.edit1.text()) > 180: + self.edit1.setText("180") + ang = float(self.edit1.text()) + except: + ang = float(pq(d["BendAngle"])) + selex = FreeCADGui.Selection.getSelectionEx() + # DEFINE PROPERTIES + for sx in selex: + if hasattr(sx.Object, "PType") and sx.Object.PType in [ + "Pipe", + "Elbow", + "Cap", + "Reduct", + ]: + DN = sx.Object.PSize + OD = float(sx.Object.OD) + thk = float(sx.Object.thk) + BR = None + for prop in self.pipeDictList: + if prop["PSize"] == DN: + BR = float(pq(prop["BendRadius"])) + if BR == None: + BR = 1.5 * OD / 2 + propList = [DN, OD, thk, ang, BR] + break + if not propList: + propList = [ + d["PSize"], + float(pq(d["OD"])), + float(pq(d["thk"])), + ang, + float(d["BendRadius"]), + ] if self.edit2.text(): - obj.BendRadius=float(self.edit2.text()) - else: - obj.BendRadius=pq(d['BendRadius']) - obj.PRating=self.PRating + propList[-1] = float(self.edit2.text()) + # INSERT ELBOW + self.lastElbow = pCmd.doElbow(propList, FreeCAD.__activePypeLine__)[-1] + # TODO: SET PRATING FreeCAD.activeDocument().recompute() - def reverse(self): - if self.lastElbow: - pCmd.rotateTheTubeAx(self.lastElbow,angle=180) - self.lastElbow.Placement.move(self.lastElbow.Placement.Rotation.multVec(self.lastElbow.Ports[0])*-2) + + def trim(self): + if len(fCmd.beams()) == 1: + pipe = fCmd.beams()[0] + comPipeEdges = [e.CenterOfMass for e in pipe.Shape.Edges] + eds = [e for e in fCmd.edges() if not e.CenterOfMass in comPipeEdges] + FreeCAD.activeDocument().openTransaction("Trim pipes") + for edge in eds: + fCmd.extendTheBeam(fCmd.beams()[0], edge) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + else: + FreeCAD.Console.PrintError( + translate("insertElbowForm", "Wrong selection\n") + ) + + def rotatePort(self): + if self.lastElbow: + pCmd.rotateTheElbowPort(self.lastElbow, 0, self.lastAngle * -1) + self.lastAngle = self.dial.value() + pCmd.rotateTheElbowPort(self.lastElbow, 0, self.lastAngle) + self.lab.setText(str(self.dial.value()) + translate("insertElbowForm", " deg")) + + def apply(self): + for obj in FreeCADGui.Selection.getSelection(): + d = self.pipeDictList[self.sizeList.currentRow()] + if hasattr(obj, "PType") and obj.PType == self.PType: + obj.PSize = d["PSize"] + obj.OD = pq(d["OD"]) + obj.thk = pq(d["thk"]) + if self.edit1.text(): + obj.BendAngle = float(self.edit1.text()) + else: + obj.BendAngle = pq(d["BendAngle"]) + if self.edit2.text(): + obj.BendRadius = float(self.edit2.text()) + else: + obj.BendRadius = pq(d["BendRadius"]) + obj.PRating = self.PRating + FreeCAD.activeDocument().recompute() + + def reverse(self): + if self.lastElbow: + pCmd.rotateTheTubeAx(self.lastElbow, angle=180) + self.lastElbow.Placement.move( + self.lastElbow.Placement.Rotation.multVec(self.lastElbow.Ports[0]) * -2 + ) + class insertFlangeForm(dodoDialogs.protoPypeForm): - ''' - Dialog to insert flanges. - For position and orientation you can select - - one or more circular edges, - - one or more vertexes, - - nothing. - In case one pipe is selected, its properties are applied to the flange. - Available one button to reverse the orientation of the last or selected - flanges. - ''' - def __init__(self): - super(insertFlangeForm,self).__init__("Insert flanges","Flange","DIN-PN16","flange.svg",x,y) - self.sizeList.setCurrentRow(0) - self.ratingList.setCurrentRow(0) - self.btn1.clicked.connect(self.insert) - self.btn2=QPushButton('Reverse') - self.secondCol.layout().addWidget(self.btn2) - self.btn2.clicked.connect(self.reverse) #lambda: pCmd.rotateTheTubeAx(self.lastFlange,FreeCAD.Vector(1,0,0),180)) - self.btn3=QPushButton('Apply') - self.secondCol.layout().addWidget(self.btn3) - self.btn3.clicked.connect(self.apply) - self.btn1.setDefault(True) - self.btn1.setFocus() - self.show() - self.lastFlange=None - def reverse(self): - selFlanges=[f for f in FreeCADGui.Selection.getSelection() if hasattr(f,'PType') and f.PType=='Flange'] - if len(selFlanges): - for f in selFlanges: - pCmd.rotateTheTubeAx(f,FreeCAD.Vector(1,0,0),180) - else: - pCmd.rotateTheTubeAx(self.lastFlange,FreeCAD.Vector(1,0,0),180) - def insert(self): - tubes=[t for t in fCmd.beams() if hasattr(t,'PSize')] - if len(tubes)>0 and tubes[0].PSize in [prop['PSize'] for prop in self.pipeDictList]: - for prop in self.pipeDictList: - if prop['PSize']==tubes[0].PSize: - d=prop - break - else: - d=self.pipeDictList[self.sizeList.currentRow()] - propList=[d['PSize'],d['FlangeType'],float(pq(d['D'])),float(pq(d['d'])),float(pq(d['df'])),float(pq(d['f'])),float(pq(d['t'])),int(d['n'])] - try: # for raised-face - propList.append(float(d['trf'])) - propList.append(float(d['drf'])) - except: - pass - try: # for welding-neck - propList.append(float(d['twn'])) - propList.append(float(d['dwn'])) - propList.append(float(d['ODp'])) - except: - pass - self.lastFlange=pCmd.doFlanges(propList,FreeCAD.__activePypeLine__)[-1] - def apply(self): - for obj in FreeCADGui.Selection.getSelection(): - d=self.pipeDictList[self.sizeList.currentRow()] - if hasattr(obj,'PType') and obj.PType==self.PType: - obj.PSize=d['PSize'] - obj.FlangeType=d['FlangeType'] - obj.D=float(pq(d['D'])) - obj.d=float(pq(d['d'])) - obj.df=float(pq(d['df'])) - obj.f=float(pq(d['f'])) - obj.t=float(pq(d['t'])) - obj.n=int(pq(d['n'])) - obj.PRating=self.PRating - FreeCAD.activeDocument().recompute() + """ + Dialog to insert flanges. + For position and orientation you can select + - one or more circular edges, + - one or more vertexes, + - nothing. + In case one pipe is selected, its properties are applied to the flange. + Available one button to reverse the orientation of the last or selected + flanges. + """ + + def __init__(self): + super(insertFlangeForm, self).__init__( + translate("insertFlangeForm", "Insert flanges"), + "Flange", + "DIN-PN16", + "flange.svg", + x, + y, + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.btn1.clicked.connect(self.insert) + self.btn2 = QPushButton(translate("insertFlangeForm", "Reverse")) + self.secondCol.layout().addWidget(self.btn2) + self.btn2.clicked.connect( + self.reverse + ) # lambda: pCmd.rotateTheTubeAx(self.lastFlange,FreeCAD.Vector(1,0,0),180)) + self.btn3 = QPushButton(translate("insertFlangeForm", "Apply")) + self.secondCol.layout().addWidget(self.btn3) + self.btn3.clicked.connect(self.apply) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.show() + self.lastFlange = None + + def reverse(self): + selFlanges = [ + f + for f in FreeCADGui.Selection.getSelection() + if hasattr(f, "PType") and f.PType == "Flange" + ] + if len(selFlanges): + for f in selFlanges: + pCmd.rotateTheTubeAx(f, FreeCAD.Vector(1, 0, 0), 180) + else: + pCmd.rotateTheTubeAx(self.lastFlange, FreeCAD.Vector(1, 0, 0), 180) + + def insert(self): + tubes = [t for t in fCmd.beams() if hasattr(t, "PSize")] + if len(tubes) > 0 and tubes[0].PSize in [ + prop["PSize"] for prop in self.pipeDictList + ]: + for prop in self.pipeDictList: + if prop["PSize"] == tubes[0].PSize: + d = prop + break + else: + d = self.pipeDictList[self.sizeList.currentRow()] + propList = [ + d["PSize"], + d["FlangeType"], + float(pq(d["D"])), + float(pq(d["d"])), + float(pq(d["df"])), + float(pq(d["f"])), + float(pq(d["t"])), + int(d["n"]), + ] + try: # for raised-face + propList.append(float(d["trf"])) + propList.append(float(d["drf"])) + except: + pass + try: # for welding-neck + propList.append(float(d["twn"])) + propList.append(float(d["dwn"])) + propList.append(float(d["ODp"])) + except: + pass + self.lastFlange = pCmd.doFlanges(propList, FreeCAD.__activePypeLine__)[-1] + + def apply(self): + for obj in FreeCADGui.Selection.getSelection(): + d = self.pipeDictList[self.sizeList.currentRow()] + if hasattr(obj, "PType") and obj.PType == self.PType: + obj.PSize = d["PSize"] + obj.FlangeType = d["FlangeType"] + obj.D = float(pq(d["D"])) + obj.d = float(pq(d["d"])) + obj.df = float(pq(d["df"])) + obj.f = float(pq(d["f"])) + obj.t = float(pq(d["t"])) + obj.n = int(pq(d["n"])) + obj.PRating = self.PRating + FreeCAD.activeDocument().recompute() + class insertReductForm(dodoDialogs.protoPypeForm): - ''' - Dialog to insert concentric reductions. - For position and orientation you can select - - two pipes parallel (possibly co-linear) - - one pipe at one of its ends - - one pipe - - one circular edge - - one straight edge - - one vertex - - nothing (created at origin) - In case one pipe is selected, its properties are applied to the reduction. - Available one button to reverse the orientation of the last or selected - reductions. - ''' - def __init__(self): - super(insertReductForm,self).__init__("Insert reductions","Reduct","SCH-STD","reduct.svg",x,y) - self.sizeList.setCurrentRow(0) - self.ratingList.setCurrentRow(0) - self.ratingList.itemClicked.connect(self.changeRating2) - self.sizeList.currentItemChanged.connect(self.fillOD2) - self.ratingList.setCurrentRow(0) - self.ratingList.setMaximumHeight(50) - self.OD2list=QListWidget() - self.OD2list.setMaximumHeight(80) - self.secondCol.layout().addWidget(self.OD2list) - self.btn2=QPushButton('Reverse') - self.secondCol.layout().addWidget(self.btn2) - self.btn3=QPushButton('Apply') - self.secondCol.layout().addWidget(self.btn3) - self.btn1.clicked.connect(self.insert) - self.btn2.clicked.connect(self.reverse) - self.btn3.clicked.connect(self.applyProp) - self.btn1.setDefault(True) - self.btn1.setFocus() - self.cb1=QCheckBox(' Eccentric') - self.secondCol.layout().addWidget(self.cb1) - self.fillOD2() - self.show() - self.lastReduct=None - def applyProp(self): - r=self.pipeDictList[self.sizeList.currentRow()] - DN=r['PSize'] - OD1=float(pq(r['OD'])) - OD2=float(pq(self.OD2list.currentItem().text())) - thk1=float(pq(r['thk'])) - try: - thk2=float(pq(r['thk2'].split('>')[self.OD2list.currentRow()])) - except: - thk2=thk1 - H=pq(r['H']) - reductions=[red for red in FreeCADGui.Selection.getSelection() if hasattr(red,'PType') and red.PType=='Reduct'] - if len(reductions): - for reduct in reductions: - reduct.PSize=DN - reduct.PRating=self.PRating - reduct.OD=OD1 - reduct.OD2=OD2 - reduct.thk=thk1 - reduct.thk2=thk2 - reduct.Height=H - elif self.lastReduct: - self.lastReduct.PSize=DN - self.lastReduct.PRating=self.PRating - self.lastReduct.OD=OD1 - self.lastReduct.OD2=OD2 - self.lastReduct.thk=thk1 - self.lastReduct.thk2=thk2 - self.lastReduct.Height=H - FreeCAD.activeDocument().recompute() - def fillOD2(self): - self.OD2list.clear() - self.OD2list.addItems(self.pipeDictList[self.sizeList.currentRow()]['OD2'].split('>')) - self.OD2list.setCurrentRow(0) - def reverse(self): - selRed=[r for r in FreeCADGui.Selection.getSelection() if hasattr(r,'PType') and r. PType=='Reduct'] - if len(selRed): - for r in selRed: - pCmd.rotateTheTubeAx(r,FreeCAD.Vector(1,0,0),180) - elif self.lastReduct: - pCmd.rotateTheTubeAx(self.lastReduct,FreeCAD.Vector(1,0,0),180) - def insert(self): - r=self.pipeDictList[self.sizeList.currentRow()] - pos=Z=H=None - selex=FreeCADGui.Selection.getSelectionEx() - pipes=[p.Object for p in selex if hasattr(p.Object,'PType') and p.Object.PType=='Pipe'] - if len(pipes)>1 and fCmd.isParallel(fCmd.beamAx(pipes[0]),fCmd.beamAx(pipes[1])): # if at least 2 pipes are selected... - if pipes[0].OD>=pipes[1].OD: - p1,p2=pipes[:2] - else: - p2,p1=pipes[:2] - DN=p1.PSize - OD1=float(p1.OD) - OD2=float(p2.OD) - thk1=float(p1.thk) - thk2=float(p2.thk) - H=float(pq(self.findDN(DN)['H'])) - Z=p2.Shape.Solids[0].CenterOfMass-p1.Shape.Solids[0].CenterOfMass - Z.normalize() - pos=p1.Shape.Solids[0].CenterOfMass+Z*float(p1.Height/2) - elif len(pipes)>0: # if 1 pipe is selected... - DN=pipes[0].PSize - OD1=float(pipes[0].OD) - OD2=float(pq(self.OD2list.currentItem().text())) - thk1=float(pipes[0].thk) - thk2=float(pq(r['thk2'].split('>')[self.OD2list.currentRow()])) - H=float(pq(self.findDN(DN)['H'])) - curves=[e for e in fCmd.edges() if e.curvatureAt(0)>0] - if len(curves): #...and 1 curve is selected... - pos=curves[0].centerOfCurvatureAt(0) - else: #...or no curve is selected... - pos=pipes[0].Placement.Base - Z= pos-pipes[0].Shape.Solids[0].CenterOfMass - else: # if no pipe is selected... - DN=r['PSize'] - OD1=float(pq(r['OD'])) - OD2=float(pq(self.OD2list.currentItem().text())) - thk1=float(pq(r['thk'])) - try: - thk2=float(pq(r['thk2'].split('>')[self.OD2list.currentRow()])) - except: - thk2=thk1 - H=pq(r['H']) - if fCmd.edges(): #...but 1 curve is selected... - edge=fCmd.edges()[0] - if edge.curvatureAt(0)>0: - pos=edge.centerOfCurvatureAt(0) - Z=edge.tangentAt(0).cross(edge.normalAt(0)) + """ + Dialog to insert concentric reductions. + For position and orientation you can select + - two pipes parallel (possibly co-linear) + - one pipe at one of its ends + - one pipe + - one circular edge + - one straight edge + - one vertex + - nothing (created at origin) + In case one pipe is selected, its properties are applied to the reduction. + Available one button to reverse the orientation of the last or selected + reductions. + """ + + def __init__(self): + super(insertReductForm, self).__init__( + translate("insertReductForm", "Insert reductions"), + "Reduct", + "SCH-STD", + "reduct.svg", + x, + y, + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.ratingList.itemClicked.connect(self.changeRating2) + self.sizeList.currentItemChanged.connect(self.fillOD2) + self.ratingList.setCurrentRow(0) + self.ratingList.setMaximumHeight(50) + self.OD2list = QListWidget() + self.OD2list.setMaximumHeight(80) + self.secondCol.layout().addWidget(self.OD2list) + self.btn2 = QPushButton(translate("insertReductForm", "Reverse")) + self.secondCol.layout().addWidget(self.btn2) + self.btn3 = QPushButton(translate("insertReductForm", "Apply")) + self.secondCol.layout().addWidget(self.btn3) + self.btn1.clicked.connect(self.insert) + self.btn2.clicked.connect(self.reverse) + self.btn3.clicked.connect(self.applyProp) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.cb1 = QCheckBox(translate("insertReductForm", "Eccentric")) + self.secondCol.layout().addWidget(self.cb1) + self.fillOD2() + self.show() + self.lastReduct = None + + def applyProp(self): + r = self.pipeDictList[self.sizeList.currentRow()] + DN = r["PSize"] + OD1 = float(pq(r["OD"])) + OD2 = float(pq(self.OD2list.currentItem().text())) + thk1 = float(pq(r["thk"])) + try: + thk2 = float(pq(r["thk2"].split(">")[self.OD2list.currentRow()])) + except: + thk2 = thk1 + H = pq(r["H"]) + reductions = [ + red + for red in FreeCADGui.Selection.getSelection() + if hasattr(red, "PType") and red.PType == "Reduct" + ] + if len(reductions): + for reduct in reductions: + reduct.PSize = DN + reduct.PRating = self.PRating + reduct.OD = OD1 + reduct.OD2 = OD2 + reduct.thk = thk1 + reduct.thk2 = thk2 + reduct.Height = H + elif self.lastReduct: + self.lastReduct.PSize = DN + self.lastReduct.PRating = self.PRating + self.lastReduct.OD = OD1 + self.lastReduct.OD2 = OD2 + self.lastReduct.thk = thk1 + self.lastReduct.thk2 = thk2 + self.lastReduct.Height = H + FreeCAD.activeDocument().recompute() + + def fillOD2(self): + self.OD2list.clear() + self.OD2list.addItems( + self.pipeDictList[self.sizeList.currentRow()]["OD2"].split(">") + ) + self.OD2list.setCurrentRow(0) + + def reverse(self): + selRed = [ + r + for r in FreeCADGui.Selection.getSelection() + if hasattr(r, "PType") and r.PType == "Reduct" + ] + if len(selRed): + for r in selRed: + pCmd.rotateTheTubeAx(r, FreeCAD.Vector(1, 0, 0), 180) + elif self.lastReduct: + pCmd.rotateTheTubeAx(self.lastReduct, FreeCAD.Vector(1, 0, 0), 180) + + def insert(self): + r = self.pipeDictList[self.sizeList.currentRow()] + pos = Z = H = None + selex = FreeCADGui.Selection.getSelectionEx() + pipes = [ + p.Object + for p in selex + if hasattr(p.Object, "PType") and p.Object.PType == "Pipe" + ] + if len(pipes) > 1 and fCmd.isParallel( + fCmd.beamAx(pipes[0]), fCmd.beamAx(pipes[1]) + ): # if at least 2 pipes are selected... + if pipes[0].OD >= pipes[1].OD: + p1, p2 = pipes[:2] + else: + p2, p1 = pipes[:2] + DN = p1.PSize + OD1 = float(p1.OD) + OD2 = float(p2.OD) + thk1 = float(p1.thk) + thk2 = float(p2.thk) + H = float(pq(self.findDN(DN)["H"])) + Z = p2.Shape.Solids[0].CenterOfMass - p1.Shape.Solids[0].CenterOfMass + Z.normalize() + pos = p1.Shape.Solids[0].CenterOfMass + Z * float(p1.Height / 2) + elif len(pipes) > 0: # if 1 pipe is selected... + DN = pipes[0].PSize + OD1 = float(pipes[0].OD) + OD2 = float(pq(self.OD2list.currentItem().text())) + thk1 = float(pipes[0].thk) + thk2 = float(pq(r["thk2"].split(">")[self.OD2list.currentRow()])) + H = float(pq(self.findDN(DN)["H"])) + curves = [e for e in fCmd.edges() if e.curvatureAt(0) > 0] + if len(curves): # ...and 1 curve is selected... + pos = curves[0].centerOfCurvatureAt(0) + else: # ...or no curve is selected... + pos = pipes[0].Placement.Base + Z = pos - pipes[0].Shape.Solids[0].CenterOfMass + else: # if no pipe is selected... + DN = r["PSize"] + OD1 = float(pq(r["OD"])) + OD2 = float(pq(self.OD2list.currentItem().text())) + thk1 = float(pq(r["thk"])) + try: + thk2 = float(pq(r["thk2"].split(">")[self.OD2list.currentRow()])) + except: + thk2 = thk1 + H = pq(r["H"]) + if fCmd.edges(): # ...but 1 curve is selected... + edge = fCmd.edges()[0] + if edge.curvatureAt(0) > 0: + pos = edge.centerOfCurvatureAt(0) + Z = edge.tangentAt(0).cross(edge.normalAt(0)) + else: + pos = edge.valueAt(0) + Z = edge.tangentAt(0) + elif ( + selex and selex[0].SubObjects[0].ShapeType == "Vertex" + ): # ...or 1 vertex.. + pos = selex[0].SubObjects[0].Point + if not H: # calculate length if it's not defined + H = float(3 * (OD1 - OD2)) + propList = [DN, OD1, OD2, thk1, thk2, H] + FreeCAD.activeDocument().openTransaction("Insert reduction") + if self.cb1.isChecked(): + self.lastReduct = pCmd.makeReduct(propList, pos, Z, False) else: - pos=edge.valueAt(0) - Z=edge.tangentAt(0) - elif selex and selex[0].SubObjects[0].ShapeType=="Vertex": #...or 1 vertex.. - pos=selex[0].SubObjects[0].Point - if not H: # calculate length if it's not defined - H=float(3*(OD1-OD2)) - propList=[DN,OD1,OD2,thk1,thk2,H] - FreeCAD.activeDocument().openTransaction('Insert reduction') - if self.cb1.isChecked(): - self.lastReduct=pCmd.makeReduct(propList,pos,Z,False) - else: - self.lastReduct=pCmd.makeReduct(propList,pos,Z) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - if self.combo.currentText()!='': - pCmd.moveToPyLi(self.lastReduct,self.combo.currentText()) - def changeRating2(self,item): - self.PRating=item.text() - self.fillSizes() - self.sizeList.setCurrentRow(0) - self.fillOD2() + self.lastReduct = pCmd.makeReduct(propList, pos, Z) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + if self.combo.currentText() != "": + pCmd.moveToPyLi(self.lastReduct, self.combo.currentText()) + + def changeRating2(self, item): + self.PRating = item.text() + self.fillSizes() + self.sizeList.setCurrentRow(0) + self.fillOD2() + class insertUboltForm(dodoDialogs.protoPypeForm): - ''' - Dialog to insert U-bolts. - For position and orientation you can select - - one or more circular edges, - - nothing. - In case one pipe is selected, its properties are aplied to the U-bolt. - Available one button to reverse the orientation of the last or selected tubes. - ''' - def __init__(self): - super(insertUboltForm,self).__init__("Insert U-bolt","Clamp","DIN-UBolt","clamp.svg",x,y) - self.sizeList.setCurrentRow(0) - self.ratingList.setCurrentRow(0) - self.lab1=QLabel('- no ref. face -') - self.lab1.setAlignment(Qt.AlignHCenter) - self.firstCol.layout().addWidget(self.lab1) - self.btn1.clicked.connect(self.insert) - self.btn2=QPushButton('Ref. face') - self.secondCol.layout().addWidget(self.btn2) - self.btn2.clicked.connect(self.getReference) - self.btn1.setDefault(True) - self.btn1.setFocus() - self.cb1=QCheckBox(' Head') - self.cb1.setChecked(True) - self.cb2=QCheckBox(' Middle') - self.cb3=QCheckBox(' Tail') - self.checkb=QWidget() - self.checkb.setLayout(QFormLayout()) - self.checkb.layout().setAlignment(Qt.AlignHCenter) - self.checkb.layout().addRow(self.cb1) - self.checkb.layout().addRow(self.cb2) - self.checkb.layout().addRow(self.cb3) - self.secondCol.layout().addWidget(self.checkb) - self.show() - self.refNorm=None - self.getReference() - def getReference(self): - selex=FreeCADGui.Selection.getSelectionEx() - for sx in selex: - if sx.SubObjects: - planes=[f for f in fCmd.faces([sx]) if type(f.Surface)==Part.Plane] - if len(planes)>0: - self.refNorm=rounded(planes[0].normalAt(0,0)) - self.lab1.setText("ref. Face on "+sx.Object.Label) - def insert(self): - selex=FreeCADGui.Selection.getSelectionEx() - if len(selex)==0: - d=self.pipeDictList[self.sizeList.currentRow()] - propList=[d['PSize'],self.PRating,float(pq(d['C'])),float(pq(d['H'])),float(pq(d['d']))] - FreeCAD.activeDocument().openTransaction('Insert clamp in (0,0,0)') - ub=pCmd.makeUbolt(propList) - if self.combo.currentText()!='': - pCmd.moveToPyLi(ub,self.combo.currentText()) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - else: - FreeCAD.activeDocument().openTransaction('Insert clamp on tube') - for objex in selex: - if hasattr(objex.Object,'PType') and objex.Object.PType=='Pipe': - d=[typ for typ in self.pipeDictList if typ['PSize']==objex.Object.PSize] - if len(d)>0: - d=d[0] - else: - d=self.pipeDictList[self.sizeList.currentRow()] - propList=[d['PSize'],self.PRating,float(pq(d['C'])),float(pq(d['H'])),float(pq(d['d']))] - H=float(objex.Object.Height) - gap=H-float(pq(d['C'])) - steps=[gap*self.cb1.isChecked(),H/2*self.cb2.isChecked(),(H-gap)*self.cb3.isChecked()] - for s in steps: - if s: - ub=pCmd.makeUbolt(propList,pos=objex.Object.Placement.Base, Z=fCmd.beamAx(objex.Object)) - ub.Placement.move(fCmd.beamAx(objex.Object).multiply(s)) - if self.refNorm: - pCmd.rotateTheTubeAx(obj=ub,angle=degrees(self.refNorm.getAngle((fCmd.beamAx(ub,FreeCAD.Vector(0,1,0)))))) - if self.combo.currentText()!='': - pCmd.moveToPyLi(ub,self.combo.currentText()) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() + """ + Dialog to insert U-bolts. + For position and orientation you can select + - one or more circular edges, + - nothing. + In case one pipe is selected, its properties are aplied to the U-bolt. + Available one button to reverse the orientation of the last or selected tubes. + """ -class insertCapForm(dodoDialogs.protoPypeForm): - ''' - Dialog to insert caps. - For position and orientation you can select - - one or more curved edges (axis and origin across the center) - - one or more vertexes - - nothing - Available one button to reverse the orientation of the last or selected tubes. - ''' - def __init__(self): - super(insertCapForm,self).__init__("Insert caps","Cap","SCH-STD","cap.svg",x,y) - self.sizeList.setCurrentRow(0) - self.ratingList.setCurrentRow(0) - self.btn1.clicked.connect(self.insert) - self.btn2=QPushButton('Reverse') - self.secondCol.layout().addWidget(self.btn2) - self.btn2.clicked.connect(self.reverse) - self.btn3=QPushButton('Apply') - self.secondCol.layout().addWidget(self.btn3) - self.btn3.clicked.connect(self.apply) - self.btn1.setDefault(True) - self.btn1.setFocus() - self.show() - self.lastPipe=None - def reverse(self): - selCaps=[p for p in FreeCADGui.Selection.getSelection() if hasattr(p,'PType') and p.PType=='Cap'] - if len(selCaps): - for p in selCaps: - pCmd.rotateTheTubeAx(p,FreeCAD.Vector(1,0,0),180) - else: - pCmd.rotateTheTubeAx(self.lastCap,FreeCAD.Vector(1,0,0),180) - def insert(self): - d=self.pipeDictList[self.sizeList.currentRow()] - objs=[o for o in FreeCADGui.Selection.getSelection() if hasattr(o,'PSize') and hasattr(o,'OD') and hasattr(o,'thk')] - if objs: - propList=[objs[0].PSize,objs[0].OD,objs[0].thk] - else: - propList=[d['PSize'],float(pq(d['OD'])),float(pq(d['thk']))] - self.lastCap=pCmd.doCaps(propList,FreeCAD.__activePypeLine__)[-1] - def apply(self): - for obj in FreeCADGui.Selection.getSelection(): - d=self.pipeDictList[self.sizeList.currentRow()] - if hasattr(obj,'PType') and obj.PType==self.PType: - obj.PSize=d['PSize'] - obj.OD=pq(d['OD']) - obj.thk=pq(d['thk']) - obj.PRating=self.PRating + def __init__(self): + super(insertUboltForm, self).__init__( + translate("insertUboltForm", "Insert U-bolt"), + "Clamp", + "DIN-UBolt", + "clamp.svg", + x, + y, + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.lab1 = QLabel(translate("insertUboltForm", "- no ref. face -")) + self.lab1.setAlignment(Qt.AlignHCenter) + self.firstCol.layout().addWidget(self.lab1) + self.btn1.clicked.connect(self.insert) + self.btn2 = QPushButton(translate("insertUboltForm", "Ref. face")) + self.secondCol.layout().addWidget(self.btn2) + self.btn2.clicked.connect(self.getReference) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.cb1 = QCheckBox(translate("insertUboltForm", " Head")) + self.cb1.setChecked(True) + self.cb2 = QCheckBox(translate("insertUboltForm", " Middle")) + self.cb3 = QCheckBox(translate("insertUboltForm", " Tail")) + self.checkb = QWidget() + self.checkb.setLayout(QFormLayout()) + self.checkb.layout().setAlignment(Qt.AlignHCenter) + self.checkb.layout().addRow(self.cb1) + self.checkb.layout().addRow(self.cb2) + self.checkb.layout().addRow(self.cb3) + self.secondCol.layout().addWidget(self.checkb) + self.show() + self.refNorm = None + self.getReference() + + def getReference(self): + selex = FreeCADGui.Selection.getSelectionEx() + for sx in selex: + if sx.SubObjects: + planes = [f for f in fCmd.faces([sx]) if type(f.Surface) == Part.Plane] + if len(planes) > 0: + self.refNorm = rounded(planes[0].normalAt(0, 0)) + self.lab1.setText("ref. Face on " + sx.Object.Label) + + def insert(self): + selex = FreeCADGui.Selection.getSelectionEx() + if len(selex) == 0: + d = self.pipeDictList[self.sizeList.currentRow()] + propList = [ + d["PSize"], + self.PRating, + float(pq(d["C"])), + float(pq(d["H"])), + float(pq(d["d"])), + ] + FreeCAD.activeDocument().openTransaction("Insert clamp in (0,0,0)") + ub = pCmd.makeUbolt(propList) + if self.combo.currentText() != "": + pCmd.moveToPyLi(ub, self.combo.currentText()) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + else: + FreeCAD.activeDocument().openTransaction("Insert clamp on tube") + for objex in selex: + if hasattr(objex.Object, "PType") and objex.Object.PType == "Pipe": + d = [ + typ + for typ in self.pipeDictList + if typ["PSize"] == objex.Object.PSize + ] + if len(d) > 0: + d = d[0] + else: + d = self.pipeDictList[self.sizeList.currentRow()] + propList = [ + d["PSize"], + self.PRating, + float(pq(d["C"])), + float(pq(d["H"])), + float(pq(d["d"])), + ] + H = float(objex.Object.Height) + gap = H - float(pq(d["C"])) + steps = [ + gap * self.cb1.isChecked(), + H / 2 * self.cb2.isChecked(), + (H - gap) * self.cb3.isChecked(), + ] + for s in steps: + if s: + ub = pCmd.makeUbolt( + propList, + pos=objex.Object.Placement.Base, + Z=fCmd.beamAx(objex.Object), + ) + ub.Placement.move(fCmd.beamAx(objex.Object).multiply(s)) + if self.refNorm: + pCmd.rotateTheTubeAx( + obj=ub, + angle=degrees( + self.refNorm.getAngle( + (fCmd.beamAx(ub, FreeCAD.Vector(0, 1, 0))) + ) + ), + ) + if self.combo.currentText() != "": + pCmd.moveToPyLi(ub, self.combo.currentText()) + FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() + +class insertCapForm(dodoDialogs.protoPypeForm): + """ + Dialog to insert caps. + For position and orientation you can select + - one or more curved edges (axis and origin across the center) + - one or more vertexes + - nothing + Available one button to reverse the orientation of the last or selected tubes. + """ + + def __init__(self): + super(insertCapForm, self).__init__( + translate("insertCapForm", "Insert caps"), "Cap", "SCH-STD", "cap.svg", x, y + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.btn1.clicked.connect(self.insert) + self.btn2 = QPushButton(translate("insertCapForm", "Reverse")) + self.secondCol.layout().addWidget(self.btn2) + self.btn2.clicked.connect(self.reverse) + self.btn3 = QPushButton(translate("insertCapForm", "Apply")) + self.secondCol.layout().addWidget(self.btn3) + self.btn3.clicked.connect(self.apply) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.show() + self.lastPipe = None + + def reverse(self): + selCaps = [ + p + for p in FreeCADGui.Selection.getSelection() + if hasattr(p, "PType") and p.PType == "Cap" + ] + if len(selCaps): + for p in selCaps: + pCmd.rotateTheTubeAx(p, FreeCAD.Vector(1, 0, 0), 180) + else: + pCmd.rotateTheTubeAx(self.lastCap, FreeCAD.Vector(1, 0, 0), 180) + + def insert(self): + d = self.pipeDictList[self.sizeList.currentRow()] + objs = [ + o + for o in FreeCADGui.Selection.getSelection() + if hasattr(o, "PSize") and hasattr(o, "OD") and hasattr(o, "thk") + ] + if objs: + propList = [objs[0].PSize, objs[0].OD, objs[0].thk] + else: + propList = [d["PSize"], float(pq(d["OD"])), float(pq(d["thk"]))] + self.lastCap = pCmd.doCaps(propList, FreeCAD.__activePypeLine__)[-1] + + def apply(self): + for obj in FreeCADGui.Selection.getSelection(): + d = self.pipeDictList[self.sizeList.currentRow()] + if hasattr(obj, "PType") and obj.PType == self.PType: + obj.PSize = d["PSize"] + obj.OD = pq(d["OD"]) + obj.thk = pq(d["thk"]) + obj.PRating = self.PRating + FreeCAD.activeDocument().recompute() + + class insertPypeLineForm(dodoDialogs.protoPypeForm): - ''' - Dialog to insert pypelines. - Note: Elbow created within this dialog have a standard bending radius of - 3/4 x OD, corresponding to a 3D curve. If you aim to have 5D curve or any - other custom bending radius, you shall apply it in the "Insert Elbow" - dialog or change it manually. - ''' - def __init__(self): - super(insertPypeLineForm,self).__init__("PypeLine Manager","Pipe","SCH-STD","pypeline.svg",x,y) - self.sizeList.setCurrentRow(0) - self.ratingList.setCurrentRow(0) - self.btn1.clicked.connect(self.insert) - self.combo.activated[str].connect(self.summary) - self.edit1=QLineEdit() - self.edit1.setPlaceholderText('') - self.edit1.setAlignment(Qt.AlignHCenter) - self.secondCol.layout().addWidget(self.edit1) - self.btn4=QPushButton('Redraw') - self.secondCol.layout().addWidget(self.btn4) - self.btn4.clicked.connect(self.redraw) - self.btn2=QPushButton('Part list') - self.secondCol.layout().addWidget(self.btn2) - self.btn2.clicked.connect(self.partList) - self.btn3=QPushButton('Color') - self.secondCol.layout().addWidget(self.btn3) - self.btn3.clicked.connect(self.changeColor) - self.btn5=QPushButton('Get Path') - self.firstCol.layout().addWidget(self.btn5) - self.btn5.clicked.connect(self.getBase) - self.btnX=QPushButton('Get Profile') - self.firstCol.layout().addWidget(self.btnX) - self.btnX.clicked.connect(self.apply) - self.color=0.8,0.8,0.8 - self.combo.setItemText(0,'') - self.btn1.setDefault(True) - self.btn1.setFocus() - self.lastPypeLine=None - self.show() - def summary(self,pl=None): - if self.combo.currentText()!="": - pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] - FreeCAD.Console.PrintMessage("\n%s: %s - %s\nProfile: %.1fx%.1f\nRGB color: %.3f, %.3f, %.3f\n"%(pl.Label, pl.PSize, pl.PRating, pl.OD, pl.thk, pl.ViewObject.ShapeColor[0], pl.ViewObject.ShapeColor[1], pl.ViewObject.ShapeColor[2])) - if pl.Base: - FreeCAD.Console.PrintMessage('Path: %s\n'%pl.Base.Label) - else: - FreeCAD.Console.PrintMessage('Path not defined\n') - def apply(self): - d=self.pipeDictList[self.sizeList.currentRow()] - if self.combo.currentText()!="": - pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] - pl.PSize=d["PSize"] - pl.PRating=self.PRating - pl.OD=float(d["OD"]) - pl.thk=float(d["thk"]) - self.summary() - else: - FreeCAD.Console.PrintError('Select a PypeLine to apply first\n') - def insert(self): - d=self.pipeDictList[self.sizeList.currentRow()] - FreeCAD.activeDocument().openTransaction('Insert pype-line') - if self.combo.currentText()=='': - plLabel=self.edit1.text() - if not plLabel: plLabel="Tubatura" - a=pCmd.makePypeLine2(DN=d["PSize"],PRating=self.PRating,OD=float(d["OD"]),thk=float(d["thk"]), lab=plLabel, color=self.color) - self.combo.addItem(a.Label) - else: - plname=self.combo.currentText() - plcolor=FreeCAD.activeDocument().getObjectsByLabel(plname)[0].ViewObject.ShapeColor - pCmd.makePypeLine2(DN=d["PSize"],PRating=self.PRating,OD=float(d["OD"]),thk=float(d["thk"]), pl=plname, color=plcolor) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() - def getBase(self): - if self.combo.currentText()!="": - pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] - sel=FreeCADGui.Selection.getSelection() - if sel: - base=sel[0] - isWire=hasattr(base,'Shape') and base.Shape.Edges #type(base.Shape)==Part.Wire - isSketch=hasattr(base,'TypeId') and base.TypeId=='Sketcher::SketchObject' - if isWire or isSketch: - FreeCAD.activeDocument().openTransaction('Assign Base') - pl.Base=base - if isWire: - pCmd.drawAsCenterLine(pl.Base) - pCmd.moveToPyLi(pl.Base,self.combo.currentText()) - FreeCAD.activeDocument().commitTransaction() + """ + Dialog to insert pypelines. + Note: Elbow created within this dialog have a standard bending radius of + 3/4 x OD, corresponding to a 3D curve. If you aim to have 5D curve or any + other custom bending radius, you shall apply it in the "Insert Elbow" + dialog or change it manually. + """ + + def __init__(self): + super(insertPypeLineForm, self).__init__( + translate("insertPypeLineForm", "PypeLine Manager"), + "Pipe", + "SCH-STD", + "pypeline.svg", + x, + y, + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.btn1.clicked.connect(self.insert) + self.combo.activated[str].connect(self.summary) + self.edit1 = QLineEdit() + self.edit1.setPlaceholderText(translate("insertPypeLineForm", "")) + self.edit1.setAlignment(Qt.AlignHCenter) + self.secondCol.layout().addWidget(self.edit1) + self.btn4 = QPushButton(translate("insertPypeLineForm", "Redraw")) + self.secondCol.layout().addWidget(self.btn4) + self.btn4.clicked.connect(self.redraw) + self.btn2 = QPushButton(translate("insertPypeLineForm", "Part list")) + self.secondCol.layout().addWidget(self.btn2) + self.btn2.clicked.connect(self.partList) + self.btn3 = QPushButton(translate("insertPypeLineForm", "Color")) + self.secondCol.layout().addWidget(self.btn3) + self.btn3.clicked.connect(self.changeColor) + self.btn5 = QPushButton(translate("insertPypeLineForm", "Get Path")) + self.firstCol.layout().addWidget(self.btn5) + self.btn5.clicked.connect(self.getBase) + self.btnX = QPushButton(translate("insertPypeLineForm", "Get Profile")) + self.firstCol.layout().addWidget(self.btnX) + self.btnX.clicked.connect(self.apply) + self.color = 0.8, 0.8, 0.8 + self.combo.setItemText(0, translate("insertPypeLineForm", "")) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.lastPypeLine = None + self.show() + + def summary(self, pl=None): + if self.combo.currentText() != "": + pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] + FreeCAD.Console.PrintMessage( + "\n%s: %s - %s\nProfile: %.1fx%.1f\nRGB color: %.3f, %.3f, %.3f\n" + % ( + pl.Label, + pl.PSize, + pl.PRating, + pl.OD, + pl.thk, + pl.ViewObject.ShapeColor[0], + pl.ViewObject.ShapeColor[1], + pl.ViewObject.ShapeColor[2], + ) + ) + if pl.Base: + FreeCAD.Console.PrintMessage("Path: %s\n" % pl.Base.Label) + else: + FreeCAD.Console.PrintMessage("Path not defined\n") + + def apply(self): + d = self.pipeDictList[self.sizeList.currentRow()] + if self.combo.currentText() != "": + pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] + pl.PSize = d["PSize"] + pl.PRating = self.PRating + pl.OD = float(d["OD"]) + pl.thk = float(d["thk"]) + self.summary() + else: + FreeCAD.Console.PrintError("Select a PypeLine to apply first\n") + + def insert(self): + d = self.pipeDictList[self.sizeList.currentRow()] + FreeCAD.activeDocument().openTransaction("Insert pype-line") + if self.combo.currentText() == "": + plLabel = self.edit1.text() + if not plLabel: + plLabel = "Tubatura" + a = pCmd.makePypeLine2( + DN=d["PSize"], + PRating=self.PRating, + OD=float(d["OD"]), + thk=float(d["thk"]), + lab=plLabel, + color=self.color, + ) + self.combo.addItem(a.Label) + else: + plname = self.combo.currentText() + plcolor = ( + FreeCAD.activeDocument() + .getObjectsByLabel(plname)[0] + .ViewObject.ShapeColor + ) + pCmd.makePypeLine2( + DN=d["PSize"], + PRating=self.PRating, + OD=float(d["OD"]), + thk=float(d["thk"]), + pl=plname, + color=plcolor, + ) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + + def getBase(self): + if self.combo.currentText() != "": + pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] + sel = FreeCADGui.Selection.getSelection() + if sel: + base = sel[0] + isWire = ( + hasattr(base, "Shape") and base.Shape.Edges + ) # type(base.Shape)==Part.Wire + isSketch = ( + hasattr(base, "TypeId") and base.TypeId == "Sketcher::SketchObject" + ) + if isWire or isSketch: + FreeCAD.activeDocument().openTransaction("Assign Base") + pl.Base = base + if isWire: + pCmd.drawAsCenterLine(pl.Base) + pCmd.moveToPyLi(pl.Base, self.combo.currentText()) + FreeCAD.activeDocument().commitTransaction() + else: + FreeCAD.Console.PrintError( + "Not valid Base: select a Wire or a Sketch.\n" + ) + else: + pl.Base = None + FreeCAD.Console.PrintWarning(pl.Label + "-> deleted Base\n") else: - FreeCAD.Console.PrintError('Not valid Base: select a Wire or a Sketch.\n') - else: - pl.Base=None - FreeCAD.Console.PrintWarning(pl.Label+'-> deleted Base\n') - else: - FreeCAD.Console.PrintError('Please choose or create a PypeLine first\n') - def redraw(self): - self.rd=redrawDialog() - def changeColor(self): - self.hide() - col=QColorDialog.getColor() - if col.isValid(): - self.color=tuple([c/255.0 for c in col.toTuple()[:3]]) - if self.combo.currentText()!="": - pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] - pl.ViewObject.ShapeColor=self.color - pCmd.updatePLColor([pl]) - self.show() - def partList(self): - from PySide.QtGui import QFileDialog as qfd - f=None - f=qfd.getSaveFileName()[0] - if f: - if self.combo.currentText()!='': - group=FreeCAD.activeDocument().getObjectsByLabel(FreeCAD.__activePypeLine__+'_pieces')[0] - fields=['Label','PType','PSize','Volume','Height'] - rows=list() - for o in group.OutList: - if hasattr(o,'PType'): - if o.PType in ['Pipe','Elbow','Flange','Clamp','Reduct','Cap']: - data=[o.Label,o.PType,o.PSize,o.Shape.Volume,'-'] - if o.PType=='Pipe': - data[4]=o.Height - rows.append(dict(zip(fields,data))) - elif o.PType in ['PypeBranch']: - for name in o.Tubes+o.Curves: - pype=FreeCAD.ActiveDocument.getObject(name) - data=[pype.Label,pype.PType,pype.PSize,pype.Shape.Volume,'-'] - if pype.PType=='Pipe': - data[4]=pype.Height - rows.append(dict(zip(fields,data))) - plist=open(abspath(f),'w') - w=csv.DictWriter(plist,fields,restval='-',delimiter=';') - w.writeheader() - w.writerows(rows) - plist.close() - FreeCAD.Console.PrintMessage('Data saved in %s.\n' %f) + FreeCAD.Console.PrintError("Please choose or create a PypeLine first\n") + + def redraw(self): + self.rd = redrawDialog() + + def changeColor(self): + self.hide() + col = QColorDialog.getColor() + if col.isValid(): + self.color = tuple([c / 255.0 for c in col.toTuple()[:3]]) + if self.combo.currentText() != "": + pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[ + 0 + ] + pl.ViewObject.ShapeColor = self.color + pCmd.updatePLColor([pl]) + self.show() + + def partList(self): + from PySide.QtGui import QFileDialog as qfd + + f = None + f = qfd.getSaveFileName()[0] + if f: + if self.combo.currentText() != "": + group = FreeCAD.activeDocument().getObjectsByLabel( + FreeCAD.__activePypeLine__ + "_pieces" + )[0] + fields = ["Label", "PType", "PSize", "Volume", "Height"] + rows = list() + for o in group.OutList: + if hasattr(o, "PType"): + if o.PType in [ + "Pipe", + "Elbow", + "Flange", + "Clamp", + "Reduct", + "Cap", + ]: + data = [o.Label, o.PType, o.PSize, o.Shape.Volume, "-"] + if o.PType == "Pipe": + data[4] = o.Height + rows.append(dict(zip(fields, data))) + elif o.PType in ["PypeBranch"]: + for name in o.Tubes + o.Curves: + pype = FreeCAD.ActiveDocument.getObject(name) + data = [ + pype.Label, + pype.PType, + pype.PSize, + pype.Shape.Volume, + "-", + ] + if pype.PType == "Pipe": + data[4] = pype.Height + rows.append(dict(zip(fields, data))) + plist = open(abspath(f), "w") + w = csv.DictWriter(plist, fields, restval="-", delimiter=";") + w.writeheader() + w.writerows(rows) + plist.close() + FreeCAD.Console.PrintMessage("Data saved in %s.\n" % f) + class insertBranchForm(dodoDialogs.protoPypeForm): - ''' - Dialog to insert branches. - Note: Elbow created within this dialog have a standard bending radius of - 3/4 x OD, corresponding to a 3D curve. - ''' - def __init__(self): - super(insertBranchForm,self).__init__("Insert a branch","Pipe","SCH-STD","branch.svg",x,y) - self.sizeList.setCurrentRow(0) - self.ratingList.setCurrentRow(0) - self.btn1.clicked.connect(self.insert) - self.combo.activated[str].connect(self.summary) - self.edit1=QLineEdit() - self.edit1.setPlaceholderText('') - self.edit1.setAlignment(Qt.AlignHCenter) - self.secondCol.layout().addWidget(self.edit1) - self.edit2=QLineEdit() - self.edit2.setPlaceholderText('') - self.edit2.setAlignment(Qt.AlignHCenter) - self.edit2.setValidator(QDoubleValidator()) - self.secondCol.layout().addWidget(self.edit2) - self.color=0.8,0.8,0.8 - self.btn1.setDefault(True) - self.btn1.setFocus() - self.show() - def summary(self,pl=None): - if self.combo.currentText()!="": - pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] - FreeCAD.Console.PrintMessage("\n%s: %s - %s\nProfile: %.1fx%.1f\nRGB color: %.3f, %.3f, %.3f\n"%(pl.Label, pl.PSize, pl.PRating, pl.OD, pl.thk, pl.ViewObject.ShapeColor[0], pl.ViewObject.ShapeColor[1], pl.ViewObject.ShapeColor[2])) - if pl.Base: - FreeCAD.Console.PrintMessage('Path: %s\n'%pl.Base.Label) - else: - FreeCAD.Console.PrintMessage('Path not defined\n') - #def apply(self): - #d=self.pipeDictList[self.sizeList.currentRow()] - #if self.combo.currentText()!="": - #pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] - #pl.PSize=d["PSize"] - #pl.PRating=self.PRating - #pl.OD=float(d["OD"]) - #pl.thk=float(d["thk"]) - #self.summary() - #else: - #FreeCAD.Console.PrintError('Select a PypeLine to apply first\n') - def insert(self): - d=self.pipeDictList[self.sizeList.currentRow()] - FreeCAD.activeDocument().openTransaction('Insert pype-branch') - plLabel=self.edit1.text() - if not plLabel: plLabel="Traccia" - if not self.edit2.text(): bendRad=0.75*float(d["OD"]) - else: bendRad=float(self.edit2.text()) - a=pCmd.makeBranch(DN=d["PSize"],PRating=self.PRating,OD=float(d["OD"]),thk=float(d["thk"]), BR=bendRad, lab=plLabel, color=self.color) - if self.combo.currentText()!='': - pCmd.moveToPyLi(a,self.combo.currentText()) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() + """ + Dialog to insert branches. + Note: Elbow created within this dialog have a standard bending radius of + 3/4 x OD, corresponding to a 3D curve. + """ + + def __init__(self): + super(insertBranchForm, self).__init__( + translate("insertBranchForm", "Insert a branch"), + "Pipe", + "SCH-STD", + "branch.svg", + x, + y, + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.btn1.clicked.connect(self.insert) + self.combo.activated[str].connect(self.summary) + self.edit1 = QLineEdit() + self.edit1.setPlaceholderText(translate("insertBranchForm", "")) + self.edit1.setAlignment(Qt.AlignHCenter) + self.secondCol.layout().addWidget(self.edit1) + self.edit2 = QLineEdit() + self.edit2.setPlaceholderText(translate("insertBranchForm", "")) + self.edit2.setAlignment(Qt.AlignHCenter) + self.edit2.setValidator(QDoubleValidator()) + self.secondCol.layout().addWidget(self.edit2) + self.color = 0.8, 0.8, 0.8 + self.btn1.setDefault(True) + self.btn1.setFocus() + self.show() + + def summary(self, pl=None): + if self.combo.currentText() != "": + pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] + FreeCAD.Console.PrintMessage( + "\n%s: %s - %s\nProfile: %.1fx%.1f\nRGB color: %.3f, %.3f, %.3f\n" + % ( + pl.Label, + pl.PSize, + pl.PRating, + pl.OD, + pl.thk, + pl.ViewObject.ShapeColor[0], + pl.ViewObject.ShapeColor[1], + pl.ViewObject.ShapeColor[2], + ) + ) + if pl.Base: + FreeCAD.Console.PrintMessage("Path: %s\n" % pl.Base.Label) + else: + FreeCAD.Console.PrintMessage("Path not defined\n") + + # def apply(self): + # d=self.pipeDictList[self.sizeList.currentRow()] + # if self.combo.currentText()!="": + # pl=FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] + # pl.PSize=d["PSize"] + # pl.PRating=self.PRating + # pl.OD=float(d["OD"]) + # pl.thk=float(d["thk"]) + # self.summary() + # else: + # FreeCAD.Console.PrintError('Select a PypeLine to apply first\n') + def insert(self): + d = self.pipeDictList[self.sizeList.currentRow()] + FreeCAD.activeDocument().openTransaction("Insert pype-branch") + plLabel = self.edit1.text() + if not plLabel: + plLabel = "Traccia" + if not self.edit2.text(): + bendRad = 0.75 * float(d["OD"]) + else: + bendRad = float(self.edit2.text()) + a = pCmd.makeBranch( + DN=d["PSize"], + PRating=self.PRating, + OD=float(d["OD"]), + thk=float(d["thk"]), + BR=bendRad, + lab=plLabel, + color=self.color, + ) + if self.combo.currentText() != "": + pCmd.moveToPyLi(a, self.combo.currentText()) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.recompute() + class breakForm(QDialog): - ''' - Dialog to break one pipe and create a gap. - ''' - def __init__(self,winTitle='Break the pipes', PType='Pipe', PRating='SCH-STD', icon='break.svg'): - self.refL=0.0 - super(breakForm,self).__init__() - self.move(QPoint(100,250)) - self.PType=PType - self.PRating=PRating - self.setWindowFlags(Qt.WindowStaysOnTopHint) - self.setWindowTitle(winTitle) - iconPath=join(dirname(abspath(__file__)),"iconz",icon) - from PySide.QtGui import QIcon - Icon=QIcon() - Icon.addFile(iconPath) - self.setWindowIcon(Icon) - self.grid=QGridLayout() - self.setLayout(self.grid) - self.btn0=QPushButton('Length') - self.btn0.clicked.connect(self.getL) - self.lab0=QLabel('') - self.lab1=QLabel('PypeLine:') - self.combo=QComboBox() - self.combo.addItem('') - try: - self.combo.addItems([o.Label for o in FreeCAD.activeDocument().Objects if hasattr(o,'PType') and o.PType=='PypeLine']) - except: - None - self.combo.currentIndexChanged.connect(self.setCurrentPL) - if FreeCAD.__activePypeLine__ and FreeCAD.__activePypeLine__ in [self.combo.itemText(i) for i in range(self.combo.count())]: - self.combo.setCurrentIndex(self.combo.findText(FreeCAD.__activePypeLine__)) - self.edit1=QLineEdit('0') - self.edit1.setAlignment(Qt.AlignCenter) - self.edit1.editingFinished.connect(self.updateSlider) - self.edit2=QLineEdit('0') - self.edit2.setAlignment(Qt.AlignCenter) - self.edit2.editingFinished.connect(self.calcGapPercent) - rx=QRegExp('[0-9,.%]*') - val=QRegExpValidator(rx) - self.edit1.setValidator(val) - self.edit2.setValidator(val) - self.lab2=QLabel('Point:') - self.btn1=QPushButton('Break') - self.btn1.clicked.connect(self.breakPipe) - self.btn1.setDefault(True) - self.btn1.setFocus() - self.lab3=QLabel('Gap:') - self.btn2=QPushButton('Get gap') - self.btn2.clicked.connect(self.changeGap) - self.slider=QSlider(Qt.Horizontal) - self.slider.valueChanged.connect(self.changePoint) - self.slider.setMaximum(100) - self.grid.addWidget(self.btn0,4,0) - self.grid.addWidget(self.lab0,4,1,1,1,Qt.AlignCenter) - self.grid.addWidget(self.lab1,0,0,1,1,Qt.AlignCenter) - self.grid.addWidget(self.combo,0,1,1,1,Qt.AlignCenter) - self.grid.addWidget(self.lab2,1,0,1,1,Qt.AlignCenter) - self.grid.addWidget(self.edit1,1,1) - self.grid.addWidget(self.lab3,2,0,1,1,Qt.AlignCenter) - self.grid.addWidget(self.edit2,2,1) - self.grid.addWidget(self.btn1,3,0) - self.grid.addWidget(self.btn2,3,1) - self.grid.addWidget(self.slider,5,0,1,2) - self.show() - def setCurrentPL(self,PLName=None): - if self.combo.currentText() not in ['','']: - FreeCAD.__activePypeLine__= self.combo.currentText() - else: - FreeCAD.__activePypeLine__=None - def getL(self): - l=[p.Height for p in fCmd.beams() if pCmd.isPipe(p)] - if l: - refL=min(l) - self.lab0.setText(str(refL)) - self.refL=float(refL) - self.edit1.setText("%.2f" %(self.refL*self.slider.value()/100.0)) - else: - self.lab0.setText('') - self.refL=0.0 - self.edit1.setText(str(self.slider.value())+'%') - def changePoint(self): - if self.refL: - self.edit1.setText("%.2f" %(self.refL*self.slider.value()/100.0)) - else: - self.edit1.setText(str(self.slider.value())+'%') - def changeGap(self): - shapes=[y for x in FreeCADGui.Selection.getSelectionEx() for y in x.SubObjects if hasattr(y,'ShapeType')] - if len(shapes)==1: - sub=shapes[0] - if sub.ShapeType=='Edge': - if sub.curvatureAt(0)==0: - gapL=float(sub.Length) - else: - gapL=0 - elif len(shapes)>1: - gapL=shapes[0].distToShape(shapes[1])[0] - else: - gapL=0 - self.edit2.setText("%.2f" %gapL) - def updateSlider(self): - if self.edit1.text() and self.edit1.text()[-1]=='%': - self.slider.setValue(int(float(self.edit1.text().rstrip('%').strip()))) - elif self.edit1.text() and float(self.edit1.text().strip())")) + self.lab1 = QLabel(translate("breakForm", "PypeLine:")) + self.combo = QComboBox() + self.combo.addItem(translate("breakForm", "")) + try: + self.combo.addItems( + [ + o.Label + for o in FreeCAD.activeDocument().Objects + if hasattr(o, "PType") and o.PType == "PypeLine" + ] + ) + except: + None + self.combo.currentIndexChanged.connect(self.setCurrentPL) + if FreeCAD.__activePypeLine__ and FreeCAD.__activePypeLine__ in [ + self.combo.itemText(i) for i in range(self.combo.count()) + ]: + self.combo.setCurrentIndex(self.combo.findText(FreeCAD.__activePypeLine__)) + self.edit1 = QLineEdit("0") + self.edit1.setAlignment(Qt.AlignCenter) + self.edit1.editingFinished.connect(self.updateSlider) + self.edit2 = QLineEdit("0") + self.edit2.setAlignment(Qt.AlignCenter) + self.edit2.editingFinished.connect(self.calcGapPercent) + rx = QRegExp("[0-9,.%]*") + val = QRegExpValidator(rx) + self.edit1.setValidator(val) + self.edit2.setValidator(val) + self.lab2 = QLabel("Point:") + self.btn1 = QPushButton("Break") + self.btn1.clicked.connect(self.breakPipe) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.lab3 = QLabel("Gap:") + self.btn2 = QPushButton("Get gap") + self.btn2.clicked.connect(self.changeGap) + self.slider = QSlider(Qt.Horizontal) + self.slider.valueChanged.connect(self.changePoint) + self.slider.setMaximum(100) + self.grid.addWidget(self.btn0, 4, 0) + self.grid.addWidget(self.lab0, 4, 1, 1, 1, Qt.AlignCenter) + self.grid.addWidget(self.lab1, 0, 0, 1, 1, Qt.AlignCenter) + self.grid.addWidget(self.combo, 0, 1, 1, 1, Qt.AlignCenter) + self.grid.addWidget(self.lab2, 1, 0, 1, 1, Qt.AlignCenter) + self.grid.addWidget(self.edit1, 1, 1) + self.grid.addWidget(self.lab3, 2, 0, 1, 1, Qt.AlignCenter) + self.grid.addWidget(self.edit2, 2, 1) + self.grid.addWidget(self.btn1, 3, 0) + self.grid.addWidget(self.btn2, 3, 1) + self.grid.addWidget(self.slider, 5, 0, 1, 2) + self.show() + + def setCurrentPL(self, PLName=None): + if self.combo.currentText() not in ["", ""]: + FreeCAD.__activePypeLine__ = self.combo.currentText() + else: + FreeCAD.__activePypeLine__ = None + + def getL(self): + l = [p.Height for p in fCmd.beams() if pCmd.isPipe(p)] + if l: + refL = min(l) + self.lab0.setText(str(refL)) + self.refL = float(refL) + self.edit1.setText("%.2f" % (self.refL * self.slider.value() / 100.0)) + else: + self.lab0.setText("") + self.refL = 0.0 + self.edit1.setText(str(self.slider.value()) + "%") + + def changePoint(self): + if self.refL: + self.edit1.setText("%.2f" % (self.refL * self.slider.value() / 100.0)) + else: + self.edit1.setText(str(self.slider.value()) + "%") + + def changeGap(self): + shapes = [ + y + for x in FreeCADGui.Selection.getSelectionEx() + for y in x.SubObjects + if hasattr(y, "ShapeType") + ] + if len(shapes) == 1: + sub = shapes[0] + if sub.ShapeType == "Edge": + if sub.curvatureAt(0) == 0: + gapL = float(sub.Length) + else: + gapL = 0 + elif len(shapes) > 1: + gapL = shapes[0].distToShape(shapes[1])[0] + else: + gapL = 0 + self.edit2.setText("%.2f" % gapL) + + def updateSlider(self): + if self.edit1.text() and self.edit1.text()[-1] == "%": + self.slider.setValue(int(float(self.edit1.text().rstrip("%").strip()))) + elif self.edit1.text() and float(self.edit1.text().strip()) < self.refL: + self.slider.setValue( + int(float(self.edit1.text().strip()) / self.refL * 100) + ) + + def calcGapPercent(self): + if self.edit2.text() and self.edit2.text()[-1] == "%": + if self.refL: + self.edit2.setText( + "%.2f" + % (float(self.edit2.text().rstrip("%").strip()) / 100 * self.refL) + ) + else: + self.edit2.setText("0") + FreeCAD.Console.PrintError("No reference length defined yet\n") + + def breakPipe(self): + p2nd = None + FreeCAD.activeDocument().openTransaction("Break pipes") + if self.edit1.text()[-1] == "%": + pipes = [p for p in fCmd.beams() if pCmd.isPipe(p)] + for p in pipes: + p2nd = pCmd.breakTheTubes( + float(p.Height) + * float(self.edit1.text().rstrip("%").strip()) + / 100, + pipes=[p], + gap=float(self.edit2.text()), + ) + if p2nd and self.combo.currentText() != "": + for p in p2nd: + pCmd.moveToPyLi(p, self.combo.currentText()) + else: + p2nd = pCmd.breakTheTubes( + float(self.edit1.text()), gap=float(self.edit2.text()) + ) + if p2nd and self.combo.currentText() != "": + for p in p2nd: + pCmd.moveToPyLi(p, self.combo.currentText()) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + import pObservers as po + class joinForm(dodoDialogs.protoTypeDialog): - def __init__(self): - super(joinForm,self).__init__('joinPypes.ui') - self.form.btn1.clicked.connect(self.reset) - self.observer=po.joinObserver() - FreeCADGui.Selection.addObserver(self.observer) - def reject(self): #redefined to remove the observer - info=dict() - info["State"]="DOWN" - info["Key"]="ESCAPE" - self.observer.goOut(info) - super(joinForm,self).reject() - def accept(self): - self.reject() - def selectAction(self): - self.reset() - def reset(self): - po.pCmd.o1=None - po.pCmd.o2=None - for a in po.pCmd.arrows1+po.pCmd.arrows2: - a.closeArrow() - po.pCmd.arrows1=[] - po.pCmd.arrows2=[] + def __init__(self): + super(joinForm, self).__init__("joinPypes.ui") + self.form.btn1.clicked.connect(self.reset) + self.observer = po.joinObserver() + FreeCADGui.Selection.addObserver(self.observer) + + def reject(self): # redefined to remove the observer + info = dict() + info["State"] = "DOWN" + info["Key"] = "ESCAPE" + self.observer.goOut(info) + super(joinForm, self).reject() + + def accept(self): + self.reject() + + def selectAction(self): + self.reset() + + def reset(self): + po.pCmd.o1 = None + po.pCmd.o2 = None + for a in po.pCmd.arrows1 + po.pCmd.arrows2: + a.closeArrow() + po.pCmd.arrows1 = [] + po.pCmd.arrows2 = [] + class insertValveForm(dodoDialogs.protoPypeForm): - ''' - Dialog to insert Valves. - For position and orientation you can select - - one or more straight edges (centerlines) - - one or more curved edges (axis and origin across the center) - - one or more vertexes - - nothing - Default valve = DN50 ball valve. - Available one button to reverse the orientation of the last or selected valves. - ''' - def __init__(self): - self.PType='Valve' - self.PRating='' - #super(insertValveForm,self).__init__("valves.ui") - super(insertValveForm,self).__init__("Insert valves","Valve","ball","valve.svg",x,y) - self.move(QPoint(75,225)) - self.sizeList.setCurrentRow(0) - self.ratingList.setCurrentRow(0) - self.btn1.clicked.connect(self.insert) - self.btn2=QPushButton('Reverse') - self.secondCol.layout().addWidget(self.btn2) - self.btn2.clicked.connect(self.reverse) - self.btn3=QPushButton('Apply') - self.secondCol.layout().addWidget(self.btn3) - self.btn3.clicked.connect(self.apply) - self.btn1.setDefault(True) - self.btn1.setFocus() - self.sli=QSlider(Qt.Vertical) - self.sli.setMaximum(100) - self.sli.setMinimum(1) - self.sli.setValue(50) - self.mainHL.addWidget(self.sli) - self.cb1=QCheckBox(' Insert in pipe') - self.secondCol.layout().addWidget(self.cb1) - #self.sli.valueChanged.connect(self.changeL) - self.show() - ######### - self.lastValve=None - def reverse(self): - selValves=[p for p in FreeCADGui.Selection.getSelection() if hasattr(p,'PType') and p.PType=='Valve'] - if len(selValves): - for p in selValves: - pCmd.rotateTheTubeAx(p,FreeCAD.Vector(1,0,0),180) - else: - pCmd.rotateTheTubeAx(self.lastValve,FreeCAD.Vector(1,0,0),180) - def insert(self): - d=self.pipeDictList[self.sizeList.currentRow()] - propList=[d['PSize'],d['VType'],float(pq(d['OD'])),float(pq(d['ID'])),float(pq(d['H'])),float(pq(d['Kv']))] - if self.cb1.isChecked(): # ..place the valve in the middle of pipe(s) - pipes=[p for p in FreeCADGui.Selection.getSelection() if hasattr(p,'PType') and p.PType=='Pipe'] - if pipes: - pos=self.sli.value() - self.lastValve=pCmd.doValves(propList,FreeCAD.__activePypeLine__,pos)[-1] - else: - self.lastValve=pCmd.doValves(propList,FreeCAD.__activePypeLine__)[-1] - def apply(self): - for obj in FreeCADGui.Selection.getSelection(): - d=self.pipeDictList[self.sizeList.currentRow()] - if hasattr(obj,'PType') and obj.PType==self.PType: - obj.PSize=d['PSize'] - obj.PRating=self.PRating - obj.OD=pq(d['OD']) - obj.ID=pq(d['ID']) - obj.Height=pq(d['H']) - obj.Kv=float(d['Kv']) - FreeCAD.activeDocument().recompute() + """ + Dialog to insert Valves. + For position and orientation you can select + - one or more straight edges (centerlines) + - one or more curved edges (axis and origin across the center) + - one or more vertexes + - nothing + Default valve = DN50 ball valve. + Available one button to reverse the orientation of the last or selected valves. + """ + + def __init__(self): + self.PType = "Valve" + self.PRating = "" + # super(insertValveForm,self).__init__("valves.ui") + super(insertValveForm, self).__init__( + translate("insertValveForm", "Insert valves"), + "Valve", + "ball", + "valve.svg", + x, + y, + ) + self.move(QPoint(75, 225)) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.btn1.clicked.connect(self.insert) + self.btn2 = QPushButton(translate("insertValveForm", "Reverse")) + self.secondCol.layout().addWidget(self.btn2) + self.btn2.clicked.connect(self.reverse) + self.btn3 = QPushButton(translate("insertValveForm", "Apply")) + self.secondCol.layout().addWidget(self.btn3) + self.btn3.clicked.connect(self.apply) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.sli = QSlider(Qt.Vertical) + self.sli.setMaximum(100) + self.sli.setMinimum(1) + self.sli.setValue(50) + self.mainHL.addWidget(self.sli) + self.cb1 = QCheckBox(translate("insertValveForm", " Insert in pipe")) + self.secondCol.layout().addWidget(self.cb1) + # self.sli.valueChanged.connect(self.changeL) + self.show() + ######### + self.lastValve = None -import DraftTools,Draft,uForms, uCmd + def reverse(self): + selValves = [ + p + for p in FreeCADGui.Selection.getSelection() + if hasattr(p, "PType") and p.PType == "Valve" + ] + if len(selValves): + for p in selValves: + pCmd.rotateTheTubeAx(p, FreeCAD.Vector(1, 0, 0), 180) + else: + pCmd.rotateTheTubeAx(self.lastValve, FreeCAD.Vector(1, 0, 0), 180) + + def insert(self): + d = self.pipeDictList[self.sizeList.currentRow()] + propList = [ + d["PSize"], + d["VType"], + float(pq(d["OD"])), + float(pq(d["ID"])), + float(pq(d["H"])), + float(pq(d["Kv"])), + ] + if self.cb1.isChecked(): # ..place the valve in the middle of pipe(s) + pipes = [ + p + for p in FreeCADGui.Selection.getSelection() + if hasattr(p, "PType") and p.PType == "Pipe" + ] + if pipes: + pos = self.sli.value() + self.lastValve = pCmd.doValves( + propList, FreeCAD.__activePypeLine__, pos + )[-1] + else: + self.lastValve = pCmd.doValves(propList, FreeCAD.__activePypeLine__)[-1] + + def apply(self): + for obj in FreeCADGui.Selection.getSelection(): + d = self.pipeDictList[self.sizeList.currentRow()] + if hasattr(obj, "PType") and obj.PType == self.PType: + obj.PSize = d["PSize"] + obj.PRating = self.PRating + obj.OD = pq(d["OD"]) + obj.ID = pq(d["ID"]) + obj.Height = pq(d["H"]) + obj.Kv = float(d["Kv"]) + FreeCAD.activeDocument().recompute() + + +import DraftTools, Draft, uForms, uCmd from PySide.QtGui import * + + class point2pointPipe(DraftTools.Line): - ''' - Draw pipes by sequence point. - ''' - def __init__(self, wireFlag=True): - DraftTools.Line.__init__(self,wireFlag) - self.Activated() - self.pform=insertPipeForm() - self.pform.btn1.setText('Reset') - self.pform.btn1.clicked.disconnect(self.pform.insert) - self.pform.btn1.clicked.connect(self.rset) - self.pform.btn3.hide() - self.pform.edit1.hide() - self.pform.sli.hide() - self.pform.cb1=QCheckBox(' Move WP on click ') - self.pform.cb1.setChecked(True) - self.pform.firstCol.layout().addWidget(self.pform.cb1) - dialogPath=join(dirname(abspath(__file__)),"dialogz","hackedline.ui") - self.hackedUI=FreeCADGui.PySideUic.loadUi(dialogPath) - self.hackedUI.btnRot.clicked.connect(self.rotateWP) - self.hackedUI.btnOff.clicked.connect(self.offsetWP) - self.hackedUI.btnXY.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(0,0,1))) - self.hackedUI.btnXZ.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(0,1,0))) - self.hackedUI.btnYZ.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(1,0,0))) - self.ui.layout.addWidget(self.hackedUI) - self.start=None - self.lastPipe=None - self.nodes=list() - def alignWP(self, norm): - FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.nodes[-1],norm) - FreeCADGui.Snapper.setGrid() - def offsetWP(self): - if hasattr(FreeCAD,'DraftWorkingPlane') and hasattr(FreeCADGui,'Snapper'): - s=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") - sc=[float(x*s) for x in [1,1,.2]] - varrow =uCmd.arrow(FreeCAD.DraftWorkingPlane.getPlacement(),scale=sc,offset=s) - offset=QInputDialog.getInt(None, translate("pForms", "Offset Work Plane"), translate("pForms", "Offset: ")) - if offset[1]: - uCmd.offsetWP(offset[0]) - FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(varrow.node) - def rotateWP(self): - self.form=uForms.rotWPForm() - def rset(self): - self.start=None - self.lastPipe=None - def action(self,arg): #re-defintition of the method of parent - "scene event handler" - if arg["Type"] == "SoKeyboardEvent" and arg["State"]=='DOWN': - # key detection - if arg["Key"] == "ESCAPE": - self.pform.close() - self.finish() - elif arg["Type"] == "SoLocation2Event": - # mouse movement detection - self.point,ctrlPoint,info = DraftTools.getPoint(self,arg) - elif arg["Type"] == "SoMouseButtonEvent": - FreeCAD.activeDocument().openTransaction('point-to-point') - # mouse button detection - if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - if (arg["Position"] == self.pos): - self.finish(False,cont=True) - else: - if (not self.node) and (not self.support): - DraftTools.getSupport(arg) - self.point,ctrlPoint,info = DraftTools.getPoint(self,arg) - if self.point: - self.ui.redraw() - self.pos = arg["Position"] - self.nodes.append(self.point) - #try: - #print(arg) - #print(self.point) - #print(ctrlPoint) - #print(info) - #except: - #pass - if not self.start: - self.start=self.point - else: - if self.lastPipe: - prev=self.lastPipe - else: - prev=None - d=self.pform.pipeDictList[self.pform.sizeList.currentRow()] - v=self.point-self.start - propList=[d['PSize'],float(pq(d['OD'])),float(pq(d['thk'])),float(v.Length)] - self.lastPipe=pCmd.makePipe(propList,self.start,v) - if self.pform.combo.currentText()!='': - pCmd.moveToPyLi(self.lastPipe,self.pform.combo.currentText()) - self.start=self.point - FreeCAD.ActiveDocument.recompute() - if prev: - c= pCmd.makeElbowBetweenThings(prev,self.lastPipe, [d['PSize'],float(pq(d['OD'])),float(pq(d['thk'])),90,float(pq(d['OD'])*.75)]) - if c and self.pform.combo.currentText()!='': - pCmd.moveToPyLi(c,self.pform.combo.currentText()) - FreeCAD.ActiveDocument.recompute() - if self.pform.cb1.isChecked(): - rot=FreeCAD.DraftWorkingPlane.getPlacement().Rotation - normal=rot.multVec(FreeCAD.Vector(0,0,1)) - FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.point,normal) - FreeCADGui.Snapper.setGrid() - if (not self.isWire and len(self.node) == 2): - self.finish(False,cont=True) - if (len(self.node) > 2): - if ((self.point-self.node[0]).Length < Draft.tolerance()): - self.undolast() - self.finish(True,cont=True) - FreeCAD.activeDocument().commitTransaction() + """ + Draw pipes by sequence point. + """ + + def __init__(self, wireFlag=True): + DraftTools.Line.__init__(self, wireFlag) + self.Activated() + self.pform = insertPipeForm() + self.pform.btn1.setText(translate("point2pointPipe", "Reset")) + self.pform.btn1.clicked.disconnect(self.pform.insert) + self.pform.btn1.clicked.connect(self.rset) + self.pform.btn3.hide() + self.pform.edit1.hide() + self.pform.sli.hide() + self.pform.cb1 = QCheckBox(translate("point2pointPipe", " Move WP on click ")) + self.pform.cb1.setChecked(True) + self.pform.firstCol.layout().addWidget(self.pform.cb1) + dialogPath = join(dirname(abspath(__file__)), "dialogz", "hackedline.ui") + self.hackedUI = FreeCADGui.PySideUic.loadUi(dialogPath) + self.hackedUI.btnRot.clicked.connect(self.rotateWP) + self.hackedUI.btnOff.clicked.connect(self.offsetWP) + self.hackedUI.btnXY.clicked.connect( + lambda: self.alignWP(FreeCAD.Vector(0, 0, 1)) + ) + self.hackedUI.btnXZ.clicked.connect( + lambda: self.alignWP(FreeCAD.Vector(0, 1, 0)) + ) + self.hackedUI.btnYZ.clicked.connect( + lambda: self.alignWP(FreeCAD.Vector(1, 0, 0)) + ) + self.ui.layout.addWidget(self.hackedUI) + self.start = None + self.lastPipe = None + self.nodes = list() + + def alignWP(self, norm): + FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.nodes[-1], norm) + FreeCADGui.Snapper.setGrid() + + def offsetWP(self): + if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt( + "gridSize" + ) + sc = [float(x * s) for x in [1, 1, 0.2]] + varrow = uCmd.arrow( + FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s + ) + offset = QInputDialog.getInt( + None, + translate("pForms", "Offset Work Plane"), + translate("pForms", "Offset: "), + ) + if offset[1]: + uCmd.offsetWP(offset[0]) + FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild( + varrow.node + ) + + def rotateWP(self): + self.form = uForms.rotWPForm() + + def rset(self): + self.start = None + self.lastPipe = None + + def action(self, arg): # re-defintition of the method of parent + "scene event handler" + if arg["Type"] == "SoKeyboardEvent" and arg["State"] == "DOWN": + # key detection + if arg["Key"] == "ESCAPE": + self.pform.close() + self.finish() + elif arg["Type"] == "SoLocation2Event": + # mouse movement detection + self.point, ctrlPoint, info = DraftTools.getPoint(self, arg) + elif arg["Type"] == "SoMouseButtonEvent": + FreeCAD.activeDocument().openTransaction("point-to-point") + # mouse button detection + if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): + if arg["Position"] == self.pos: + self.finish(False, cont=True) + else: + if (not self.node) and (not self.support): + DraftTools.getSupport(arg) + self.point, ctrlPoint, info = DraftTools.getPoint(self, arg) + if self.point: + self.ui.redraw() + self.pos = arg["Position"] + self.nodes.append(self.point) + # try: + # print(arg) + # print(self.point) + # print(ctrlPoint) + # print(info) + # except: + # pass + if not self.start: + self.start = self.point + else: + if self.lastPipe: + prev = self.lastPipe + else: + prev = None + d = self.pform.pipeDictList[ + self.pform.sizeList.currentRow() + ] + v = self.point - self.start + propList = [ + d["PSize"], + float(pq(d["OD"])), + float(pq(d["thk"])), + float(v.Length), + ] + self.lastPipe = pCmd.makePipe(propList, self.start, v) + if self.pform.combo.currentText() != "": + pCmd.moveToPyLi( + self.lastPipe, self.pform.combo.currentText() + ) + self.start = self.point + FreeCAD.ActiveDocument.recompute() + if prev: + c = pCmd.makeElbowBetweenThings( + prev, + self.lastPipe, + [ + d["PSize"], + float(pq(d["OD"])), + float(pq(d["thk"])), + 90, + float(pq(d["OD"]) * 0.75), + ], + ) + if c and self.pform.combo.currentText() != "": + pCmd.moveToPyLi(c, self.pform.combo.currentText()) + FreeCAD.ActiveDocument.recompute() + if self.pform.cb1.isChecked(): + rot = FreeCAD.DraftWorkingPlane.getPlacement().Rotation + normal = rot.multVec(FreeCAD.Vector(0, 0, 1)) + FreeCAD.DraftWorkingPlane.alignToPointAndAxis( + self.point, normal + ) + FreeCADGui.Snapper.setGrid() + if not self.isWire and len(self.node) == 2: + self.finish(False, cont=True) + if len(self.node) > 2: + if (self.point - self.node[0]).Length < Draft.tolerance(): + self.undolast() + self.finish(True, cont=True) + FreeCAD.activeDocument().commitTransaction() + class insertTankForm(dodoDialogs.protoTypeDialog): - def __init__(self): - self.nozzles=list() - super(insertTankForm,self).__init__('tank.ui') - tablez=listdir(join(dirname(abspath(__file__)),"tablez")) - self.pipeRatings=[s.lstrip("Pipe_").rstrip(".csv") for s in tablez if s.startswith("Pipe") and s.endswith('.csv')] - self.flangeRatings=[s.lstrip("Flange_").rstrip(".csv") for s in tablez if s.startswith("Flange") and s.endswith('.csv')] - self.form.comboPipe.addItems(self.pipeRatings) - self.form.comboFlange.addItems(self.flangeRatings) - self.form.btn1.clicked.connect(self.addNozzle) - self.form.editLength.setValidator(QDoubleValidator()) - self.form.editX.setValidator(QDoubleValidator()) - self.form.editY.setValidator(QDoubleValidator()) - self.form.editZ.setValidator(QDoubleValidator()) - self.form.comboPipe.currentIndexChanged.connect(self.combine) - self.form.comboFlange.currentIndexChanged.connect(self.combine) - def accept(self): - dims=list() - for lineEdit in [self.form.editX, self.form.editY, self.form.editZ]: - if lineEdit.text(): - dims.append(float(lineEdit.text())) - else: - dims.append(1000) - t=pCmd.makeShell(*dims) - so=None - if FreeCADGui.Selection.getSelectionEx(): so=FreeCADGui.Selection.getSelectionEx()[0].SubObjects - if so: - so0=so[0] - if so0.Faces: - t.Placement.Base=so0.Faces[0].CenterOfMass - elif so0.Edges: - t.Placement.Base=so0.Edges[0].CenterOfMass - elif so0.Vertexes: - t.Placement.Base=so0.Vertexes[0].Point - def addNozzle(self): - DN=self.form.listSizes.currentItem().text() - args=self.nozzles[DN] - FreeCAD.ActiveDocument.openTransaction('Add nozzles') - pCmd.makeNozzle(DN, float(self.form.editLength.text()), *args) - FreeCAD.ActiveDocument.commitTransaction() - def combine(self): - print('doing combine') - self.form.listSizes.clear() - try: - fileName="Pipe_"+self.form.comboPipe.currentText()+".csv" - print(fileName) - f=open(join(dirname(abspath(__file__)),"tablez",fileName),'r') - reader=csv.DictReader(f,delimiter=';') - pipes=dict([[line['PSize'],[float(line['OD']),float(line['thk'])]] for line in reader]) - f.close() - fileName="Flange_"+self.form.comboFlange.currentText()+".csv" - print(fileName) - f=open(join(dirname(abspath(__file__)),"tablez",fileName),'r') - reader=csv.DictReader(f,delimiter=';') - flanges=dict([[line['PSize'],[float(line['D']), float(line['d']), float(line['df']), float(line['f']), float(line['t']), int(line['n'])]] for line in reader]) - f.close() - print('files read') - except: - print('files not read') - return - listNozzles=[[p[0],p[1]+flanges[p[0]]] for p in pipes.items() if p[0] in flanges.keys()] - print('listNozzles: %s' %str(listNozzles)) - self.nozzles=dict(listNozzles) - self.form.listSizes.addItems(list(self.nozzles.keys())) - #self.form.listSizes.sortItems() + def __init__(self): + self.nozzles = list() + super(insertTankForm, self).__init__("tank.ui") + tablez = listdir(join(dirname(abspath(__file__)), "tablez")) + self.pipeRatings = [ + s.lstrip("Pipe_").rstrip(".csv") + for s in tablez + if s.startswith("Pipe") and s.endswith(".csv") + ] + self.flangeRatings = [ + s.lstrip("Flange_").rstrip(".csv") + for s in tablez + if s.startswith("Flange") and s.endswith(".csv") + ] + self.form.comboPipe.addItems(self.pipeRatings) + self.form.comboFlange.addItems(self.flangeRatings) + self.form.btn1.clicked.connect(self.addNozzle) + self.form.editLength.setValidator(QDoubleValidator()) + self.form.editX.setValidator(QDoubleValidator()) + self.form.editY.setValidator(QDoubleValidator()) + self.form.editZ.setValidator(QDoubleValidator()) + self.form.comboPipe.currentIndexChanged.connect(self.combine) + self.form.comboFlange.currentIndexChanged.connect(self.combine) + + def accept(self): + dims = list() + for lineEdit in [self.form.editX, self.form.editY, self.form.editZ]: + if lineEdit.text(): + dims.append(float(lineEdit.text())) + else: + dims.append(1000) + t = pCmd.makeShell(*dims) + so = None + if FreeCADGui.Selection.getSelectionEx(): + so = FreeCADGui.Selection.getSelectionEx()[0].SubObjects + if so: + so0 = so[0] + if so0.Faces: + t.Placement.Base = so0.Faces[0].CenterOfMass + elif so0.Edges: + t.Placement.Base = so0.Edges[0].CenterOfMass + elif so0.Vertexes: + t.Placement.Base = so0.Vertexes[0].Point + + def addNozzle(self): + DN = self.form.listSizes.currentItem().text() + args = self.nozzles[DN] + FreeCAD.ActiveDocument.openTransaction("Add nozzles") + pCmd.makeNozzle(DN, float(self.form.editLength.text()), *args) + FreeCAD.ActiveDocument.commitTransaction() + + def combine(self): + print(translate("insertTankForm", "doing combine")) + self.form.listSizes.clear() + try: + fileName = "Pipe_" + self.form.comboPipe.currentText() + ".csv" + print(fileName) + f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") + reader = csv.DictReader(f, delimiter=";") + pipes = dict( + [ + [line["PSize"], [float(line["OD"]), float(line["thk"])]] + for line in reader + ] + ) + f.close() + fileName = "Flange_" + self.form.comboFlange.currentText() + ".csv" + print(fileName) + f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") + reader = csv.DictReader(f, delimiter=";") + flanges = dict( + [ + [ + line["PSize"], + [ + float(line["D"]), + float(line["d"]), + float(line["df"]), + float(line["f"]), + float(line["t"]), + int(line["n"]), + ], + ] + for line in reader + ] + ) + f.close() + print(translate("insertTankForm", "files read")) + except: + print(translate("insertTankForm", "files not read")) + return + listNozzles = [ + [p[0], p[1] + flanges[p[0]]] + for p in pipes.items() + if p[0] in flanges.keys() + ] + print(translate("insertTankForm", "listNozzles: %s") % str(listNozzles)) + self.nozzles = dict(listNozzles) + self.form.listSizes.addItems(list(self.nozzles.keys())) + # self.form.listSizes.sortItems() + class insertRouteForm(dodoDialogs.protoTypeDialog): - ''' - Dialog for makeRoute(). - ''' - def __init__(self): - FreeCADGui.Selection.clearSelection() - super(insertRouteForm,self).__init__('route.ui') - self.normal=FreeCAD.Vector(0,0,1) - self.L=0 - self.obj=None - self.edge=None - self.form.edit1.setValidator(QDoubleValidator()) - self.form.btn1.clicked.connect(self.selectAction) - self.form.btn2.clicked.connect(self.mouseActionB1) - self.form.btnX.clicked.connect(lambda: self.getPrincipalAx('X')) - self.form.btnY.clicked.connect(lambda: self.getPrincipalAx('Y')) - self.form.btnZ.clicked.connect(lambda: self.getPrincipalAx('Z')) - self.form.slider.valueChanged.connect(self.changeOffset) #lambda:self.form.edit1.setText(str(self.form.dial.value()))) - #self.form.edit1.editingFinished.connect(self.moveSlider) #lambda:self.form.dial.setValue(int(round(self.form.edit1.text())))) - def changeOffset(self): - if self.L: - offset=self.L*self.form.slider.value()/100 - self.form.edit1.setText('%.1f' %offset) - def getPrincipalAx(self, ax): - if ax=='X': self.normal=FreeCAD.Vector(1,0,0) - elif ax=='Y': self.normal=FreeCAD.Vector(0,1,0) - elif ax=='Z': self.normal=FreeCAD.Vector(0,0,1) - self.form.lab1.setText("global "+ax) - def accept(self, ang=None): - FreeCAD.ActiveDocument.openTransaction('Make pipe route') - if fCmd.edges(): - e=fCmd.edges()[0] - if e.curvatureAt(0): - pCmd.makeRoute(self.normal) - else: - s=FreeCAD.ActiveDocument.addObject('Sketcher::SketchObject','pipeRoute') - s.MapMode = "NormalToEdge" - s.Support = [(self.obj,self.edge)] - s.AttachmentOffset = FreeCAD.Placement(FreeCAD.Vector(0,0,-1*float(self.form.edit1.text())),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),0)) - FreeCADGui.activeDocument().setEdit(s.Name) - FreeCAD.ActiveDocument.commitTransaction() - def selectAction(self): - if fCmd.faces(): - self.normal=fCmd.faces()[0].normalAt(0,0) - elif fCmd.edges(): - self.normal=fCmd.edges()[0].tangentAt(0) - else: - self.normal=FreeCAD.Vector(0,0,1) - self.form.lab1.setText("%.1f,%.1f,%.1f " %(self.normal.x,self.normal.y,self.normal.z)) - def mouseActionB1(self, CtrlAltShift=[False,False,False]): - v = FreeCADGui.ActiveDocument.ActiveView - infos = v.getObjectInfo(v.getCursorPos()) - self.form.slider.setValue(0) - if infos and infos['Component'][:4]=='Edge': - self.obj=FreeCAD.ActiveDocument.getObject(infos['Object']) - self.edge=infos['Component'] - i=int(self.edge[4:])-1 - e=self.obj.Shape.Edges[i] - if e.curvatureAt(0)==0: - self.L=e.Length - else: - self.L=0 - self.form.lab2.setText(infos['Object']+': '+self.edge) - elif fCmd.edges(): - selex=FreeCADGui.Selection.getSelectionEx()[0] - self.obj=selex.Object - e=fCmd.edges()[0] - self.edge=fCmd.edgeName(e)[1] - self.L=float(e.Length) - self.form.lab2.setText(self.edge+' of '+self.obj.Label) - else: - self.L=0 - self.obj=None - self.edge=None - self.form.lab2.setText('")) diff --git a/translationz/dodo.ts b/translationz/dodo.ts index 11a344e..1e59be6 100644 --- a/translationz/dodo.ts +++ b/translationz/dodo.ts @@ -462,6 +462,14 @@ + + DialogQM + + + Quick Insert + + + FrameBranchManager @@ -586,6 +594,34 @@ + + breakForm + + + Break the pipes + + + + + Length + + + + + <reference> + + + + + PypeLine: + + + + + <none> + + + breakPipe @@ -655,6 +691,47 @@ + + dpCalcDialog + + + + No data found + + + + + It seems the fluid has not +a liquid state. + + + + + *** LIQUID *** + + + + + Flow (m3/h) + + + + + It seems the fluid has not +a gas state. + + + + + *** GAS/VAPOUR *** + + + + + Flow (kg/h) + + + elbowQM @@ -845,6 +922,24 @@ + + insertBranchForm + + + Insert a branch + + + + + <name> + + + + + <bend radius> + + + insertCap @@ -854,6 +949,24 @@ + + insertCapForm + + + Insert caps + + + + + Reverse + + + + + Apply + + + insertElbow @@ -863,6 +976,55 @@ + + insertElbowForm + + + Insert elbows + + + + + <bend angle> + + + + + <bend radius> + + + + + Trim/Extend + + + + + Reverse + + + + + Apply + + + + + 0 deg + + + + + Wrong selection + + + + + + deg + + + insertFlange @@ -872,6 +1034,24 @@ + + insertFlangeForm + + + Insert flanges + + + + + Reverse + + + + + Apply + + + insertPath @@ -894,6 +1074,24 @@ + + insertPipeForm + + + Insert pipes + + + + + Reverse + + + + + Apply + + + insertPypeLine @@ -907,6 +1105,49 @@ + + insertPypeLineForm + + + PypeLine Manager + + + + + <name> + + + + + Redraw + + + + + Part list + + + + + Color + + + + + Get Path + + + + + Get Profile + + + + + <new> + + + insertReduct @@ -916,6 +1157,29 @@ + + insertReductForm + + + Insert reductions + + + + + Reverse + + + + + Apply + + + + + Eccentric + + + insertRoute @@ -929,6 +1193,14 @@ + + insertRouteForm + + + <select an edge> + + + insertSection @@ -955,6 +1227,29 @@ + + insertTankForm + + + doing combine + + + + + files read + + + + + files not read + + + + + listNozzles: %s + + + insertUbolt @@ -964,6 +1259,39 @@ + + insertUboltForm + + + Insert U-bolt + + + + + - no ref. face - + + + + + Ref. face + + + + + Head + + + + + Middle + + + + + Tail + + + insertValve @@ -973,6 +1301,29 @@ + + insertValveForm + + + Insert valves + + + + + Reverse + + + + + Apply + + + + + Insert in pipe + + + joinPype @@ -1135,6 +1486,19 @@ Branches and header's axes must be ortho + + point2pointPipe + + + Reset + + + + + Move WP on click + + + profEdit @@ -1204,6 +1568,41 @@ Branches and header's axes must be ortho + + protoPypeForm + + + + Rating: + + + + + Insert + + + + + protoTypeDialog + + + "%s" to select; "%s" to execute + + + + + + No view available. + + + + + + Actions "%s" and "%s" removed + + + + queryModel @@ -1256,6 +1655,19 @@ Branches and header's axes must be ortho + + rotWPForm + + + Angle: + + + + + Rotate working plane + + + rotateWorkPlane @@ -1343,6 +1755,61 @@ Branches and header's axes must be ortho uForms + + + QueryTool + + + + + (Select a object) + + + + + (base) + + + + + Base: + + + + + (angle) + + + + + Rotation angle: + + + + + v = (x,y,z) + + + + + Rotation axis: + + + + + (Sub object property) + + + + + (Beam property) + + + + + (Profile property) + + QueryObject @@ -1354,13 +1821,13 @@ Branches and header's axes must be ortho - - Rotate WP + + Angle: - - Angle: + + Rotate WP @@ -1414,6 +1881,11 @@ Branches and header's axes must be ortho < select a target face > + + + Set normal + + Set notmal @@ -1465,16 +1937,31 @@ Branches and header's axes must be ortho Set dist. + + + Z: + + Z: + + + Steps: + + Steps: + + + Y: + + Y: @@ -1485,6 +1972,11 @@ Branches and header's axes must be ortho copy + + + X: + + X: @@ -1764,6 +2256,11 @@ Branches and header's axes must be ortho AddBeams + + + Add single beam + + Add single diff --git a/translationz/dodo_es-ES.qm b/translationz/dodo_es-ES.qm index 8e4ded05166fe01cf5d2a42c2d64d6a2294e1dbb..521ae61542e1f9cb0bc3a37398b930aef42c84a0 100644 GIT binary patch literal 33746 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 Nre6!%*DPA}{{eo+F9-kt delta 1351 zcmWku3s6*L7(ILM-n)A*yL*?1NHPL}V1iGOholICqXsCfIA$X%A|ZpZ#Ve)BwKPmq zlddm(VGkY493591B`XJFOicuIWy(iTYUC(Mf>Aisadvk8`M>u$-}!IbdZBfrVe4?0 z@c=Mu4dCMs>2NyF0Z3oJ2l&P#KJyGPwgl5&S`9?^AY)V^{pnb^wu%0uSa>`J7}f>n zH;;kmb5Uk*1V(3JW!_1iHQ42z4p<{`(*79`e-@svW&&Q-xc)Zd#-A|^_4L7oQCkd= z#h(HbB||~D6`1q<2$|wR!0Zt6 zuj)YLCZQ^_f(>0lRdzC;iV_7FhxVYsm;N2p$1TbIl7TR?i2e~eEMfACVm^v|{ z^IITknV7SLNQNH~=XWw7c(V9vpB)G<6f0`B17pg?5BIR3bWc3;_j$m+L%h7-4Fm>= zzXmO3gF<8aXy%7ZHKwmB<3PU{U(eHXVmXz!8sTx|j- zxuq-RM26i`d*vxoog(!V5pmcGssDfiO#WE*owFGT>Xm&<828*cIqGaEV5pbVTnz^+hbjIcU~@E@#|5b5q$64tUFa-bbRSx4O(1 zEgDPN)#>~4=`U1E7W4IlRI7EZKM~*wwV{jlDGQp_ zR;8Be&rqLyxs)p3>{Z|2O|hKzYHzbp&A(gZW7~jH|5%ilxuUp-7O%aGBNxsvHc)R` zE`FawYU?b$vK#P=w)*WH!NI%rD`tOJaJ}`-%7^T;&RVMw=OiC%Z7%Pz;nw3@5AzX> zv))O#L4rf9chb^;7t?GJNkPQrv?bp-MZAC5mTzB631!;e7$^fG7T9jjAil5@TA+je z2uX|G5DLf+E%DEJY=2ivsd{$buVp*>F&*KG=JXI~$VKf^MHBJawIADjDSlP!*ff?X z8nmACjr`2mwBE}J3&?NHn8?)jeM1)SW5* M?hUKLB&KEj50T`4$p8QV diff --git a/translationz/dodo_es-ES.ts b/translationz/dodo_es-ES.ts index 7341162..83e1c72 100644 --- a/translationz/dodo_es-ES.ts +++ b/translationz/dodo_es-ES.ts @@ -240,24 +240,24 @@ The extension of the tail - + La extension de la cola The extension of the head - + La extension de la cabezera The rotation of the section - + La rotacion de la seccion Flow factor (m3/h/bar) - + Factor de flujo (m3/h/bar) @@ -268,7 +268,7 @@ Width of the beam - + Ancho de la viga @@ -279,104 +279,93 @@ Height of the beam - + Alto de la viga Thickness of the vertical sides - + Espesor de los lados verticales Thickness of the horizontal sides - + Espesor de los lados horizontales Diameter of the beam - + Diametro de la viga Thickness - - - - - - W of the beam - + Espesor Thickness of the webs - - - - - H of the beam - + Espesor de la redes Thickness of the web - + Espesor de la red Thickness of the flanges - + Espesor de las bridas Width of the flanges - + Ancho de las bridas Thickness 1 - + Espesor 1 Thickness 2 - + Espesor 2 Thickness 3 - + Espesor 3 Width of the bottom flange - + Ancho inferior de la brida Width of the top flange - + Ancho superior de la brida Outside diameter - + Diametro exterior Wall thickness - + Espesor de pared @@ -384,22 +373,22 @@ the edges - + Los bordes the profile - + El perfil The path. - + La trayectoria. The profile - + El perfil @@ -408,17 +397,17 @@ Type of frameFeature - + Tipo de caracteristica de marco Size of frame - + Tamaño de marco The group. - + El grupo. @@ -431,12 +420,12 @@ Type of section - + Tipo de seccion Type of tubeFeature - + Tipo de caracteristica de tubo @@ -446,7 +435,7 @@ Nominal diameter - + Diametro nominal @@ -454,7 +443,7 @@ The beams names - + Los nombres de las vigas @@ -462,6 +451,14 @@ Ports position relative to the origin of Shape + Posiciones de los puertos relativos al origen de la forma + + + + DialogQM + + + Quick Insert @@ -599,6 +596,34 @@ Liga un tipo de tuberia al puerto mas cercano de la tuberia seleccionada + + breakForm + + + Break the pipes + + + + + Length + + + + + <reference> + + + + + PypeLine: + + + + + <none> + + + breakPipe @@ -668,6 +693,57 @@ Revisar __doc__ del modulo para mayor información. + + dpCalcDialog + + + + No data found + Datos no encontrados + + + + It seems the fluid has not +a liquid state. + + + + + It seems the fluid has not a liquid state. + Parece que el fluido no tiene un estado liquido + + + + *** LIQUID *** + *** LIQUIDO *** + + + + Flow (m3/h) + Flujo (m3/h) + + + + It seems the fluid has not +a gas state. + + + + + It seems the fluid has not a gas state. + Parece que el fluido no tiene un estado gaseoso + + + + *** GAS/VAPOUR *** + *** GAS/VAPOR *** + + + + Flow (kg/h) + Flujo (kg/h) + + elbowQM @@ -686,7 +762,7 @@ Extend the beam either to a face, a vertex or the c.o.m. of the selected object - Extiende la viga a sea hacia una cara, vertice o C.O.M del objeto seleccionado + Extiende la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado @@ -694,7 +770,7 @@ Extends pipe to intersection - Extiende tubo a la insercción + Extiende tubo a la interseccion @@ -856,6 +932,24 @@ Insertar una derivacion de tuberia + + insertBranchForm + + + Insert a branch + + + + + <name> + + + + + <bend radius> + + + insertCap @@ -864,6 +958,24 @@ Insertar un tapon + + insertCapForm + + + Insert caps + + + + + Reverse + + + + + Apply + + + insertElbow @@ -872,6 +984,55 @@ Insertar una curva + + insertElbowForm + + + Insert elbows + + + + + <bend angle> + + + + + <bend radius> + + + + + Trim/Extend + + + + + Reverse + + + + + Apply + + + + + 0 deg + + + + + Wrong selection + + + + + + deg + + + insertFlange @@ -880,6 +1041,24 @@ Insertar una brida + + insertFlangeForm + + + Insert flanges + + + + + Reverse + + + + + Apply + + + insertPath @@ -901,6 +1080,24 @@ Insertar un tubo + + insertPipeForm + + + Insert pipes + Insertar tuberia + + + + Reverse + Invertir + + + + Apply + Aplicar + + insertPypeLine @@ -914,6 +1111,49 @@ Abre gestor de tuberia de linea + + insertPypeLineForm + + + PypeLine Manager + + + + + <name> + + + + + Redraw + + + + + Part list + + + + + Color + + + + + Get Path + + + + + Get Profile + + + + + <new> + + + insertReduct @@ -922,6 +1162,29 @@ Insertar una reducción + + insertReductForm + + + Insert reductions + + + + + Reverse + + + + + Apply + + + + + Eccentric + + + insertRoute @@ -935,6 +1198,14 @@ Crea un boceto adjunta a una aristar circular + + insertRouteForm + + + <select an edge> + + + insertSection @@ -961,6 +1232,29 @@ Crea un deposito y boquillas + + insertTankForm + + + doing combine + + + + + files read + + + + + files not read + + + + + listNozzles: %s + + + insertUbolt @@ -969,6 +1263,39 @@ Insertar un tornillo U + + insertUboltForm + + + Insert U-bolt + + + + + - no ref. face - + + + + + Ref. face + + + + + Head + + + + + Middle + + + + + Tail + + + insertValve @@ -977,6 +1304,29 @@ Insertar una valvula + + insertValveForm + + + Insert valves + + + + + Reverse + + + + + Apply + + + + + Insert in pipe + + + joinPype @@ -1021,10 +1371,15 @@ Connect to header - + Conectar a la cabezera + Connect branches to one header pipe Branches and header's axes must be ortho + Conectar rama a una de las cabezeras de tubo; Ejes de ramificaciones y cabezeras deben ser ortogonales + + + Connect branches to one header pipe Branches and header's axes must be ortho @@ -1097,12 +1452,12 @@ Branches and header's axes must be ortho Offset Work Plane - + Desface de plano de trabajo Offset: - + Desface: @@ -1139,74 +1494,132 @@ Branches and header's axes must be ortho Da clic en puntos subsecuentes. + + point2pointPipe + + + Reset + Reiniciar + + + + Move WP on click + Mover plano de trabajo al click + + profEdit Square Profile name in the Tree View - + Rectangular T-profile Profile name in the Tree View - + Perfil T U-profile Profile name in the Tree View - + Perfil U H-profile Profile name in the Tree View - + Perfil H L-profile Profile name in the Tree View - + Perfil L Z-profile Profile name in the Tree View - + Perfil Z Omega-profile Profile name in the Tree View - + Perfil Omega Circle-profile Profile name in the Tree View - + Perfil circular Insert profile Transaction, used on undo/redo lists - + Insertar perfil Modify profile Transaction, used on undo/redo lists - + Modificar perfil Shift profile Transaction, used on undo/redo lists + Gira perfil + + + + protoPypeForm + + + + Rating: + + + Insert + Insertar + + + + protoTypeDialog + + + "%s" to select; "%s" to execute + + + + + + "%s" to select; "%s" to execute + "%s" para seleccionar; "%s" para ejecutar + + + + No view available. + + Vista no disponible + + + + Actions "%s" and "%s" removed + + + + + + Actions "%s" and "%s" removed + Acciones "%s" y "%s" eliminado + queryModel @@ -1260,12 +1673,25 @@ Branches and header's axes must be ortho Rota y alinea la viga acorde a otra arista + + rotWPForm + + + Angle: + Angulo: + + + + Rotate working plane + Rotar plano de trabajo + + rotateWorkPlane rotate Workplane - Rota el plano de trabajo + Rotar plano de trabajo @@ -1333,40 +1759,95 @@ para exportar en formato step Quick move Transaction - + Movimiento rapido Offset Work Plane - + Desfasar plano de trabajo Offset: - + Desface: uForms + + + QueryTool + Herramienta de consulta + + + + (Select a object) + (Seleccionar un objeto) + + + + (base) + (base) + + + + Base: + Base: + + + + (angle) + (angulo) + + + + Rotation angle: + Angulo de rotacion: + + + + v = (x,y,z) + v = (x,y,z) + + + + Rotation axis: + Eje de rotacion: + + + + (Sub object property) + (Propiedad de sub objeto) + + + + (Beam property) + (Propiedad de viga) + + + + (Profile property) + (Propiedad de perfil) + QueryObject - + Consulta de objeto Exit - - - - - Rotate WP - + Salir Angle: - + Angulo: + + + + Rotate WP + Rotar plano de trabajo @@ -1382,62 +1863,62 @@ para exportar en formato step Align flanges - + Alinear bridas normY - + Normal a Y YZ - + YZ (S)elect face - + (S)elecciona cara XZ - + XZ hotkeys: "S" to select, "X" to execute - + Teclas rapidas: "S" para seleccionar, "X" para ejecutar XY - + XY < select a target face > - + < selecciona una cara como objetivo > - Set notmal - + Set normal + Asignar normal normX - + Normal a X normZ - + Normal a Z Invert normal - + Invertir normal @@ -1445,45 +1926,50 @@ para exportar en formato step Move - + Mover Multiple: - + Multiplicar: 1 - + 1 0 - + 0 Set dist. - + Asignar distancia - Z: + Z: + Z: + + + + Steps: Steps: - + Pasos: - Y: - + Y: + Y: @@ -1492,13 +1978,13 @@ para exportar en formato step - X: - + X: + X: hotkeys: "S" to select, "X" to execute - + teclas rapidas: "S" para seleccionar, "X" para ejecutar @@ -1506,42 +1992,42 @@ para exportar en formato step Stretch - + Estirar (S)et length - + (S)Asignar longitud both - + ambos head - + cabecera tail - + cola New length - mm: - + Nueva longitud - mm: hotkeys: "S" to select, "X" to execute - + teclas rapidas: "S" para seleccionar, "X" para ejecutar Stretched end: - + Estirado final @@ -1549,29 +2035,29 @@ para exportar en formato step Dialog - + Dialogo Angle: - + Angulo: SET - + Asignar * Click on arrow to move * Ctrl+Click to go back * Ctrl+Alt+Click to rotate - + * Cliquear en flecha para mover * Control+clic para regresar * control+alt+clic para rotar Displacement: - + Desplazamiento: @@ -1589,22 +2075,22 @@ para exportar en formato step Dp calculator - + Calculadora de Dp calculation - + calculo Nr. of curves = 0 - + Numero de curvas = 0 Roughness (um) - + Rugozidad (um) @@ -1620,52 +2106,52 @@ para exportar en formato step Flow-rate (m3/h) - + Ritmo de flujo (m3/h) Total length = 0 - + Longitud total = 0 Scope - + Alcance <on selection> - + <en seleccion> Pipe material - + Material de tubo fluid properties - + Propiedades del fluido Density (kg/m3) - + Densidad (kg/m3) liquid - + liquido T (°C) - + T (°C) Viscosity (cP) - + Viscosidad (cP) @@ -1676,7 +2162,7 @@ para exportar en formato step gas/vapour - + gas/vapor @@ -1686,27 +2172,27 @@ para exportar en formato step Name - + Nombre P abs. (bar) - + Presion absoluta. (bar) results - + resultados Export - + Exportar *** LIQUID *** - + *** LIQUIDO *** @@ -1719,22 +2205,22 @@ para exportar en formato step Extend beams - + Extender viga < select a target > - + <seleccionar un objetivo> (S)elect target - + (S)elecciona un objetivo hotkeys: "S" to select, "X" to execute - + teclas rapidas: "S" para seleccionar, "X" para ejecutar @@ -1742,82 +2228,82 @@ para exportar en formato step FrameBranch Manager - + Gestor de marcos ramificados <no target selected> - + <ningun objetivo seleccionado> <degrees> - + <grados> offset tail - + Desfasar cola Trim/Extend - + Cortar/Extender AddBeams - + Agregar vigas - Add single - + Add single beam + Agregar viga simple ChangeProfile - + Cambiar perfil <name> - + <nombre> <no item selected> - + <ningun elemento seleccionado> Redraw - + Redibujar offset head - + Desfasar cabezera RemoveBeams - + Eliminar vigas Get targets - + Obtener objetivos <length> - + <longitud> hotkeys: "S" to select, "X" to trim - + teclas rapidas: "S" para seleccionar, "X" para ejecutar @@ -1825,32 +2311,32 @@ para exportar en formato step Fill frame - + Llenar marco move - + mover (S)elect - + (S)eleccionar < select a beam > - + < selecciona una viga > copy - + copiar hotkeys: "S" to select, "X" to execute - + teclas rapidas: "S" para seleccionar, "X" para ejecutar @@ -1858,29 +2344,29 @@ para exportar en formato step Dialog - + Dialogo (M)ove origin on click - + (M)over origen en clic (R)otate WP - + (R)otar plano de trabajo (O)ffset WP - + (O)Desface de plano de trabajo Align WP to principal plane - + Alinear plano de trabajo al plano principal @@ -1903,12 +2389,12 @@ para exportar en formato step Join pypes - + Unir tubos Reset - + Reiniciar @@ -1921,7 +2407,7 @@ para exportar en formato step Dialog - + Dialogo @@ -1931,7 +2417,7 @@ para exportar en formato step Insert - + Insertar @@ -1939,7 +2425,7 @@ para exportar en formato step Rotate around axis - + Rotar alrededor del eje @@ -1959,7 +2445,7 @@ para exportar en formato step Reverse - + Invertir @@ -1969,12 +2455,12 @@ para exportar en formato step <select one axis> - + <selecciona un eje> copy items - + copiar elementos @@ -1984,7 +2470,7 @@ para exportar en formato step (S)et axis - + (S)Asignar eje @@ -1992,7 +2478,7 @@ para exportar en formato step Create pipe route - + Crear trayectoria de tuberia @@ -2017,12 +2503,12 @@ para exportar en formato step Normal to sketch: - + Normal al croquis Offset (mm): - + Desfasar (mm): diff --git a/uForms.py b/uForms.py index 33ffd20..6214044 100644 --- a/uForms.py +++ b/uForms.py @@ -1,176 +1,225 @@ -#(c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD -__title__="query dialog" -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" +__title__ = "query dialog" +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" from PySide import QtGui, QtCore -import FreeCAD,FreeCADGui +import FreeCAD, FreeCADGui from DraftGui import translate - + # UI Class definitions - -class QueryForm(QtGui.QDialog): #QWidget): - "form for qCmd.py" - def __init__(self,Selection): - super(QueryForm,self).__init__() - self.initUI() - self.Selection=Selection - def initUI(self): - self.setWindowTitle("QueryTool") - self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) - self.setMouseTracking(True) - #1st row - self.labName = QtGui.QLabel(translate("uForms", "(seleziona un oggetto)", self)) - #2nd row - self.labBaseVal = QtGui.QLabel(translate("uForms", "(base)", self)) - self.subFLayout1=QtGui.QFormLayout() - self.subFLayout1.addRow(translate("uForms", "Base: ", self.labBaseVal)) - #3rd row - self.labRotAng = QtGui.QLabel(translate("uForms", "(angle)", self)) - self.subFLayout2=QtGui.QFormLayout() - self.subFLayout2.addRow(translate("uForms", "Rotation angle: ", self.labRotAng)) - # 4th row - self.labRotAx = QtGui.QLabel(translate("uForms", "v = (x,y,z)", self)) - self.subFLayout3=QtGui.QFormLayout() - self.subFLayout3.addRow(translate("uForms", "Rotation axis: ", self.labRotAx)) - # 5th row - self.labSubObj = QtGui.QLabel(translate("uForms", "(Sub object property)", self)) - # 6th row - self.labBeam = QtGui.QLabel(translate("uForms", "(Beam property)", self)) - # 7th row - self.labProfile = QtGui.QLabel(translate("uForms", "(Profile property)", self)) - # 8th row - self.pushButton1 = QtGui.QPushButton(translate("uForms", "QueryObject")) - self.pushButton1.setDefault(True) - self.pushButton1.clicked.connect(self.onPushButton1) - self.pushButton1.setMinimumWidth(90) - self.cancelButton = QtGui.QPushButton(translate("uForms", "Exit")) - self.cancelButton.clicked.connect(self.onCancel) - self.subHLayout1=QtGui.QHBoxLayout() - self.subHLayout1.addWidget(self.pushButton1) - self.subHLayout1.addWidget(self.cancelButton) - # arrange the layout - self.mainVLayout=QtGui.QVBoxLayout() - self.mainVLayout.addWidget(self.labName) - self.mainVLayout.addLayout(self.subFLayout1) - self.mainVLayout.addLayout(self.subFLayout2) - self.mainVLayout.addLayout(self.subFLayout3) - self.mainVLayout.addWidget(self.labSubObj) - self.mainVLayout.addWidget(self.labBeam) - self.mainVLayout.addWidget(self.labProfile) - self.mainVLayout.addLayout(self.subHLayout1) - QtGui.QWidget.setLayout(self,self.mainVLayout) - # now make the window visible - self.show() - - def onPushButton1(self): - from math import pi, degrees - import fCmd - try: - obj=self.Selection.getSelection()[0] - self.labName.setText(obj.Label) - self.labBaseVal.setText(str("P = %.1f,%.1f,%.1f"%tuple(obj.Placement.Base))) - self.labRotAng.setText(str("%.2f " %(degrees(obj.Placement.Rotation.Angle)))) - ax=obj.Placement.Rotation.Axis - self.labRotAx.setText(str("v = (%(x).2f,%(y).2f,%(z).2f)" %{'x':ax.x,'y':ax.y,'z':ax.z})) - shapes=[y for x in self.Selection.getSelectionEx() for y in x.SubObjects if hasattr(y,'ShapeType')] - if len(shapes)==1: - sub=shapes[0] - if sub.ShapeType=='Edge': - if sub.curvatureAt(0)==0: - self.labSubObj.setText(sub.ShapeType+':\tL = %.1f mm' %sub.Length) - else: - x,y,z=sub.centerOfCurvatureAt(0) - d=2/sub.curvatureAt(0) - self.labSubObj.setText(sub.ShapeType+':\tD = %.1f mm\n\tC = %.1f,%.1f,%.1f' %(d,x,y,z)) - elif sub.ShapeType=='Face': - self.labSubObj.setText(sub.ShapeType+':\tA = %.1f mm2' %sub.Area) - elif sub.ShapeType=='Vertex': - self.labSubObj.setText(sub.ShapeType+': pos = (%(x).1f,%(y).1f,%(z).1f)' %{'x':sub.X,'y':sub.Y,'z':sub.Z}) - elif len(shapes)>1: - self.labSubObj.setText(shapes[0].ShapeType+' to '+shapes[1].ShapeType+': distance = %.1f mm' %(shapes[0].distToShape(shapes[1])[0])) - else: - self.labSubObj.setText(' ') - if len(fCmd.beams())==1: - b=fCmd.beams()[0] - self.labBeam.setText(b.Label+":\tL=%.2f"%(b.Height)) - self.labProfile.setText("Profile: "+b.Profile) - elif len(fCmd.beams())>1: - b1,b2=fCmd.beams()[:2] - self.labBeam.setText(b1.Label+"^"+b2.Label+": %.2f"%(degrees(fCmd.beamAx(b1).getAngle(fCmd.beamAx(b2))))) - self.labProfile.setText("") - else: - self.labBeam.setText("") - self.labProfile.setText("") - except: - pass - - def onCancel(self): - self.close() + + +class QueryForm(QtGui.QDialog): # QWidget): + "form for qCmd.py" + + def __init__(self, Selection): + super(QueryForm, self).__init__() + self.initUI() + self.Selection = Selection + + def initUI(self): + self.setWindowTitle(translate("uForms", "QueryTool")) + self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) + self.setMouseTracking(True) + # 1st row + self.labName = QtGui.QLabel(translate("uForms", "(Select a object)"), self) + # 2nd row + self.labBaseVal = QtGui.QLabel(translate("uForms", "(base)"), self) + self.subFLayout1 = QtGui.QFormLayout() + self.subFLayout1.addRow(translate("uForms", "Base: "), self.labBaseVal) + # 3rd row + self.labRotAng = QtGui.QLabel(translate("uForms", "(angle)"), self) + self.subFLayout2 = QtGui.QFormLayout() + self.subFLayout2.addRow(translate("uForms", "Rotation angle: "), self.labRotAng) + # 4th row + self.labRotAx = QtGui.QLabel(translate("uForms", "v = (x,y,z)"), self) + self.subFLayout3 = QtGui.QFormLayout() + self.subFLayout3.addRow(translate("uForms", "Rotation axis: "), self.labRotAx) + # 5th row + self.labSubObj = QtGui.QLabel( + translate("uForms", "(Sub object property)"), self + ) + # 6th row + self.labBeam = QtGui.QLabel(translate("uForms", "(Beam property)"), self) + # 7th row + self.labProfile = QtGui.QLabel(translate("uForms", "(Profile property)"), self) + # 8th row + self.pushButton1 = QtGui.QPushButton(translate("uForms", "QueryObject")) + self.pushButton1.setDefault(True) + self.pushButton1.clicked.connect(self.onPushButton1) + self.pushButton1.setMinimumWidth(90) + self.cancelButton = QtGui.QPushButton(translate("uForms", "Exit")) + self.cancelButton.clicked.connect(self.onCancel) + self.subHLayout1 = QtGui.QHBoxLayout() + self.subHLayout1.addWidget(self.pushButton1) + self.subHLayout1.addWidget(self.cancelButton) + # arrange the layout + self.mainVLayout = QtGui.QVBoxLayout() + self.mainVLayout.addWidget(self.labName) + self.mainVLayout.addLayout(self.subFLayout1) + self.mainVLayout.addLayout(self.subFLayout2) + self.mainVLayout.addLayout(self.subFLayout3) + self.mainVLayout.addWidget(self.labSubObj) + self.mainVLayout.addWidget(self.labBeam) + self.mainVLayout.addWidget(self.labProfile) + self.mainVLayout.addLayout(self.subHLayout1) + QtGui.QWidget.setLayout(self, self.mainVLayout) + # now make the window visible + self.show() + + def onPushButton1(self): + from math import pi, degrees + import fCmd + + try: + obj = self.Selection.getSelection()[0] + self.labName.setText(obj.Label) + self.labBaseVal.setText( + str("P = %.1f,%.1f,%.1f" % tuple(obj.Placement.Base)) + ) + self.labRotAng.setText( + str("%.2f " % (degrees(obj.Placement.Rotation.Angle))) + ) + ax = obj.Placement.Rotation.Axis + self.labRotAx.setText( + str("v = (%(x).2f,%(y).2f,%(z).2f)" % {"x": ax.x, "y": ax.y, "z": ax.z}) + ) + shapes = [ + y + for x in self.Selection.getSelectionEx() + for y in x.SubObjects + if hasattr(y, "ShapeType") + ] + if len(shapes) == 1: + sub = shapes[0] + if sub.ShapeType == "Edge": + if sub.curvatureAt(0) == 0: + self.labSubObj.setText( + sub.ShapeType + ":\tL = %.1f mm" % sub.Length + ) + else: + x, y, z = sub.centerOfCurvatureAt(0) + d = 2 / sub.curvatureAt(0) + self.labSubObj.setText( + sub.ShapeType + + ":\tD = %.1f mm\n\tC = %.1f,%.1f,%.1f" % (d, x, y, z) + ) + elif sub.ShapeType == "Face": + self.labSubObj.setText(sub.ShapeType + ":\tA = %.1f mm2" % sub.Area) + elif sub.ShapeType == "Vertex": + self.labSubObj.setText( + sub.ShapeType + + ": pos = (%(x).1f,%(y).1f,%(z).1f)" + % {"x": sub.X, "y": sub.Y, "z": sub.Z} + ) + elif len(shapes) > 1: + self.labSubObj.setText( + shapes[0].ShapeType + + " to " + + shapes[1].ShapeType + + ": distance = %.1f mm" % (shapes[0].distToShape(shapes[1])[0]) + ) + else: + self.labSubObj.setText(" ") + if len(fCmd.beams()) == 1: + b = fCmd.beams()[0] + self.labBeam.setText(b.Label + ":\tL=%.2f" % (b.Height)) + self.labProfile.setText("Profile: " + b.Profile) + elif len(fCmd.beams()) > 1: + b1, b2 = fCmd.beams()[:2] + self.labBeam.setText( + b1.Label + + "^" + + b2.Label + + ": %.2f" % (degrees(fCmd.beamAx(b1).getAngle(fCmd.beamAx(b2)))) + ) + self.labProfile.setText("") + else: + self.labBeam.setText("") + self.labProfile.setText("") + except: + pass + + def onCancel(self): + self.close() + from PySide.QtCore import * from PySide.QtGui import * from os import listdir from os.path import join, dirname, abspath -class rotWPForm(QDialog): #QWidget): - ''' - Dialog to rotate the working plane about its axis. - ''' - def __init__(self,winTitle=translate("uForms", "Rotate WP"), icon="rotWP.svg"): - super(rotWPForm,self).__init__() - self.move(QPoint(100,250)) - self.setWindowFlags(Qt.WindowStaysOnTopHint) - self.setWindowTitle(winTitle) - iconPath=join(dirname(abspath(__file__)),"iconz",icon) - from PySide.QtGui import QIcon - Icon=QIcon() - Icon.addFile(iconPath) - self.setWindowIcon(Icon) - self.grid=QGridLayout() - self.setLayout(self.grid) - self.radioX=QRadioButton('X') - self.radioX.setChecked(True) - self.radioY=QRadioButton('Y') - self.radioZ=QRadioButton('Z') - self.lab1=QLabel(translate("uForms", "Angle:")) - self.edit1=QLineEdit('45') - self.edit1.setAlignment(Qt.AlignCenter) - self.edit1.setValidator(QDoubleValidator()) - self.btn1=QPushButton('Rotate working plane') - self.btn1.clicked.connect(self.rotate) - self.grid.addWidget(self.radioX,0,0,1,1,Qt.AlignCenter) - self.grid.addWidget(self.radioY,0,1,1,1,Qt.AlignCenter) - self.grid.addWidget(self.radioZ,0,2,1,1,Qt.AlignCenter) - self.grid.addWidget(self.lab1,1,0,1,1) - self.grid.addWidget(self.edit1,1,1,1,2) - self.grid.addWidget(self.btn1,2,0,1,3,Qt.AlignCenter) - self.show() - self.sg=FreeCADGui.ActiveDocument.ActiveView.getSceneGraph() - s=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") - sc=[float(x*s) for x in [1,1,.2]] - from uCmd import arrow - self.arrow =arrow(FreeCAD.DraftWorkingPlane.getPlacement(),scale=sc,offset=s) - def rotate(self): - if self.radioX.isChecked(): - ax=FreeCAD.Vector(1,0,0) - elif self.radioY.isChecked(): - ax=FreeCAD.Vector(0,1,0) - else: - ax=FreeCAD.Vector(0,0,1) - ang=float(self.edit1.text()) - import uCmd as puc - newpl=puc.rotWP(ax,ang) - self.arrow.moveto(newpl) - def closeEvent(self,event): - self.sg.removeChild(self.arrow.node) - def reject(self): - self.sg.removeChild(self.arrow.node) - self.close() - def accept(self): - self.rotate() + +class rotWPForm(QDialog): # QWidget): + """ + Dialog to rotate the working plane about its axis. + """ + + def __init__(self, winTitle=translate("uForms", "Rotate WP"), icon="rotWP.svg"): + super(rotWPForm, self).__init__() + self.move(QPoint(100, 250)) + self.setWindowFlags(Qt.WindowStaysOnTopHint) + self.setWindowTitle(winTitle) + iconPath = join(dirname(abspath(__file__)), "iconz", icon) + from PySide.QtGui import QIcon + + Icon = QIcon() + Icon.addFile(iconPath) + self.setWindowIcon(Icon) + self.grid = QGridLayout() + self.setLayout(self.grid) + self.radioX = QRadioButton("X") + self.radioX.setChecked(True) + self.radioY = QRadioButton("Y") + self.radioZ = QRadioButton("Z") + self.lab1 = QLabel(translate("rotWPForm", "Angle:")) + self.edit1 = QLineEdit("45") + self.edit1.setAlignment(Qt.AlignCenter) + self.edit1.setValidator(QDoubleValidator()) + self.btn1 = QPushButton(translate("rotWPForm", "Rotate working plane")) + self.btn1.clicked.connect(self.rotate) + self.grid.addWidget(self.radioX, 0, 0, 1, 1, Qt.AlignCenter) + self.grid.addWidget(self.radioY, 0, 1, 1, 1, Qt.AlignCenter) + self.grid.addWidget(self.radioZ, 0, 2, 1, 1, Qt.AlignCenter) + self.grid.addWidget(self.lab1, 1, 0, 1, 1) + self.grid.addWidget(self.edit1, 1, 1, 1, 2) + self.grid.addWidget(self.btn1, 2, 0, 1, 3, Qt.AlignCenter) + self.show() + self.sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph() + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt( + "gridSize" + ) + sc = [float(x * s) for x in [1, 1, 0.2]] + from uCmd import arrow + + self.arrow = arrow(FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s) + + def rotate(self): + if self.radioX.isChecked(): + ax = FreeCAD.Vector(1, 0, 0) + elif self.radioY.isChecked(): + ax = FreeCAD.Vector(0, 1, 0) + else: + ax = FreeCAD.Vector(0, 0, 1) + ang = float(self.edit1.text()) + import uCmd as puc + + newpl = puc.rotWP(ax, ang) + self.arrow.moveto(newpl) + + def closeEvent(self, event): + self.sg.removeChild(self.arrow.node) + + def reject(self): + self.sg.removeChild(self.arrow.node) + self.close() + + def accept(self): + self.rotate() + # DP_calc @@ -179,172 +228,236 @@ def accept(self): from PySide.QtGui import * from math import pi, log, radians, sin, sqrt, atan, degrees + class dpCalcDialog: - def __init__(self): - dialogPath=join(dirname(abspath(__file__)),"dialogz","dp.ui") - self.form=FreeCADGui.PySideUic.loadUi(dialogPath) - self.form.editDensity.textChanged.connect(self.setRho) - self.form.editViscosity.textChanged.connect(self.setMu) - self.form.editFlow.setValidator(QDoubleValidator()) - self.form.editRough.setValidator(QDoubleValidator()) - self.form.editPressure.setValidator(QDoubleValidator()) - self.form.editTemperature.setValidator(QDoubleValidator()) - self.form.editDensity.setValidator(QDoubleValidator()) - self.form.editViscosity.setValidator(QDoubleValidator()) - self.form.radioLiquid.released.connect(self.setLiquid) - self.form.radioGas.released.connect(self.setGas) - self.form.butExport.clicked.connect(self.export) - self.form.comboWhat.currentIndexChanged.connect(lambda: self.form.labResult.setText('---')) - f=open(join(dirname(abspath(__file__)),"tablez","roughness.csv"),'r') - reader=csv.DictReader(f,delimiter=';') - self.materials=[m for m in reader] - f.close() - self.form.comboMat.currentIndexChanged.connect(self.changeMat) - for row in self.materials: - self.form.comboMat.addItem(row['Material']) - self.isLiquid=True - self.form.radioLiquid.setEnabled(False) - self.form.radioGas.setEnabled(False) - self.form.editPressure.setEnabled(False) - self.form.editTemperature.setEnabled(False) - self.form.editDensity.setEnabled(True) - self.form.editViscosity.setEnabled(True) - self.form.editDensity.setText('1000') - self.form.editViscosity.setText('1') - self.form.labName.setText('*** CUSTOM FLUID ***') - self.form.comboFluid.addItems(['']) - self .form.comboWhat.addItems([o.Label for o in FreeCAD.ActiveDocument.Objects if hasattr(o,'PType') and (o.PType=='PypeBranch' or o.PType=='PypeLine')]) - self.checkFluid() - def changeMat(self): - for m in self.materials: - if m['Material']==self.form.comboMat.currentText(): - self.form.editRough.setText(m['e_abs']) - def accept(self): - Dp=Ltot=nc=0 - elements=list() - Q=float(self.form.editFlow.text())/3600 - if not self.isLiquid: - Q=Q/self.Rho - if self.form.comboWhat.currentText()=='': - elements = FreeCADGui.Selection.getSelection() - else: - o=FreeCAD.ActiveDocument.getObjectsByLabel(self.form.comboWhat.currentText())[0] - if hasattr(o,'PType') and o.PType=='PypeBranch': - elements=[FreeCAD.ActiveDocument.getObject(name) for name in o.Tubes+o.Curves] - elif hasattr(o,'PType') and o.PType=='PypeLine': - group=FreeCAD.ActiveDocument.getObjectsByLabel(o.Label+'_pieces')[0] - elements=group.OutList - self.form.editResults.clear() - for o in elements: - loss=0 - if hasattr(o,'PType') and o.PType in ['Pipe','Elbow','Reduct']: - if o.PType in ['Pipe','Elbow']: - ID=float(o.ID)/1000 + def __init__(self): + dialogPath = join(dirname(abspath(__file__)), "dialogz", "dp.ui") + self.form = FreeCADGui.PySideUic.loadUi(dialogPath) + self.form.editDensity.textChanged.connect(self.setRho) + self.form.editViscosity.textChanged.connect(self.setMu) + self.form.editFlow.setValidator(QDoubleValidator()) + self.form.editRough.setValidator(QDoubleValidator()) + self.form.editPressure.setValidator(QDoubleValidator()) + self.form.editTemperature.setValidator(QDoubleValidator()) + self.form.editDensity.setValidator(QDoubleValidator()) + self.form.editViscosity.setValidator(QDoubleValidator()) + self.form.radioLiquid.released.connect(self.setLiquid) + self.form.radioGas.released.connect(self.setGas) + self.form.butExport.clicked.connect(self.export) + self.form.comboWhat.currentIndexChanged.connect( + lambda: self.form.labResult.setText("---") + ) + f = open(join(dirname(abspath(__file__)), "tablez", "roughness.csv"), "r") + reader = csv.DictReader(f, delimiter=";") + self.materials = [m for m in reader] + f.close() + self.form.comboMat.currentIndexChanged.connect(self.changeMat) + for row in self.materials: + self.form.comboMat.addItem(row["Material"]) + self.isLiquid = True + self.form.radioLiquid.setEnabled(False) + self.form.radioGas.setEnabled(False) + self.form.editPressure.setEnabled(False) + self.form.editTemperature.setEnabled(False) + self.form.editDensity.setEnabled(True) + self.form.editViscosity.setEnabled(True) + self.form.editDensity.setText("1000") + self.form.editViscosity.setText("1") + self.form.labName.setText("*** CUSTOM FLUID ***") + self.form.comboFluid.addItems([""]) + self.form.comboWhat.addItems( + [ + o.Label + for o in FreeCAD.ActiveDocument.Objects + if hasattr(o, "PType") + and (o.PType == "PypeBranch" or o.PType == "PypeLine") + ] + ) + self.checkFluid() + + def changeMat(self): + for m in self.materials: + if m["Material"] == self.form.comboMat.currentText(): + self.form.editRough.setText(m["e_abs"]) + + def accept(self): + Dp = Ltot = nc = 0 + elements = list() + Q = float(self.form.editFlow.text()) / 3600 + if not self.isLiquid: + Q = Q / self.Rho + if self.form.comboWhat.currentText() == "": + elements = FreeCADGui.Selection.getSelection() else: - ID=float(o.OD-2*o.thk)/1000 - e=float(self.form.editRough.text())*1e-6/ID - v=Q/((ID)**2*pi/4) - Re=v*ID*self.Rho/self.Mu - if Re<=2300: f=64/Re - else: f=(-1.8*log((e/3.7)**1.11+6.9/Re,10))**-2 - if o.PType=='Pipe': - L=float(o.Height)/1000 - Ltot+=L - loss=v**2/2*self.Rho*f*L/ID - self.form.editResults.append('%s\t%.1f mm\t%.1f m/s\t%.5f bar'%(o.Label,ID*1000,v,loss/1e5)) - elif o.PType=='Elbow': - ang=float(o.BendAngle) - R=float(o.BendRadius)/1000 - nc+=1 - ang=radians(ang) - K=f*ang*R/ID+(0.10+2.4*f)*sin(ang/2)+(6.6*f*(sqrt(sin(ang/2))+sin(ang/2)))/((R/ID)**(4*ang/pi)) # Rennels - loss=self.Rho*K*v**2/2 - self.form.editResults.append('%s\t%.1f mm\t%.1f m/s\t%.5f bar'%(o.Label,ID*1000,v,loss/1e5)) - elif o.PType=='Reduct': - ID1=float(o.OD-o.thk*2) - ID2=float(o.OD2-o.thk2*2) - teta=2*atan((ID1-ID2)/2.0/float(o.Height)) - beta=ID2/ID1 - if teta0: - if self.isLiquid: - loss=(Q*3600/o.Kv)**2*100000*self.Rho/1000 - elif self.form.comboFluid.currentText()=='water' and not self.isLiquid: - pass # TODO: formula for steam + o = FreeCAD.ActiveDocument.getObjectsByLabel( + self.form.comboWhat.currentText() + )[0] + if hasattr(o, "PType") and o.PType == "PypeBranch": + elements = [ + FreeCAD.ActiveDocument.getObject(name) + for name in o.Tubes + o.Curves + ] + elif hasattr(o, "PType") and o.PType == "PypeLine": + group = FreeCAD.ActiveDocument.getObjectsByLabel(o.Label + "_pieces")[0] + elements = group.OutList + self.form.editResults.clear() + for o in elements: + loss = 0 + if hasattr(o, "PType") and o.PType in ["Pipe", "Elbow", "Reduct"]: + if o.PType in ["Pipe", "Elbow"]: + ID = float(o.ID) / 1000 + else: + ID = float(o.OD - 2 * o.thk) / 1000 + e = float(self.form.editRough.text()) * 1e-6 / ID + v = Q / ((ID) ** 2 * pi / 4) + Re = v * ID * self.Rho / self.Mu + if Re <= 2300: + f = 64 / Re + else: + f = (-1.8 * log((e / 3.7) ** 1.11 + 6.9 / Re, 10)) ** -2 + if o.PType == "Pipe": + L = float(o.Height) / 1000 + Ltot += L + loss = v**2 / 2 * self.Rho * f * L / ID + self.form.editResults.append( + "%s\t%.1f mm\t%.1f m/s\t%.5f bar" + % (o.Label, ID * 1000, v, loss / 1e5) + ) + elif o.PType == "Elbow": + ang = float(o.BendAngle) + R = float(o.BendRadius) / 1000 + nc += 1 + ang = radians(ang) + K = ( + f * ang * R / ID + + (0.10 + 2.4 * f) * sin(ang / 2) + + (6.6 * f * (sqrt(sin(ang / 2)) + sin(ang / 2))) + / ((R / ID) ** (4 * ang / pi)) + ) # Rennels + loss = self.Rho * K * v**2 / 2 + self.form.editResults.append( + "%s\t%.1f mm\t%.1f m/s\t%.5f bar" + % (o.Label, ID * 1000, v, loss / 1e5) + ) + elif o.PType == "Reduct": + ID1 = float(o.OD - o.thk * 2) + ID2 = float(o.OD2 - o.thk2 * 2) + teta = 2 * atan((ID1 - ID2) / 2.0 / float(o.Height)) + beta = ID2 / ID1 + if teta < pi / 4: + K = 0.8 * sin(teta / 2) * (1 - beta**2) + else: + K = 0.5 * sqrt(sin(teta / 2)) * (1 - beta**2) + loss = self.Rho * K * v**2 / 2 + self.form.editResults.append( + "%s\t%.1f mm\t%.1f m/s\t%.5f bar" + % (o.Label, ID * 1000, v, loss / 1e5) + ) + elif hasattr(o, "Kv") and o.Kv > 0: + if self.isLiquid: + loss = (Q * 3600 / o.Kv) ** 2 * 100000 * self.Rho / 1000 + elif ( + self.form.comboFluid.currentText() == translate("water") + and not self.isLiquid + ): + pass # TODO: formula for steam + else: + pass # TODO: formula for gases + if hasattr(o, "ID"): + ID = float(o.ID) / 1000 + v = Q / (ID**2 * pi / 4) + else: + v = 0 + ID = 0 + self.form.editResults.append( + "%s\t%.1f mm\t%.1f m/s\t%.5f bar" + % (o.Label, ID * 1000, v, loss / 1e5) + ) + Dp += loss + if Dp > 200: + result = " = %.3f bar" % (Dp / 100000) else: - pass # TODO: formula for gases - if hasattr(o,'ID'): - ID = float(o.ID)/1000 - v=Q/(ID**2*pi/4) - else: - v = 0 - ID = 0 - self.form.editResults.append('%s\t%.1f mm\t%.1f m/s\t%.5f bar'%(o.Label,ID*1000,v,loss/1e5)) - Dp+=loss - if Dp>200: result=' = %.3f bar'%(Dp/100000) - else: result=' = %.2e bar'%(Dp/100000) - self.form.labResult.setText(result) - self.form.labLength.setText('Total length = %.3f m' %Ltot) - self.form.labCurves.setText('Nr. of curves = %i' %nc) - def checkFluid(self): - T=float(self.form.editTemperature.text())+273.16 - P=float(self.form.editPressure.text())*1e5 - self.isMixture=True - self.fluid=None - self.form.labName.setText('*** CUSTOM FLUID ***') - self.form.editDensity.setEnabled(True) - self.form.editViscosity.setEnabled(True) - self.form.labResult.setText('---') - def setLiquid(self): - if self.fluid: - try: - self.Rho=self.fluid.rhol - self.Mu=self.fluid.mul - self.form.editDensity.setText('%.4f' %self.Rho) - self.form.editViscosity.setText('%.4f' %(self.Mu*1000000/self.Rho)) #conversion between kinematic and dynamic!! - except: - QMessageBox.warning(None,'No data found','It seems the fluid has not\na liquid state.') - self.form.radioGas.setChecked(True) - return - self.isLiquid=True - self.form.labState.setText('*** LIQUID ***') - self.form.labQ.setText('Flow (m3/h)') - self.form.labResult.setText('---') - def setGas(self): - if self.fluid: - try: - self.Rho=self.fluid.rhog - self.Mu=self.fluid.mug - self.form.editDensity.setText('%.4f' %self.Rho) - self.form.editViscosity.setText('%.4f' %(self.Mu*1000000/self.Rho)) #conversion between kinematic and dynamic!! - except: - QMessageBox.warning(None,'No data found','It seems the fluid has not\na gas state.') - self.form.radioLiquid.setChecked(True) - return - self.isLiquid=False - self.form.labState.setText('*** GAS/VAPOUR ***') - self.form.labQ.setText('Flow (kg/h)') - self.form.labResult.setText('---') - def setRho(self): - self.Rho=float(self.form.editDensity.text()) - def setMu(self): - self.Mu=float(self.form.editViscosity.text())*self.Rho/1000000 # conversion between kinematic and dynamic!! - def export(self): - rows=list() - fields=['Item','ID (mm)','v (m/s)','Dp (bar)'] - for row in self.form.editResults.toPlainText().split('\n'): - record=[cell.rstrip(' mm bar m/s') for cell in row.split('\t')] - rows.append(dict(zip(fields,record))) - f=QFileDialog.getSaveFileName()[0] - if f: - dpFile=open(abspath(f),'w') - w=csv.DictWriter(dpFile,fields,restval='-',delimiter=';') - w.writeheader() - w.writerows(rows) - dpFile.close() + result = " = %.2e bar" % (Dp / 100000) + self.form.labResult.setText(result) + self.form.labLength.setText("Total length = %.3f m" % Ltot) + self.form.labCurves.setText("Nr. of curves = %i" % nc) + + def checkFluid(self): + T = float(self.form.editTemperature.text()) + 273.16 + P = float(self.form.editPressure.text()) * 1e5 + self.isMixture = True + self.fluid = None + self.form.labName.setText("*** CUSTOM FLUID ***") + self.form.editDensity.setEnabled(True) + self.form.editViscosity.setEnabled(True) + self.form.labResult.setText("---") + + def setLiquid(self): + if self.fluid: + try: + self.Rho = self.fluid.rhol + self.Mu = self.fluid.mul + self.form.editDensity.setText("%.4f" % self.Rho) + self.form.editViscosity.setText( + "%.4f" % (self.Mu * 1000000 / self.Rho) + ) # conversion between kinematic and dynamic!! + except: + QMessageBox.warning( + None, + translate("dpCalcDialog", "No data found"), + translate( + "dpCalcDialog", "It seems the fluid has not\na liquid state." + ), + ) + self.form.radioGas.setChecked(True) + return + self.isLiquid = True + self.form.labState.setText(translate("dpCalcDialog", "*** LIQUID ***")) + self.form.labQ.setText(translate("dpCalcDialog", "Flow (m3/h)")) + self.form.labResult.setText("---") + + def setGas(self): + if self.fluid: + try: + self.Rho = self.fluid.rhog + self.Mu = self.fluid.mug + self.form.editDensity.setText("%.4f" % self.Rho) + self.form.editViscosity.setText( + "%.4f" % (self.Mu * 1000000 / self.Rho) + ) # conversion between kinematic and dynamic!! + except: + QMessageBox.warning( + None, + translate("dpCalcDialog", "No data found"), + translate( + "dpCalcDialog", "It seems the fluid has not\na gas state." + ), + ) + self.form.radioLiquid.setChecked(True) + return + self.isLiquid = False + self.form.labState.setText(translate("dpCalcDialog", "*** GAS/VAPOUR ***")) + self.form.labQ.setText(translate("dpCalcDialog", "Flow (kg/h)")) + self.form.labResult.setText("---") + + def setRho(self): + self.Rho = float(self.form.editDensity.text()) + + def setMu(self): + self.Mu = ( + float(self.form.editViscosity.text()) * self.Rho / 1000000 + ) # conversion between kinematic and dynamic!! + def export(self): + rows = list() + fields = ["Item", "ID (mm)", "v (m/s)", "Dp (bar)"] + for row in self.form.editResults.toPlainText().split("\n"): + record = [cell.rstrip(" mm bar m/s") for cell in row.split("\t")] + rows.append(dict(zip(fields, record))) + f = QFileDialog.getSaveFileName()[0] + if f: + dpFile = open(abspath(f), "w") + w = csv.DictWriter(dpFile, fields, restval="-", delimiter=";") + w.writeheader() + w.writerows(rows) + dpFile.close() From fc27b2018c4604ad35fe8189df3976f0eda3c400 Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 3 May 2020 22:12:50 -0500 Subject: [PATCH 022/135] rebase Minor addproperty translations --- pFeatures.py | 1841 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 1199 insertions(+), 642 deletions(-) diff --git a/pFeatures.py b/pFeatures.py index a117761..95ea243 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -1,11 +1,11 @@ -#(c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD -__title__="pypeTools objects" -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" -objs=['Pipe','Elbow','Reduct','Cap','Flange','Ubolt','Valve'] -metaObjs=['PypeLine','PypeBranch'] +__title__ = "pypeTools objects" +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" +objs = ["Pipe", "Elbow", "Reduct", "Cap", "Flange", "Ubolt", "Valve"] +metaObjs = ["PypeLine", "PypeBranch"] import FreeCAD, FreeCADGui, Part, fCmd, pCmd from copy import copy @@ -13,406 +13,756 @@ from PySide.QtCore import QT_TRANSLATE_NOOP from DraftGui import translate -vO=FreeCAD.Vector(0,0,0) -vX=FreeCAD.Vector(1,0,0) -vY=FreeCAD.Vector(0,1,0) -vZ=FreeCAD.Vector(0,0,1) +vO = FreeCAD.Vector(0, 0, 0) +vX = FreeCAD.Vector(1, 0, 0) +vY = FreeCAD.Vector(0, 1, 0) +vZ = FreeCAD.Vector(0, 0, 1) ################ CLASSES ########################### + class pypeType(object): - def __init__(self,obj): - obj.Proxy = self - obj.addProperty("App::PropertyString","PType","PBase",QT_TRANSLATE_NOOP("App::PropertyString","Type of tubeFeature")).PType - obj.addProperty("App::PropertyString","PRating","PBase",QT_TRANSLATE_NOOP("App::PropertyString","Rating of pipeFeature")).PRating - obj.addProperty("App::PropertyString","PSize","PBase",QT_TRANSLATE_NOOP("App::PropertyString","Nominal diameter")).PSize - obj.addProperty("App::PropertyVectorList","Ports","PBase",QT_TRANSLATE_NOOP("App::PropertyVectorList","Ports position relative to the origin of Shape")) - obj.addProperty("App::PropertyFloat","Kv","PBase",QT_TRANSLATE_NOOP("App::PropertyFloat","Flow factor (m3/h/bar)")).Kv - if int(FreeCAD.Version()[1])>19: - obj.addExtension("Part::AttachExtensionPython") - else: - obj.addExtension("Part::AttachExtensionPython",obj)#20220704 - self.Name=obj.Name - def execute(self, fp): - fp.positionBySupport() # to recomute placement according the Support - def nearestPort (self,point=None): - ''' - nearestPort (point=None) - Returns the Port nearest to point - or to the selected geometry. - (, , ) - ''' - obj=FreeCAD.ActiveDocument.getObject(self.Name) - if not point and FreeCADGui.ActiveDocument: - try: - selex=FreeCADGui.Selection.getSelectionEx() - target=selex[0].Object - so=selex[0].SubObjects[0] - except: - FreeCAD.Console.PrintError('No geometry selected\n') - return None - if type(so)==Part.Vertex: point=so.Point - else: point=so.CenterOfMass - if point: - pos=pCmd.portsPos(obj)[0]; Z=pCmd.portsDir(obj)[0] - i=nearest=0 - if len(obj.Ports)>1: - for p in pCmd.portsPos(obj)[1:] : - i+=1 - if (p-point).Length<(pos-point).Length: - pos=p - Z=pCmd.portsDir(obj)[i] - nearest=i - return nearest, pos, Z + def __init__(self, obj): + obj.Proxy = self + obj.addProperty( + "App::PropertyString", + "PType", + "PBase", + QT_TRANSLATE_NOOP("App::PropertyString", "Type of tubeFeature"), + ).PType + obj.addProperty( + "App::PropertyString", + "PRating", + "PBase", + QT_TRANSLATE_NOOP("App::PropertyString", "Rating of pipeFeature"), + ).PRating + obj.addProperty( + "App::PropertyString", + "PSize", + "PBase", + QT_TRANSLATE_NOOP("App::PropertyString", "Nominal diameter"), + ).PSize + obj.addProperty( + "App::PropertyVectorList", + "Ports", + "PBase", + QT_TRANSLATE_NOOP( + "App::PropertyVectorList", + "Ports position relative to the origin of Shape", + ), + ) + obj.addProperty( + "App::PropertyFloat", + "Kv", + "PBase", + QT_TRANSLATE_NOOP("App::PropertyFloat", "Flow factor (m3/h/bar)"), + ).Kv + if int(FreeCAD.Version()[1]) > 19: + obj.addExtension("Part::AttachExtensionPython") + else: + obj.addExtension("Part::AttachExtensionPython", obj) # 20220704 + self.Name = obj.Name + + def execute(self, fp): + fp.positionBySupport() # to recomute placement according the Support + + def nearestPort(self, point=None): + """ + nearestPort (point=None) + Returns the Port nearest to point + or to the selected geometry. + (, , ) + """ + obj = FreeCAD.ActiveDocument.getObject(self.Name) + if not point and FreeCADGui.ActiveDocument: + try: + selex = FreeCADGui.Selection.getSelectionEx() + target = selex[0].Object + so = selex[0].SubObjects[0] + except: + FreeCAD.Console.PrintError("No geometry selected\n") + return None + if type(so) == Part.Vertex: + point = so.Point + else: + point = so.CenterOfMass + if point: + pos = pCmd.portsPos(obj)[0] + Z = pCmd.portsDir(obj)[0] + i = nearest = 0 + if len(obj.Ports) > 1: + for p in pCmd.portsPos(obj)[1:]: + i += 1 + if (p - point).Length < (pos - point).Length: + pos = p + Z = pCmd.portsDir(obj)[i] + nearest = i + return nearest, pos, Z + class Pipe(pypeType): - '''Class for object PType="Pipe" - Pipe(obj,[PSize="DN50",OD=60.3,thk=3, H=100]) - obj: the "App::FeaturePython object" - PSize (string): nominal diameter - OD (float): outside diameter - thk (float): shell thickness - H (float): length of pipe''' - def __init__(self, obj,DN="DN50",OD=60.3,thk=3, H=100): - # initialize the parent class - super(Pipe,self).__init__(obj) - # define common properties - obj.PType="Pipe" - obj.PRating="SCH-STD" - obj.PSize=DN - # define specific properties - obj.addProperty("App::PropertyLength","OD","Pipe",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD - obj.addProperty("App::PropertyLength","thk","Pipe",QT_TRANSLATE_NOOP("App::Property","Wall thickness")).thk=thk - obj.addProperty("App::PropertyLength","ID","Pipe",QT_TRANSLATE_NOOP("App::Property","Inside diameter")).ID=obj.OD-2*obj.thk - obj.addProperty("App::PropertyLength","Height","Pipe",QT_TRANSLATE_NOOP("App::Property","Length of tube")).Height=H - obj.addProperty("App::PropertyString","Profile","Pipe",QT_TRANSLATE_NOOP("App::Property","Section dim.")).Profile=str(obj.OD)+"x"+str(obj.thk) - def onChanged(self, fp, prop): - if prop=='ID' and fp.IDfp.OD/2: - fp.thk=fp.OD/2 - fp.ID=fp.OD-2*fp.thk - fp.Profile=str(fp.OD)+"x"+str(fp.thk) - if fp.ID: - fp.Shape = Part.makeCylinder(fp.OD/2,fp.Height).cut(Part.makeCylinder(fp.ID/2,fp.Height)) - else: - fp.Shape = Part.makeCylinder(fp.OD/2,fp.Height) - fp.Ports=[FreeCAD.Vector(),FreeCAD.Vector(0,0,float(fp.Height))] - super(Pipe,self).execute(fp) # perform common operations + """Class for object PType="Pipe" + Pipe(obj,[PSize="DN50",OD=60.3,thk=3, H=100]) + obj: the "App::FeaturePython object" + PSize (string): nominal diameter + OD (float): outside diameter + thk (float): shell thickness + H (float): length of pipe""" + + def __init__(self, obj, DN="DN50", OD=60.3, thk=3, H=100): + # initialize the parent class + super(Pipe, self).__init__(obj) + # define common properties + obj.PType = "Pipe" + obj.PRating = "SCH-STD" + obj.PSize = DN + # define specific properties + obj.addProperty( + "App::PropertyLength", + "OD", + "Pipe", + QT_TRANSLATE_NOOP("App::Property", "Outside diameter"), + ).OD = OD + obj.addProperty( + "App::PropertyLength", + "thk", + "Pipe", + QT_TRANSLATE_NOOP("App::Property", "Wall thickness"), + ).thk = thk + obj.addProperty( + "App::PropertyLength", + "ID", + "Pipe", + QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), + ).ID = obj.OD - 2 * obj.thk + obj.addProperty( + "App::PropertyLength", + "Height", + "Pipe", + QT_TRANSLATE_NOOP("App::Property", "Length of tube"), + ).Height = H + obj.addProperty( + "App::PropertyString", + "Profile", + "Pipe", + QT_TRANSLATE_NOOP("App::Property", "Section dim."), + ).Profile = str(obj.OD) + "x" + str(obj.thk) + + def onChanged(self, fp, prop): + if prop == "ID" and fp.ID < fp.OD: + fp.thk = (fp.OD - fp.ID) / 2 + + def execute(self, fp): + if fp.thk > fp.OD / 2: + fp.thk = fp.OD / 2 + fp.ID = fp.OD - 2 * fp.thk + fp.Profile = str(fp.OD) + "x" + str(fp.thk) + if fp.ID: + fp.Shape = Part.makeCylinder(fp.OD / 2, fp.Height).cut( + Part.makeCylinder(fp.ID / 2, fp.Height) + ) + else: + fp.Shape = Part.makeCylinder(fp.OD / 2, fp.Height) + fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.Height))] + super(Pipe, self).execute(fp) # perform common operations + class Elbow(pypeType): - '''Class for object PType="Elbow" - Elbow(obj,[PSize="DN50",OD=60.3,thk=3,BA=90,BR=45.225]) - obj: the "App::FeaturePython" object - PSize (string): nominal diameter - OD (float): outside diameter - thk (float): shell thickness - BA (float): bend angle - BR (float): bend radius''' - def __init__(self, obj,DN="DN50",OD=60.3,thk=3,BA=90,BR=45.225): - # initialize the parent class - super(Elbow,self).__init__(obj) - # define common properties - obj.PType="Elbow" - obj.PRating="SCH-STD" - obj.PSize=DN - # define specific properties - obj.addProperty("App::PropertyLength","OD","Elbow",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD - obj.addProperty("App::PropertyLength","thk","Elbow",QT_TRANSLATE_NOOP("App::Property","Wall thickness")).thk=thk - obj.addProperty("App::PropertyLength","ID","Elbow",QT_TRANSLATE_NOOP("App::Property","Inside diameter")).ID=obj.OD-2*obj.thk - obj.addProperty("App::PropertyAngle","BendAngle","Elbow",QT_TRANSLATE_NOOP("App::Property","Bend Angle")).BendAngle=BA - obj.addProperty("App::PropertyLength","BendRadius","Elbow",QT_TRANSLATE_NOOP("App::Property","Bend Radius")).BendRadius=BR - obj.addProperty("App::PropertyString","Profile","Elbow",QT_TRANSLATE_NOOP("App::Property","Section dim.")).Profile=str(obj.OD)+"x"+str(obj.thk) - #obj.Ports=[FreeCAD.Vector(1,0,0),FreeCAD.Vector(0,1,0)] - self.execute(obj) - def onChanged(self, fp, prop): - if prop=='ID' and fp.IDfp.OD/2: - fp.thk=fp.OD/2 - fp.ID=fp.OD-2*fp.thk - fp.Profile=str(fp.OD)+"x"+str(fp.thk) - CenterOfBend=FreeCAD.Vector(fp.BendRadius,fp.BendRadius,0) - ## make center-line ## - R=Part.makeCircle(fp.BendRadius,CenterOfBend,FreeCAD.Vector(0,0,1),225-float(fp.BendAngle)/2,225+float(fp.BendAngle)/2) - ## move the cl so that Placement.Base is the center of elbow ## - from math import pi, cos, sqrt - d=(fp.BendRadius*sqrt(2)-fp.BendRadius/cos(fp.BendAngle/180*pi/2)) - P=FreeCAD.Vector(-d*cos(pi/4),-d*cos(pi/4),0) - R.translate(P) - ## calculate Ports position ## - fp.Ports=[R.valueAt(R.FirstParameter),R.valueAt(R.LastParameter)] - ## make the shape of the elbow ## - c=Part.makeCircle(fp.OD/2,fp.Ports[0],R.tangentAt(R.FirstParameter)*-1) - b=Part.makeSweepSurface(R,c) - p1=Part.Face(Part.Wire(c)) - p2=Part.Face(Part.Wire(Part.makeCircle(fp.OD/2,fp.Ports[1],R.tangentAt(R.LastParameter)))) - sol=Part.Solid(Part.Shell([b,p1,p2])) - planeFaces=[f for f in sol.Faces if type(f.Surface)==Part.Plane] - #elbow=sol.makeThickness(planeFaces,-fp.thk,1.e-3) - #fp.Shape = elbow - if fp.thk fp.OD / 2: + fp.thk = fp.OD / 2 + fp.ID = fp.OD - 2 * fp.thk + fp.Profile = str(fp.OD) + "x" + str(fp.thk) + CenterOfBend = FreeCAD.Vector(fp.BendRadius, fp.BendRadius, 0) + ## make center-line ## + R = Part.makeCircle( + fp.BendRadius, + CenterOfBend, + FreeCAD.Vector(0, 0, 1), + 225 - float(fp.BendAngle) / 2, + 225 + float(fp.BendAngle) / 2, + ) + ## move the cl so that Placement.Base is the center of elbow ## + from math import pi, cos, sqrt + + d = fp.BendRadius * sqrt(2) - fp.BendRadius / cos( + fp.BendAngle / 180 * pi / 2 + ) + P = FreeCAD.Vector(-d * cos(pi / 4), -d * cos(pi / 4), 0) + R.translate(P) + ## calculate Ports position ## + fp.Ports = [R.valueAt(R.FirstParameter), R.valueAt(R.LastParameter)] + ## make the shape of the elbow ## + c = Part.makeCircle( + fp.OD / 2, fp.Ports[0], R.tangentAt(R.FirstParameter) * -1 + ) + b = Part.makeSweepSurface(R, c) + p1 = Part.Face(Part.Wire(c)) + p2 = Part.Face( + Part.Wire( + Part.makeCircle( + fp.OD / 2, fp.Ports[1], R.tangentAt(R.LastParameter) + ) + ) + ) + sol = Part.Solid(Part.Shell([b, p1, p2])) + planeFaces = [f for f in sol.Faces if type(f.Surface) == Part.Plane] + # elbow=sol.makeThickness(planeFaces,-fp.thk,1.e-3) + # fp.Shape = elbow + if fp.thk < fp.OD / 2: + fp.Shape = sol.makeThickness(planeFaces, -fp.thk, 1.0e-3) + else: + fp.Shape = sol + super(Elbow, self).execute(fp) # perform common operations + class Flange(pypeType): - '''Class for object PType="Flange" - Flange(obj,[PSize="DN50",FlangeType="SO", D=160, d=60.3,df=132, f=14 t=15,n=4, trf=0, drf=0, twn=0, dwn=0, ODp=0]) - obj: the "App::FeaturePython" object - PSize (string): nominal diameter - FlangeType (string): type of Flange - D (float): flange diameter - d (float): bore diameter - df (float): bolts holes distance - f (float): bolts holes diameter - t (float): flange thickness - n (int): nr. of bolts - trf (float): raised-face thikness - OPTIONAL - - drf (float): raised-face diameter - OPTIONAL - - twn (float): welding-neck thikness - OPTIONAL - - dwn (float): welding-neck diameter - OPTIONAL - - ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - - ''' - def __init__(self, obj,DN="DN50",FlangeType="SO",D=160,d=60.3,df=132,f=14, t=15, n=4, trf=0, drf=0, twn=0, dwn=0, ODp=0): - # initialize the parent class - super(Flange,self).__init__(obj) - # define common properties - obj.PType="Flange" - obj.PRating="DIN-PN16" - obj.PSize=DN - # define specific properties - obj.addProperty("App::PropertyString","FlangeType","Flange",QT_TRANSLATE_NOOP("App::Property","Type of flange")).FlangeType=FlangeType - obj.addProperty("App::PropertyLength","D","Flange",QT_TRANSLATE_NOOP("App::Property","Flange diameter")).D=D - obj.addProperty("App::PropertyLength","d","Flange",QT_TRANSLATE_NOOP("App::Property","Bore diameter")).d=d - obj.addProperty("App::PropertyLength","df","Flange",QT_TRANSLATE_NOOP("App::Property","Bolts distance")).df=df - obj.addProperty("App::PropertyLength","f","Flange",QT_TRANSLATE_NOOP("App::Property","Bolts hole diameter")).f=f - obj.addProperty("App::PropertyLength","t","Flange",QT_TRANSLATE_NOOP("App::Property","Thickness of flange")).t=t - obj.addProperty("App::PropertyInteger","n","Flange",QT_TRANSLATE_NOOP("App::Property","Nr. of bolts")).n=n - obj.addProperty("App::PropertyLength","trf","Flange2",QT_TRANSLATE_NOOP("App::Property","Thickness of raised face")).trf=trf - obj.addProperty("App::PropertyLength","drf","Flange2",QT_TRANSLATE_NOOP("App::Property","Diameter of raised face")).drf=drf - obj.addProperty("App::PropertyLength","twn","Flange2",QT_TRANSLATE_NOOP("App::Property","Length of welding neck")).twn=twn - obj.addProperty("App::PropertyLength","dwn","Flange2",QT_TRANSLATE_NOOP("App::Property","Diameter of welding neck")).dwn=dwn - obj.addProperty("App::PropertyLength","ODp","Flange2",QT_TRANSLATE_NOOP("App::Property","Outside diameter of pipe")).ODp=ODp - def onChanged(self, fp, prop): - return None - def execute(self, fp): - base=Part.Face(Part.Wire(Part.makeCircle(fp.D/2))) - if fp.d>0: - base=base.cut(Part.Face(Part.Wire(Part.makeCircle(fp.d/2)))) - if fp.n>0: - hole=Part.Face(Part.Wire(Part.makeCircle(fp.f/2,FreeCAD.Vector(fp.df/2,0,0),FreeCAD.Vector(0,0,1)))) - hole.rotate(FreeCAD.Vector(0,0,0),FreeCAD.Vector(0,0,1),360.0/fp.n/2) - for i in list(range(fp.n)): - base=base.cut(hole) - hole.rotate(FreeCAD.Vector(0,0,0),FreeCAD.Vector(0,0,1),360.0/fp.n) - flange = base.extrude(FreeCAD.Vector(0,0,fp.t)) - try: # Flange2: raised-face and welding-neck - if fp.trf>0 and fp.drf>0: - rf=Part.makeCylinder(fp.drf/2,fp.trf,vO,vZ*-1).cut(Part.makeCylinder(fp.d/2,fp.trf,vO,vZ*-1)) - flange=flange.fuse(rf) - if fp.dwn>0 and fp.twn>0 and fp.ODp>0: - wn=Part.makeCone(fp.dwn/2,fp.ODp/2,fp.twn,vZ*float(fp.t)).cut(Part.makeCylinder(fp.d/2,fp.twn,vZ*float(fp.t))) - flange=flange.fuse(wn) - except: - pass - fp.Shape = flange - fp.Ports=[FreeCAD.Vector(),FreeCAD.Vector(0,0,float(fp.t))] - super(Flange,self).execute(fp) # perform common operations + """Class for object PType="Flange" + Flange(obj,[PSize="DN50",FlangeType="SO", D=160, d=60.3,df=132, f=14 t=15,n=4, trf=0, drf=0, twn=0, dwn=0, ODp=0]) + obj: the "App::FeaturePython" object + PSize (string): nominal diameter + FlangeType (string): type of Flange + D (float): flange diameter + d (float): bore diameter + df (float): bolts holes distance + f (float): bolts holes diameter + t (float): flange thickness + n (int): nr. of bolts + trf (float): raised-face thikness - OPTIONAL - + drf (float): raised-face diameter - OPTIONAL - + twn (float): welding-neck thikness - OPTIONAL - + dwn (float): welding-neck diameter - OPTIONAL - + ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - + """ + + def __init__( + self, + obj, + DN="DN50", + FlangeType="SO", + D=160, + d=60.3, + df=132, + f=14, + t=15, + n=4, + trf=0, + drf=0, + twn=0, + dwn=0, + ODp=0, + ): + # initialize the parent class + super(Flange, self).__init__(obj) + # define common properties + obj.PType = "Flange" + obj.PRating = "DIN-PN16" + obj.PSize = DN + # define specific properties + obj.addProperty( + "App::PropertyString", + "FlangeType", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Type of flange"), + ).FlangeType = FlangeType + obj.addProperty( + "App::PropertyLength", + "D", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Flange diameter"), + ).D = D + obj.addProperty( + "App::PropertyLength", + "d", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Bore diameter"), + ).d = d + obj.addProperty( + "App::PropertyLength", + "df", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Bolts distance"), + ).df = df + obj.addProperty( + "App::PropertyLength", + "f", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Bolts hole diameter"), + ).f = f + obj.addProperty( + "App::PropertyLength", + "t", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Thickness of flange"), + ).t = t + obj.addProperty( + "App::PropertyInteger", + "n", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Nr. of bolts"), + ).n = n + obj.addProperty( + "App::PropertyLength", + "trf", + "Flange2", + QT_TRANSLATE_NOOP("App::Property", "Thickness of raised face"), + ).trf = trf + obj.addProperty( + "App::PropertyLength", + "drf", + "Flange2", + QT_TRANSLATE_NOOP("App::Property", "Diameter of raised face"), + ).drf = drf + obj.addProperty( + "App::PropertyLength", + "twn", + "Flange2", + QT_TRANSLATE_NOOP("App::Property", "Length of welding neck"), + ).twn = twn + obj.addProperty( + "App::PropertyLength", + "dwn", + "Flange2", + QT_TRANSLATE_NOOP("App::Property", "Diameter of welding neck"), + ).dwn = dwn + obj.addProperty( + "App::PropertyLength", + "ODp", + "Flange2", + QT_TRANSLATE_NOOP("App::Property", "Outside diameter of pipe"), + ).ODp = ODp + + def onChanged(self, fp, prop): + return None + + def execute(self, fp): + base = Part.Face(Part.Wire(Part.makeCircle(fp.D / 2))) + if fp.d > 0: + base = base.cut(Part.Face(Part.Wire(Part.makeCircle(fp.d / 2)))) + if fp.n > 0: + hole = Part.Face( + Part.Wire( + Part.makeCircle( + fp.f / 2, + FreeCAD.Vector(fp.df / 2, 0, 0), + FreeCAD.Vector(0, 0, 1), + ) + ) + ) + hole.rotate( + FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n / 2 + ) + for i in list(range(fp.n)): + base = base.cut(hole) + hole.rotate( + FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n + ) + flange = base.extrude(FreeCAD.Vector(0, 0, fp.t)) + try: # Flange2: raised-face and welding-neck + if fp.trf > 0 and fp.drf > 0: + rf = Part.makeCylinder(fp.drf / 2, fp.trf, vO, vZ * -1).cut( + Part.makeCylinder(fp.d / 2, fp.trf, vO, vZ * -1) + ) + flange = flange.fuse(rf) + if fp.dwn > 0 and fp.twn > 0 and fp.ODp > 0: + wn = Part.makeCone( + fp.dwn / 2, fp.ODp / 2, fp.twn, vZ * float(fp.t) + ).cut(Part.makeCylinder(fp.d / 2, fp.twn, vZ * float(fp.t))) + flange = flange.fuse(wn) + except: + pass + fp.Shape = flange + fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.t))] + super(Flange, self).execute(fp) # perform common operations + class Reduct(pypeType): - '''Class for object PType="Reduct" - Reduct(obj,[PSize="DN50",OD=60.3, OD2= 48.3, thk=3, thk2=None, H=None, conc=True]) - obj: the "App::FeaturePython object" - PSize (string): nominal diameter (major) - OD (float): major outside diameter - OD2 (float): minor outside diameter - thk (float): major shell thickness - thk2 (float): minor shell thickness - H (float): length of reduction - conc (bool): True for a concentric reduction, False for eccentric - If thk2 is None or 0, the same thickness is used at both ends. - If H is None or 0, the length of the reduction is calculated as 3x(OD-OD2). - ''' - def __init__(self, obj,DN="DN50",OD=60.3,OD2=48.3,thk=3, thk2=None, H=None, conc=True): - # initialize the parent class - super(Reduct,self).__init__(obj) - # define common properties - obj.PType="Reduct" - obj.PRating="SCH-STD" - obj.PSize=DN - # define specific properties - obj.addProperty("App::PropertyLength","OD","Reduct",QT_TRANSLATE_NOOP("App::Property","Major diameter")).OD=OD - obj.addProperty("App::PropertyLength","OD2","Reduct",QT_TRANSLATE_NOOP("App::Property","Minor diameter")).OD2=OD2 - obj.addProperty("App::PropertyLength","thk","Reduct",QT_TRANSLATE_NOOP("App::Property","Wall thickness")).thk=thk - obj.addProperty("App::PropertyLength","thk2","Reduct",QT_TRANSLATE_NOOP("App::Property","Wall thickness")) - if not thk2: - obj.thk2=thk - else: - obj.thk2=thk2 - obj.addProperty("App::PropertyBool","calcH","Reduct",QT_TRANSLATE_NOOP("App::Property","Make the lenght variable")) - obj.addProperty("App::PropertyLength","Height","Reduction",QT_TRANSLATE_NOOP("App::Property","Length of reduction")) - if not H: - obj.calcH=True - obj.Height=3*(obj.OD-obj.OD2) - else: - obj.calcH=False - obj.Height=float(H) - obj.addProperty("App::PropertyString","Profile","Reduct",QT_TRANSLATE_NOOP("App::Property","Section dim.")).Profile=str(obj.OD)+"x"+str(obj.OD2) - obj.addProperty("App::PropertyBool","conc","Reduct",QT_TRANSLATE_NOOP("App::Property","Concentric or Eccentric")).conc=conc - def onChanged(self, fp, prop): - return None - def execute(self, fp): - if fp.OD>fp.OD2: - if fp.calcH or fp.Height==0: - fp.Height=3*(fp.OD-fp.OD2) - fp.Profile=str(fp.OD)+"x"+str(fp.OD2) - if fp.conc: - sol = Part.makeCone(fp.OD/2,fp.OD2/2,fp.Height) - if fp.thk fp.OD2: + if fp.calcH or fp.Height == 0: + fp.Height = 3 * (fp.OD - fp.OD2) + fp.Profile = str(fp.OD) + "x" + str(fp.OD2) + if fp.conc: + sol = Part.makeCone(fp.OD / 2, fp.OD2 / 2, fp.Height) + if fp.thk < fp.OD / 2 and fp.thk2 < fp.OD2 / 2: + fp.Shape = sol.cut( + Part.makeCone( + fp.OD / 2 - fp.thk, fp.OD2 / 2 - fp.thk2, fp.Height + ) + ) + else: + fp.Shape = sol + fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.Height))] + else: + C = Part.makeCircle( + fp.OD / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1) + ) + c = Part.makeCircle( + fp.OD2 / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1) + ) + c.translate(FreeCAD.Vector((fp.OD - fp.OD2) / 2, 0, fp.Height)) + sol = Part.makeLoft([c, C], True) + if fp.thk < fp.OD / 2 and fp.thk2 < fp.OD2 / 2: + C = Part.makeCircle( + fp.OD / 2 - fp.thk, + FreeCAD.Vector(0, 0, 0), + FreeCAD.Vector(0, 0, 1), + ) + c = Part.makeCircle( + fp.OD2 / 2 - fp.thk2, + FreeCAD.Vector(0, 0, 0), + FreeCAD.Vector(0, 0, 1), + ) + c.translate(FreeCAD.Vector((fp.OD - fp.OD2) / 2, 0, fp.Height)) + fp.Shape = sol.cut(Part.makeLoft([c, C], True)) + else: + fp.Shape = sol + fp.Ports = [ + FreeCAD.Vector(), + FreeCAD.Vector((fp.OD - fp.OD2) / 2, 0, float(fp.Height)), + ] + super(Reduct, self).execute(fp) # perform common operations + class Cap(pypeType): - '''Class for object PType="Cap" - Cap(obj,[PSize="DN50",OD=60.3,thk=3]) - obj: the "App::FeaturePython object" - PSize (string): nominal diameter - OD (float): outside diameter - thk (float): shell thickness''' - def __init__(self, obj,DN="DN50",OD=60.3,thk=3): - # initialize the parent class - super(Cap,self).__init__(obj) - # define common properties - obj.PType="Cap" - obj.PRating="SCH-STD" - obj.PSize=DN - # define specific properties - obj.addProperty("App::PropertyLength","OD","Cap",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD - obj.addProperty("App::PropertyLength","thk","Cap",QT_TRANSLATE_NOOP("App::Property","Wall thickness")).thk=thk - obj.addProperty("App::PropertyLength","ID","Cap",QT_TRANSLATE_NOOP("App::Property","Inside diameter")).ID=obj.OD-2*obj.thk - obj.addProperty("App::PropertyString","Profile","Cap",QT_TRANSLATE_NOOP("App::Property","Section dim.")).Profile=str(obj.OD)+"x"+str(obj.thk) - def onChanged(self, fp, prop): - return None - def execute(self, fp): - if fp.thk>fp.OD/2: - fp.thk=fp.OD/2.1 - fp.ID=fp.OD-2*fp.thk - fp.Profile=str(fp.OD)+"x"+str(fp.thk) - D=float(fp.OD) - s=float(fp.thk) - sfera=Part.makeSphere(0.8*D,FreeCAD.Vector(0,0,-(0.55*D-6*s))) - cilindro=Part.makeCylinder(D/2,D*1.7,FreeCAD.Vector(0,0,-(0.55*D-6*s+1)),FreeCAD.Vector(0,0,1)) - common=sfera.common(cilindro) - fil=common.makeFillet(D/6.5,common.Edges) - cut=fil.cut(Part.makeCylinder(D*1.1,D*2,FreeCAD.Vector(0,0,0),FreeCAD.Vector(0,0,-1))) - cap=cut.makeThickness([f for f in cut.Faces if type(f.Surface)==Part.Plane],-s,1.e-3) - fp.Shape = cap - fp.Ports=[FreeCAD.Vector()] - super(Cap,self).execute(fp) # perform common operations + """Class for object PType="Cap" + Cap(obj,[PSize="DN50",OD=60.3,thk=3]) + obj: the "App::FeaturePython object" + PSize (string): nominal diameter + OD (float): outside diameter + thk (float): shell thickness""" + + def __init__(self, obj, DN="DN50", OD=60.3, thk=3): + # initialize the parent class + super(Cap, self).__init__(obj) + # define common properties + obj.PType = "Cap" + obj.PRating = "SCH-STD" + obj.PSize = DN + # define specific properties + obj.addProperty( + "App::PropertyLength", + "OD", + "Cap", + QT_TRANSLATE_NOOP("App::Property", "Outside diameter"), + ).OD = OD + obj.addProperty( + "App::PropertyLength", + "thk", + "Cap", + QT_TRANSLATE_NOOP("App::Property", "Wall thickness"), + ).thk = thk + obj.addProperty( + "App::PropertyLength", + "ID", + "Cap", + QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), + ).ID = obj.OD - 2 * obj.thk + obj.addProperty( + "App::PropertyString", + "Profile", + "Cap", + QT_TRANSLATE_NOOP("App::Property", "Section dim."), + ).Profile = str(obj.OD) + "x" + str(obj.thk) + + def onChanged(self, fp, prop): + return None + + def execute(self, fp): + if fp.thk > fp.OD / 2: + fp.thk = fp.OD / 2.1 + fp.ID = fp.OD - 2 * fp.thk + fp.Profile = str(fp.OD) + "x" + str(fp.thk) + D = float(fp.OD) + s = float(fp.thk) + sfera = Part.makeSphere(0.8 * D, FreeCAD.Vector(0, 0, -(0.55 * D - 6 * s))) + cilindro = Part.makeCylinder( + D / 2, + D * 1.7, + FreeCAD.Vector(0, 0, -(0.55 * D - 6 * s + 1)), + FreeCAD.Vector(0, 0, 1), + ) + common = sfera.common(cilindro) + fil = common.makeFillet(D / 6.5, common.Edges) + cut = fil.cut( + Part.makeCylinder( + D * 1.1, D * 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, -1) + ) + ) + cap = cut.makeThickness( + [f for f in cut.Faces if type(f.Surface) == Part.Plane], -s, 1.0e-3 + ) + fp.Shape = cap + fp.Ports = [FreeCAD.Vector()] + super(Cap, self).execute(fp) # perform common operations + class PypeLine2(pypeType): - '''Class for object PType="PypeLine2" - This object represent a collection of objects "PType" that are updated with the - methods defined in the Python class. - At present time it creates, with the method obj.Proxy.update(,obj,[edges]), pipes and curves over - the given edges and collect them in a group named according the object's .Label. - PypeLine2 features also the optional attribute ".Base": - - Base can be a Wire or a Sketch or any object which has edges in its Shape. - - Running "obj.Proxy.update(obj)", without any [edges], the class attempts to render the pypeline - (Pipe and Elbow objects) on the "obj.Base" edges: for well defined geometries - and open paths, this usually leads to acceptable results. - - Running "obj.Proxy.purge(obj)" deletes from the model all Pipes and Elbows - that belongs to the pype-line. - - It's possible to add other objects afterwards (such as Flange, Reduct...) - using the relevant insertion dialogs but remember that these won't be updated - when the .Base is changed and won't be deleted if the pype-line is purged. - - If Base is None, PypeLine2 behaves like a bare container of objects, - with possibility to group them automatically and extract the part-list. - ''' - def __init__(self, obj,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None, lab=None): - # initialize the parent class - super(PypeLine2,self).__init__(obj) - # define common properties - obj.PType="PypeLine" - obj.PSize=DN - obj.PRating=PRating - if lab: - obj.Label=lab - # define specific properties - if not BR: - BR=0.75*OD - obj.addProperty("App::PropertyLength","BendRadius","PypeLine2",QT_TRANSLATE_NOOP("App::Property","the radius of bending")).BendRadius=BR - obj.addProperty("App::PropertyLength","OD","PypeLine2",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD - obj.addProperty("App::PropertyLength","thk","PypeLine2",QT_TRANSLATE_NOOP("App::Property","Wall thickness")).thk=thk - obj.addProperty("App::PropertyString","Group","PypeLine2",QT_TRANSLATE_NOOP("App::Property","The group.")).Group=obj.Label+"_pieces" - group=FreeCAD.activeDocument().addObject("App::DocumentObjectGroup",obj.Group) - group.addObject(obj) - FreeCAD.Console.PrintWarning("Created group "+obj.Group+"\n") - obj.addProperty("App::PropertyLink","Base","PypeLine2","the edges") - def onChanged(self, fp, prop): - if prop=='Label' and len(fp.InList): - fp.InList[0].Label=fp.Label+"_pieces" - fp.Group=fp.Label+"_pieces" - if hasattr(fp,'Base') and prop=='Base' and fp.Base: - FreeCAD.Console.PrintWarning(fp.Label+' Base has changed to '+fp.Base.Label+'\n') - if prop=='OD': - fp.BendRadius=0.75*fp.OD - def purge(self,fp): - group=FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] - for o in group.OutList: - if hasattr(o,'PType') and o.PType in ['Pipe','Elbow']: - FreeCAD.activeDocument().removeObject(o.Name) - def update(self,fp,edges=None): - from DraftVecUtils import rounded - from math import degrees - if not edges and hasattr(fp.Base,'Shape'): - edges=fp.Base.Shape.Edges - if not edges: - FreeCAD.Console.PrintError('Base has not valid edges\n') - return - pipes=list() - for e in edges: - #---Create the tube--- - p=pCmd.makePipe([fp.PSize,fp.OD,fp.thk,e.Length],pos=e.valueAt(0),Z=e.tangentAt(0)) - p.PRating=fp.PRating - p.PSize=fp.PSize - pCmd.moveToPyLi(p,fp.Label) - pipes.append(p) - n=len(pipes)-1 - if n and not fCmd.isParallel(fCmd.beamAx(pipes[n]),fCmd.beamAx(pipes[n-1])): - #---Create the curve--- - propList=[fp.PSize,fp.OD,fp.thk,90,fp.BendRadius] - c=pCmd.makeElbowBetweenThings(edges[n],edges[n-1],propList) - if c: - portA,portB=[c.Placement.multVec(port) for port in c.Ports] - #---Trim the tube--- - p1,p2=pipes[-2:] - fCmd.extendTheBeam(p1,portA) - fCmd.extendTheBeam(p2,portB) - pCmd.moveToPyLi(c,fp.Label) - def execute(self, fp): - return None + """Class for object PType="PypeLine2" + This object represent a collection of objects "PType" that are updated with the + methods defined in the Python class. + At present time it creates, with the method obj.Proxy.update(,obj,[edges]), pipes and curves over + the given edges and collect them in a group named according the object's .Label. + PypeLine2 features also the optional attribute ".Base": + - Base can be a Wire or a Sketch or any object which has edges in its Shape. + - Running "obj.Proxy.update(obj)", without any [edges], the class attempts to render the pypeline + (Pipe and Elbow objects) on the "obj.Base" edges: for well defined geometries + and open paths, this usually leads to acceptable results. + - Running "obj.Proxy.purge(obj)" deletes from the model all Pipes and Elbows + that belongs to the pype-line. + - It's possible to add other objects afterwards (such as Flange, Reduct...) + using the relevant insertion dialogs but remember that these won't be updated + when the .Base is changed and won't be deleted if the pype-line is purged. + - If Base is None, PypeLine2 behaves like a bare container of objects, + with possibility to group them automatically and extract the part-list. + """ + + def __init__( + self, obj, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None, lab=None + ): + # initialize the parent class + super(PypeLine2, self).__init__(obj) + # define common properties + obj.PType = "PypeLine" + obj.PSize = DN + obj.PRating = PRating + if lab: + obj.Label = lab + # define specific properties + if not BR: + BR = 0.75 * OD + obj.addProperty( + "App::PropertyLength", + "BendRadius", + "PypeLine2", + QT_TRANSLATE_NOOP("App::Property", "the radius of bending"), + ).BendRadius = BR + obj.addProperty( + "App::PropertyLength", + "OD", + "PypeLine2", + QT_TRANSLATE_NOOP("App::Property", "Outside diameter"), + ).OD = OD + obj.addProperty( + "App::PropertyLength", + "thk", + "PypeLine2", + QT_TRANSLATE_NOOP("App::Property", "Wall thickness"), + ).thk = thk + obj.addProperty( + "App::PropertyString", + "Group", + "PypeLine2", + QT_TRANSLATE_NOOP("App::Property", "The group."), + ).Group = obj.Label + "_pieces" + group = FreeCAD.activeDocument().addObject( + "App::DocumentObjectGroup", obj.Group + ) + group.addObject(obj) + FreeCAD.Console.PrintWarning("Created group " + obj.Group + "\n") + obj.addProperty("App::PropertyLink", "Base", "PypeLine2", "the edges") + + def onChanged(self, fp, prop): + if prop == "Label" and len(fp.InList): + fp.InList[0].Label = fp.Label + "_pieces" + fp.Group = fp.Label + "_pieces" + if hasattr(fp, "Base") and prop == "Base" and fp.Base: + FreeCAD.Console.PrintWarning( + fp.Label + " Base has changed to " + fp.Base.Label + "\n" + ) + if prop == "OD": + fp.BendRadius = 0.75 * fp.OD + + def purge(self, fp): + group = FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] + for o in group.OutList: + if hasattr(o, "PType") and o.PType in ["Pipe", "Elbow"]: + FreeCAD.activeDocument().removeObject(o.Name) + + def update(self, fp, edges=None): + from DraftVecUtils import rounded + from math import degrees + + if not edges and hasattr(fp.Base, "Shape"): + edges = fp.Base.Shape.Edges + if not edges: + FreeCAD.Console.PrintError("Base has not valid edges\n") + return + pipes = list() + for e in edges: + # ---Create the tube--- + p = pCmd.makePipe( + [fp.PSize, fp.OD, fp.thk, e.Length], pos=e.valueAt(0), Z=e.tangentAt(0) + ) + p.PRating = fp.PRating + p.PSize = fp.PSize + pCmd.moveToPyLi(p, fp.Label) + pipes.append(p) + n = len(pipes) - 1 + if n and not fCmd.isParallel( + fCmd.beamAx(pipes[n]), fCmd.beamAx(pipes[n - 1]) + ): + # ---Create the curve--- + propList = [fp.PSize, fp.OD, fp.thk, 90, fp.BendRadius] + c = pCmd.makeElbowBetweenThings(edges[n], edges[n - 1], propList) + if c: + portA, portB = [c.Placement.multVec(port) for port in c.Ports] + # ---Trim the tube--- + p1, p2 = pipes[-2:] + fCmd.extendTheBeam(p1, portA) + fCmd.extendTheBeam(p2, portB) + pCmd.moveToPyLi(c, fp.Label) + + def execute(self, fp): + return None + class ViewProviderPypeLine: def __getstate__(self): @@ -428,260 +778,467 @@ def attach(self, vobj): self.ViewObject = vobj self.Object = vobj.Object -class Ubolt(): - '''Class for object PType="Clamp" - UBolt(obj,[PSize="DN50",ClampType="U-bolt", C=76, H=109, d=10]) - obj: the "App::FeaturePython" object - PSize (string): nominal diameter - ClampType (string): the clamp type or standard - C (float): the diameter of the U-bolt - H (float): the total height of the U-bolt - d (float): the rod diameter - ''' - def __init__(self, obj,DN="DN50",ClampType="DIN-UBolt", C=76, H=109, d=10): - obj.Proxy = self - obj.addProperty("App::PropertyString","PType","Ubolt",QT_TRANSLATE_NOOP("App::Property","Type of pipeFeature")).PType="Clamp" - obj.addProperty("App::PropertyString","ClampType","Ubolt",QT_TRANSLATE_NOOP("App::Property","Type of clamp")).ClampType=ClampType - obj.addProperty("App::PropertyString","PSize","Ubolt",QT_TRANSLATE_NOOP("App::Property","Size of clamp")).PSize=DN - obj.addProperty("App::PropertyLength","C","Ubolt",QT_TRANSLATE_NOOP("App::Property","Arc diameter")).C=C - obj.addProperty("App::PropertyLength","H","Ubolt",QT_TRANSLATE_NOOP("App::Property","Overall height")).H=H - obj.addProperty("App::PropertyLength","d","Ubolt",QT_TRANSLATE_NOOP("App::Property","Rod diameter")).d=d - obj.addProperty("App::PropertyString","thread","Ubolt",QT_TRANSLATE_NOOP("App::Property","Size of thread")).thread="M"+str(d) - obj.addProperty("App::PropertyVectorList","Ports","PBase",QT_TRANSLATE_NOOP("App::Property","Ports position relative to the origin of Shape")) - def onChanged(self, fp, prop): - return None - def execute(self, fp): - fp.thread="M"+str(float(fp.d)) - c=Part.makeCircle(fp.C/2,FreeCAD.Vector(0,0,0),FreeCAD.Vector(0,0,1),0,180) - l1=Part.makeLine((fp.C/2,0,0),(fp.C/2,fp.C/2-fp.H,0)) - l2=Part.makeLine((-fp.C/2,0,0),(-fp.C/2,fp.C/2-fp.H,0)) - p=Part.Face(Part.Wire(Part.makeCircle(fp.d/2,c.valueAt(c.FirstParameter),c.tangentAt(c.FirstParameter)))) - path=Part.Wire([c,l1,l2]) - fp.Shape=path.makePipe(p) - fp.Ports=[FreeCAD.Vector(0,0,1)] - -class Shell(): - ''' - Class for a lateral-shell-of-tank object - Shell(obj[,L=800,W=400,H=500,thk=6]) - obj: the "App::FeaturePython" object - L (float): the length - W (float): the width - H (float): the height - thk1 (float): the shell thickness - thk2 (float): the top thickness - ''' - def __init__(self,obj,L=800,W=400,H=500,thk1=6, thk2=8): - obj.Proxy=self - obj.addProperty("App::PropertyLength","L","Tank",QT_TRANSLATE_NOOP("App::Property","Tank's length")).L=L - obj.addProperty("App::PropertyLength","W","Tank",QT_TRANSLATE_NOOP("App::Property","Tank's width")).W=W - obj.addProperty("App::PropertyLength","H","Tank",QT_TRANSLATE_NOOP("App::Property","Tank's height")).H=H - obj.addProperty("App::PropertyLength","thk1","Tank",QT_TRANSLATE_NOOP("App::Property","Thikness of tank's shell")).thk1=thk1 - obj.addProperty("App::PropertyLength","thk2","Tank",QT_TRANSLATE_NOOP("App::Property","Thikness of tank's top")).thk2=thk2 - def onChanged(self, fp, prop): - return None - def execute(self, fp): - O=FreeCAD.Vector(0,0,0) - vectL=FreeCAD.Vector(fp.L,0,0) - vectW=FreeCAD.Vector(0,fp.W,0) - vectH=FreeCAD.Vector(0,0,fp.H) - base=[vectL,vectW,vectH] - outline=[] - for i in range(3): - f1=Part.Face(Part.makePolygon([O,base[0],base[0]+base[1],base[1],O])) - outline.append(f1) - f2=f1.copy() - f2.translate(base[2]) - outline.append(f2) - base.append(base.pop(0)) - box=Part.Solid(Part.Shell(outline)) - tank=box.makeThickness([box.Faces[0],box.Faces[2]],-fp.thk1,1.e-3) - top=Part.makeBox(fp.L-2*fp.thk1,fp.W-2*fp.thk1,fp.thk2,FreeCAD.Vector(fp.thk1,fp.thk1,fp.H-2*fp.thk2)) - fp.Shape=Part.makeCompound([tank,top]) + def getIcon(self): + from os.path import join, dirname, abspath + + return join(dirname(abspath(__file__)), "iconz", "pypeline.svg") + + def attach(self, vobj): + self.ViewObject = vobj + self.Object = vobj.Object + + +class Ubolt: + """Class for object PType="Clamp" + UBolt(obj,[PSize="DN50",ClampType="U-bolt", C=76, H=109, d=10]) + obj: the "App::FeaturePython" object + PSize (string): nominal diameter + ClampType (string): the clamp type or standard + C (float): the diameter of the U-bolt + H (float): the total height of the U-bolt + d (float): the rod diameter + """ + + def __init__(self, obj, DN="DN50", ClampType="DIN-UBolt", C=76, H=109, d=10): + obj.Proxy = self + obj.addProperty( + "App::PropertyString", + "PType", + "Ubolt", + QT_TRANSLATE_NOOP("App::Property", "Type of pipeFeature"), + ).PType = "Clamp" + obj.addProperty( + "App::PropertyString", + "ClampType", + "Ubolt", + QT_TRANSLATE_NOOP("App::Property", "Type of clamp"), + ).ClampType = ClampType + obj.addProperty( + "App::PropertyString", + "PSize", + "Ubolt", + QT_TRANSLATE_NOOP("App::Property", "Size of clamp"), + ).PSize = DN + obj.addProperty( + "App::PropertyLength", + "C", + "Ubolt", + QT_TRANSLATE_NOOP("App::Property", "Arc diameter"), + ).C = C + obj.addProperty( + "App::PropertyLength", + "H", + "Ubolt", + QT_TRANSLATE_NOOP("App::Property", "Overall height"), + ).H = H + obj.addProperty( + "App::PropertyLength", + "d", + "Ubolt", + QT_TRANSLATE_NOOP("App::Property", "Rod diameter"), + ).d = d + obj.addProperty( + "App::PropertyString", + "thread", + "Ubolt", + QT_TRANSLATE_NOOP("App::Property", "Size of thread"), + ).thread = "M" + str(d) + obj.addProperty( + "App::PropertyVectorList", + "Ports", + "PBase", + QT_TRANSLATE_NOOP( + "App::Property", "Ports position relative to the origin of Shape" + ), + ) + + def onChanged(self, fp, prop): + return None + + def execute(self, fp): + fp.thread = "M" + str(float(fp.d)) + c = Part.makeCircle( + fp.C / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 0, 180 + ) + l1 = Part.makeLine((fp.C / 2, 0, 0), (fp.C / 2, fp.C / 2 - fp.H, 0)) + l2 = Part.makeLine((-fp.C / 2, 0, 0), (-fp.C / 2, fp.C / 2 - fp.H, 0)) + p = Part.Face( + Part.Wire( + Part.makeCircle( + fp.d / 2, c.valueAt(c.FirstParameter), c.tangentAt(c.FirstParameter) + ) + ) + ) + path = Part.Wire([c, l1, l2]) + fp.Shape = path.makePipe(p) + fp.Ports = [FreeCAD.Vector(0, 0, 1)] + + +class Shell: + """ + Class for a lateral-shell-of-tank object + Shell(obj[,L=800,W=400,H=500,thk=6]) + obj: the "App::FeaturePython" object + L (float): the length + W (float): the width + H (float): the height + thk1 (float): the shell thickness + thk2 (float): the top thickness + """ + + def __init__(self, obj, L=800, W=400, H=500, thk1=6, thk2=8): + obj.Proxy = self + obj.addProperty( + "App::PropertyLength", + "L", + "Tank", + QT_TRANSLATE_NOOP("App::Property", "Tank's length"), + ).L = L + obj.addProperty( + "App::PropertyLength", + "W", + "Tank", + QT_TRANSLATE_NOOP("App::Property", "Tank's width"), + ).W = W + obj.addProperty( + "App::PropertyLength", + "H", + "Tank", + QT_TRANSLATE_NOOP("App::Property", "Tank's height"), + ).H = H + obj.addProperty( + "App::PropertyLength", + "thk1", + "Tank", + QT_TRANSLATE_NOOP("App::Property", "Thikness of tank's shell"), + ).thk1 = thk1 + obj.addProperty( + "App::PropertyLength", + "thk2", + "Tank", + QT_TRANSLATE_NOOP("App::Property", "Thikness of tank's top"), + ).thk2 = thk2 + + def onChanged(self, fp, prop): + return None + + def execute(self, fp): + O = FreeCAD.Vector(0, 0, 0) + vectL = FreeCAD.Vector(fp.L, 0, 0) + vectW = FreeCAD.Vector(0, fp.W, 0) + vectH = FreeCAD.Vector(0, 0, fp.H) + base = [vectL, vectW, vectH] + outline = [] + for i in range(3): + f1 = Part.Face( + Part.makePolygon([O, base[0], base[0] + base[1], base[1], O]) + ) + outline.append(f1) + f2 = f1.copy() + f2.translate(base[2]) + outline.append(f2) + base.append(base.pop(0)) + box = Part.Solid(Part.Shell(outline)) + tank = box.makeThickness([box.Faces[0], box.Faces[2]], -fp.thk1, 1.0e-3) + top = Part.makeBox( + fp.L - 2 * fp.thk1, + fp.W - 2 * fp.thk1, + fp.thk2, + FreeCAD.Vector(fp.thk1, fp.thk1, fp.H - 2 * fp.thk2), + ) + fp.Shape = Part.makeCompound([tank, top]) + class ViewProviderPypeBranch: - def __init__(self,vobj): - vobj.Proxy = self - if int(FreeCAD.Version()[1])>19: - vobj.addExtension("Gui::ViewProviderGroupExtensionPython") - else: - vobj.addExtension("Gui::ViewProviderGroupExtensionPython",self) #20220704 - #vobj.ExtensionProxy=self #20220703 - def getIcon(self): - from os.path import join, dirname, abspath - return join(dirname(abspath(__file__)),"iconz","branch.svg") - def attach(self, vobj): - self.ViewObject = vobj - self.Object = vobj.Object - def setEdit(self,vobj,mode): - return False - def unsetEdit(self,vobj,mode): - return - def __getstate__(self): - return None - def __setstate__(self,state): - return None - def dumps(self): - return None - def loads(self,state): - return None - def claimChildren(self): - children=[FreeCAD.ActiveDocument.getObject(name) for name in self.Object.Tubes+self.Object.Curves] - return children - def onDelete(self, feature, subelements): # subelements is a tuple of strings - return True + def __init__(self, vobj): + vobj.Proxy = self + if int(FreeCAD.Version()[1]) > 19: + vobj.addExtension("Gui::ViewProviderGroupExtensionPython") + else: + vobj.addExtension("Gui::ViewProviderGroupExtensionPython", self) # 20220704 + # vobj.ExtensionProxy=self #20220703 + + def getIcon(self): + from os.path import join, dirname, abspath + + return join(dirname(abspath(__file__)), "iconz", "branch.svg") + + def attach(self, vobj): + self.ViewObject = vobj + self.Object = vobj.Object + + def setEdit(self, vobj, mode): + return False + + def unsetEdit(self, vobj, mode): + return + + def __getstate__(self): + return None + + def __setstate__(self, state): + return None + + def dumps(self): + return None + + def loads(self, state): + return None + + def claimChildren(self): + children = [ + FreeCAD.ActiveDocument.getObject(name) + for name in self.Object.Tubes + self.Object.Curves + ] + return children + + def onDelete(self, feature, subelements): # subelements is a tuple of strings + return True + class Valve(pypeType): - '''Class for object PType="Valve" - Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100]) - obj: the "App::FeaturePython object" - PSize (string): nominal diameter - PRating (string): ! the valve's type ! - OD (float): outside diameter - H (float): length of valve''' - def __init__(self, obj,DN="DN50",VType="ball",OD=72, ID=50, H=40, Kv=150): - # initialize the parent class - super(Valve,self).__init__(obj) - # define common properties - obj.PType="Valve" - obj.PRating=VType - obj.PSize=DN - obj.Kv=Kv - # define specific properties - obj.addProperty("App::PropertyLength","OD","Valve",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD - obj.addProperty("App::PropertyLength","ID","Valve",QT_TRANSLATE_NOOP("App::Property","Inside diameter")).ID=ID - obj.addProperty("App::PropertyLength","Height","Valve",QT_TRANSLATE_NOOP("App::Property","Length of tube")).Height=H - def execute(self, fp): - c=Part.makeCone(fp.OD/2,fp.OD/5,fp.Height/2) - v=c.fuse(c.mirror(FreeCAD.Vector(0,0,fp.Height/2),FreeCAD.Vector(0,0,1))) - if fp.PRating.find('ball')+1 or fp.PRating.find('globe')+1: - r=min(fp.Height*0.45,fp.OD/2) - v=v.fuse(Part.makeSphere(r,FreeCAD.Vector(0,0,fp.Height/2))) - fp.Shape = v - fp.Ports=[FreeCAD.Vector(),FreeCAD.Vector(0,0,float(fp.Height))] - super(Valve,self).execute(fp) # perform common operations - -class PypeBranch2(pypeType): # use AttachExtensionPython - '''Class for object PType="PypeBranch2" - Single-line pipe branch linked to its center-line using AttachExtensionPython - ex: a=PypeBranch2(obj,base,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None) - type(obj)=FeaturePython - type(base)=DWire or SketchObject - ''' - def __init__(self, obj,base,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None): - # initialize the parent class - super(PypeBranch2,self).__init__(obj) - # define common properties - obj.PType="PypeBranch" - obj.PSize=DN - obj.PRating=PRating - # define specific properties - if int(FreeCAD.Version()[1])>19: - obj.addExtension("App::GroupExtensionPython") - else: - obj.addExtension("App::GroupExtensionPython",obj) #20220704 - obj.addProperty("App::PropertyLength","OD","PypeBranch",QT_TRANSLATE_NOOP("App::PropertyLength","Outside diameter")).OD=OD - obj.addProperty("App::PropertyLength","thk","PypeBranch",QT_TRANSLATE_NOOP("App::PropertyLength","Wall thickness")).thk=thk - if not BR: BR=0.75*OD - obj.addProperty("App::PropertyLength","BendRadius","PypeBranch",QT_TRANSLATE_NOOP("App::Property","Bend Radius")).BendRadius=BR - obj.addProperty("App::PropertyStringList","Tubes","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The tubes of the branch.")) - obj.addProperty("App::PropertyStringList","Curves","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The curves of the branch.")) - obj.addProperty("App::PropertyLink","Base","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The path.")) - if hasattr(base,"Shape") and base.Shape.Edges: - obj.Base=base - else: - FreeCAD.Console.PrintError('Base not valid\n') - def onChanged(self, fp, prop): - if prop=='Base' and hasattr(fp,'OD') and hasattr(fp,'thk') and hasattr(fp,'BendRadius'): - self.purge(fp) - self.redraw(fp) - if prop=='BendRadius' and hasattr(fp,'Curves'): - BR=fp.BendRadius - for curve in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]: - curve.BendRadius=BR - if prop=='OD' and hasattr(fp,'Tubes') and hasattr(fp,'Curves'): - OD=fp.OD - for obj in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]: - if obj.PType=='Elbow': obj.BendRadius=OD*.75 - obj.OD=OD - fp.BendRadius=OD*.75 - if prop=='thk' and hasattr(fp,'Tubes') and hasattr(fp,'Curves'): - thk=fp.thk - for obj in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]: - if hasattr(obj,'thk'): obj.thk=thk - def execute(self, fp): - if len(fp.Tubes)!=len(fp.Base.Shape.Edges): - self.purge(fp) - self.redraw(fp) - return - from math import tan - for i in range(len(fp.Tubes)): - L=fp.Base.Shape.Edges[i].Length - R=fp.BendRadius - # adjust the curve - if i0: - alfa=e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i-1].tangentAt(0))/2 - L-=R*tan(alfa) - offset=R*tan(alfa) - if i<(len(fp.Base.Shape.Edges)-1): - alfa=e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i+1].tangentAt(0))/2 - L-=R*tan(alfa) - eSupport='Edge'+str(i+1) - t=pCmd.makePipe([fp.PSize,float(fp.OD),float(fp.thk),L]) - t.PRating=fp.PRating - t.PSize=fp.PSize - t.Support = [(fp.Base,eSupport)] - t.MapMode = 'NormalToEdge' - t.MapReversed = True - t.AttachmentOffset=FreeCAD.Placement(FreeCAD.Vector(0,0,offset),FreeCAD.Rotation()) - tubes.append(t.Name) - #---Create the curve--- - if i>0: - e0=fp.Base.Shape.Edges[i-1] - alfa=degrees(e0.tangentAt(0).getAngle(e.tangentAt(0))) - c=pCmd.makeElbow([fp.PSize,float(fp.OD),float(fp.thk),alfa,R]) - c.PRating=fp.PRating - c.PSize=fp.PSize - O='Vertex'+str(i+1) - c.MapReversed = False - c.Support = [(fp.Base,O)] - c.MapMode = 'Translate' - pCmd.placeTheElbow(c,e0.tangentAt(0),e.tangentAt(0)) - curves.append(c.Name) - fp.Tubes=tubes - fp.Curves=curves - fp.addObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]) - def purge(self,fp): - if hasattr(fp,'Tubes'): - fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes]) - for name in fp.Tubes: FreeCAD.ActiveDocument.removeObject(name) - fp.Tubes=[] - if hasattr(fp,'Curves'): - fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]) - for name in fp.Curves: FreeCAD.ActiveDocument.removeObject(name) - fp.Curves=[] + """Class for object PType="Valve" + Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100]) + obj: the "App::FeaturePython object" + PSize (string): nominal diameter + PRating (string): ! the valve's type ! + OD (float): outside diameter + H (float): length of valve""" + + def __init__(self, obj, DN="DN50", VType="ball", OD=72, ID=50, H=40, Kv=150): + # initialize the parent class + super(Valve, self).__init__(obj) + # define common properties + obj.PType = "Valve" + obj.PRating = VType + obj.PSize = DN + obj.Kv = Kv + # define specific properties + obj.addProperty( + "App::PropertyLength", + "OD", + "Valve", + QT_TRANSLATE_NOOP("App::Property", "Outside diameter"), + ).OD = OD + obj.addProperty( + "App::PropertyLength", + "ID", + "Valve", + QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), + ).ID = ID + obj.addProperty( + "App::PropertyLength", + "Height", + "Valve", + QT_TRANSLATE_NOOP("App::Property", "Length of tube"), + ).Height = H + + def execute(self, fp): + c = Part.makeCone(fp.OD / 2, fp.OD / 5, fp.Height / 2) + v = c.fuse( + c.mirror(FreeCAD.Vector(0, 0, fp.Height / 2), FreeCAD.Vector(0, 0, 1)) + ) + if fp.PRating.find("ball") + 1 or fp.PRating.find("globe") + 1: + r = min(fp.Height * 0.45, fp.OD / 2) + v = v.fuse(Part.makeSphere(r, FreeCAD.Vector(0, 0, fp.Height / 2))) + fp.Shape = v + fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.Height))] + super(Valve, self).execute(fp) # perform common operations + + +class PypeBranch2(pypeType): # use AttachExtensionPython + """Class for object PType="PypeBranch2" + Single-line pipe branch linked to its center-line using AttachExtensionPython + ex: a=PypeBranch2(obj,base,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None) + type(obj)=FeaturePython + type(base)=DWire or SketchObject + """ + + def __init__( + self, obj, base, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None + ): + # initialize the parent class + super(PypeBranch2, self).__init__(obj) + # define common properties + obj.PType = "PypeBranch" + obj.PSize = DN + obj.PRating = PRating + # define specific properties + if int(FreeCAD.Version()[1]) > 19: + obj.addExtension("App::GroupExtensionPython") + else: + obj.addExtension("App::GroupExtensionPython", obj) # 20220704 + obj.addProperty( + "App::PropertyLength", + "OD", + "PypeBranch", + QT_TRANSLATE_NOOP("App::PropertyLength", "Outside diameter"), + ).OD = OD + obj.addProperty( + "App::PropertyLength", + "thk", + "PypeBranch", + QT_TRANSLATE_NOOP("App::PropertyLength", "Wall thickness"), + ).thk = thk + if not BR: + BR = 0.75 * OD + obj.addProperty( + "App::PropertyLength", + "BendRadius", + "PypeBranch", + QT_TRANSLATE_NOOP("App::Property", "Bend Radius"), + ).BendRadius = BR + obj.addProperty( + "App::PropertyStringList", + "Tubes", + "PypeBranch", + QT_TRANSLATE_NOOP("App::Property", "The tubes of the branch."), + ) + obj.addProperty( + "App::PropertyStringList", + "Curves", + "PypeBranch", + QT_TRANSLATE_NOOP("App::Property", "The curves of the branch."), + ) + obj.addProperty( + "App::PropertyLink", + "Base", + "PypeBranch", + QT_TRANSLATE_NOOP("App::Property", "The path."), + ) + if hasattr(base, "Shape") and base.Shape.Edges: + obj.Base = base + else: + FreeCAD.Console.PrintError("Base not valid\n") + + def onChanged(self, fp, prop): + if ( + prop == "Base" + and hasattr(fp, "OD") + and hasattr(fp, "thk") + and hasattr(fp, "BendRadius") + ): + self.purge(fp) + self.redraw(fp) + if prop == "BendRadius" and hasattr(fp, "Curves"): + BR = fp.BendRadius + for curve in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]: + curve.BendRadius = BR + if prop == "OD" and hasattr(fp, "Tubes") and hasattr(fp, "Curves"): + OD = fp.OD + for obj in [ + FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves + ]: + if obj.PType == "Elbow": + obj.BendRadius = OD * 0.75 + obj.OD = OD + fp.BendRadius = OD * 0.75 + if prop == "thk" and hasattr(fp, "Tubes") and hasattr(fp, "Curves"): + thk = fp.thk + for obj in [ + FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves + ]: + if hasattr(obj, "thk"): + obj.thk = thk + + def execute(self, fp): + if len(fp.Tubes) != len(fp.Base.Shape.Edges): + self.purge(fp) + self.redraw(fp) + return + from math import tan + + for i in range(len(fp.Tubes)): + L = fp.Base.Shape.Edges[i].Length + R = fp.BendRadius + # adjust the curve + if i < len(fp.Curves): + c = FreeCAD.ActiveDocument.getObject(fp.Curves[i]) + v1, v2 = [e.tangentAt(0) for e in fp.Base.Shape.Edges[i : i + 2]] + pCmd.placeTheElbow(c, v1, v2) + alfa = float(v1.getAngle(v2)) / 2 + L -= float(R * tan(alfa)) + # adjust the pipes + if i: + v1, v2 = [e.tangentAt(0) for e in fp.Base.Shape.Edges[i - 1 : i + 1]] + alfa = float(v1.getAngle(v2)) / 2 + tang = float(R * tan(alfa)) + L -= tang + FreeCAD.ActiveDocument.getObject( + fp.Tubes[i] + ).AttachmentOffset.Base = FreeCAD.Vector(0, 0, tang) + FreeCAD.ActiveDocument.getObject(fp.Tubes[i]).Height = L + + def redraw(self, fp): + from math import tan, degrees + + tubes = list() + curves = list() + if fp.Base: + for i in range(len(fp.Base.Shape.Edges)): + e = fp.Base.Shape.Edges[i] + L = e.Length + R = float(fp.BendRadius) + offset = 0 + # ---Create the tube--- + if i > 0: + alfa = ( + e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i - 1].tangentAt(0)) + / 2 + ) + L -= R * tan(alfa) + offset = R * tan(alfa) + if i < (len(fp.Base.Shape.Edges) - 1): + alfa = ( + e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i + 1].tangentAt(0)) + / 2 + ) + L -= R * tan(alfa) + eSupport = "Edge" + str(i + 1) + t = pCmd.makePipe([fp.PSize, float(fp.OD), float(fp.thk), L]) + t.PRating = fp.PRating + t.PSize = fp.PSize + t.Support = [(fp.Base, eSupport)] + t.MapMode = "NormalToEdge" + t.MapReversed = True + t.AttachmentOffset = FreeCAD.Placement( + FreeCAD.Vector(0, 0, offset), FreeCAD.Rotation() + ) + tubes.append(t.Name) + # ---Create the curve--- + if i > 0: + e0 = fp.Base.Shape.Edges[i - 1] + alfa = degrees(e0.tangentAt(0).getAngle(e.tangentAt(0))) + c = pCmd.makeElbow([fp.PSize, float(fp.OD), float(fp.thk), alfa, R]) + c.PRating = fp.PRating + c.PSize = fp.PSize + O = "Vertex" + str(i + 1) + c.MapReversed = False + c.Support = [(fp.Base, O)] + c.MapMode = "Translate" + pCmd.placeTheElbow(c, e0.tangentAt(0), e.tangentAt(0)) + curves.append(c.Name) + fp.Tubes = tubes + fp.Curves = curves + fp.addObjects( + [ + FreeCAD.ActiveDocument.getObject(name) + for name in fp.Tubes + fp.Curves + ] + ) + + def purge(self, fp): + if hasattr(fp, "Tubes"): + fp.removeObjects( + [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes] + ) + for name in fp.Tubes: + FreeCAD.ActiveDocument.removeObject(name) + fp.Tubes = [] + if hasattr(fp, "Curves"): + fp.removeObjects( + [FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves] + ) + for name in fp.Curves: + FreeCAD.ActiveDocument.removeObject(name) + fp.Curves = [] From a7a39320edaca4a5f8533e808864e68f538fdede Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 3 May 2020 23:18:16 -0500 Subject: [PATCH 023/135] merge pCmd with translated function Addobject name translated Release last revision es-ES QM file --- pCmd.py | 2494 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 1382 insertions(+), 1112 deletions(-) diff --git a/pCmd.py b/pCmd.py index 010b0dd..68dcddc 100644 --- a/pCmd.py +++ b/pCmd.py @@ -1,281 +1,337 @@ -#(c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD -__title__="pypeTools functions" +__title__ = "pypeTools functions" import FreeCAD, FreeCADGui, Part, fCmd, pFeatures from DraftVecUtils import rounded from PySide.QtCore import QT_TRANSLATE_NOOP from DraftGui import translate -objToPaint=['Pipe','Elbow','Reduct','Flange','Cap'] + +objToPaint = ["Pipe", "Elbow", "Reduct", "Flange", "Cap"] from math import degrees -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" -X=FreeCAD.Vector(1,0,0) -Y=FreeCAD.Vector(0,1,0) -Z=FreeCAD.Vector(0,0,1) +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" +X = FreeCAD.Vector(1, 0, 0) +Y = FreeCAD.Vector(0, 1, 0) +Z = FreeCAD.Vector(0, 0, 1) ############### AUX FUNCTIONS ###################### + def readTable(fileName="Pipe_SCH-STD.csv"): - ''' - readTable(fileName) - Returns the list of dictionaries read from file in ./tablez - fileName: the file name without path; default="Pipe_SCH-STD.csv" - ''' - from os.path import join, dirname, abspath - import csv - f=open(join(dirname(abspath(__file__)),"tablez",fileName),'r') - reader=csv.DictReader(f,delimiter=';') - table=[] - for row in reader: - table.append(row) - f.close() - return table + """ + readTable(fileName) + Returns the list of dictionaries read from file in ./tablez + fileName: the file name without path; default="Pipe_SCH-STD.csv" + """ + from os.path import join, dirname, abspath + import csv + + f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") + reader = csv.DictReader(f, delimiter=";") + table = [] + for row in reader: + table.append(row) + f.close() + return table + def shapeReferenceAxis(obj=None, axObj=None): - # function to get the reference axis of the shape for rotateTheTubeAx() - # used in rotateTheTubeEdge() and pipeForms.rotateForm().getAxis() - ''' - shapeReferenceAxis(obj, axObj) - Returns the direction of an axis axObj - according the original Shape orientation of the object obj - If arguments are None axObj is the normal to one circular edge selected - and obj is the object selected. - ''' - if obj==None and axObj==None: - selex=FreeCADGui.Selection.getSelectionEx() - if len(selex)==1 and len(selex[0].SubObjects)>0: - sub=selex[0].SubObjects[0] - if sub.ShapeType=='Edge' and sub.curvatureAt(0)>0: - axObj=sub.tangentAt(0).cross(sub.normalAt(0)) - obj=selex[0].Object - X=obj.Placement.Rotation.multVec(FreeCAD.Vector(1,0,0)).dot(axObj) - Y=obj.Placement.Rotation.multVec(FreeCAD.Vector(0,1,0)).dot(axObj) - Z=obj.Placement.Rotation.multVec(FreeCAD.Vector(0,0,1)).dot(axObj) - axShapeRef=FreeCAD.Vector(X,Y,Z) - return axShapeRef + # function to get the reference axis of the shape for rotateTheTubeAx() + # used in rotateTheTubeEdge() and pipeForms.rotateForm().getAxis() + """ + shapeReferenceAxis(obj, axObj) + Returns the direction of an axis axObj + according the original Shape orientation of the object obj + If arguments are None axObj is the normal to one circular edge selected + and obj is the object selected. + """ + if obj == None and axObj == None: + selex = FreeCADGui.Selection.getSelectionEx() + if len(selex) == 1 and len(selex[0].SubObjects) > 0: + sub = selex[0].SubObjects[0] + if sub.ShapeType == "Edge" and sub.curvatureAt(0) > 0: + axObj = sub.tangentAt(0).cross(sub.normalAt(0)) + obj = selex[0].Object + X = obj.Placement.Rotation.multVec(FreeCAD.Vector(1, 0, 0)).dot(axObj) + Y = obj.Placement.Rotation.multVec(FreeCAD.Vector(0, 1, 0)).dot(axObj) + Z = obj.Placement.Rotation.multVec(FreeCAD.Vector(0, 0, 1)).dot(axObj) + axShapeRef = FreeCAD.Vector(X, Y, Z) + return axShapeRef + def isPipe(obj): - 'True if obj is a tube' - return hasattr(obj,'PType') and obj.PType=='Pipe' + "True if obj is a tube" + return hasattr(obj, "PType") and obj.PType == "Pipe" + def isElbow(obj): - 'True if obj is an elbow' - return hasattr(obj,'PType') and obj.PType=='Elbow' - -def moveToPyLi(obj,plName): - ''' - Move obj to the group of pypeLine plName - ''' - pl=FreeCAD.ActiveDocument.getObjectsByLabel(plName)[0] - group=FreeCAD.ActiveDocument.getObjectsByLabel(str(pl.Group))[0] - group.addObject(obj) - if hasattr(obj,'PType'): - if obj.PType in objToPaint: - obj.ViewObject.ShapeColor=pl.ViewObject.ShapeColor - elif obj.PType == 'PypeBranch': - for e in [FreeCAD.ActiveDocument.getObject(name) for name in obj.Tubes+obj.Curves]: - e.ViewObject.ShapeColor=pl.ViewObject.ShapeColor + "True if obj is an elbow" + return hasattr(obj, "PType") and obj.PType == "Elbow" + + +def moveToPyLi(obj, plName): + """ + Move obj to the group of pypeLine plName + """ + pl = FreeCAD.ActiveDocument.getObjectsByLabel(plName)[0] + group = FreeCAD.ActiveDocument.getObjectsByLabel(str(pl.Group))[0] + group.addObject(obj) + if hasattr(obj, "PType"): + if obj.PType in objToPaint: + obj.ViewObject.ShapeColor = pl.ViewObject.ShapeColor + elif obj.PType == "PypeBranch": + for e in [ + FreeCAD.ActiveDocument.getObject(name) + for name in obj.Tubes + obj.Curves + ]: + e.ViewObject.ShapeColor = pl.ViewObject.ShapeColor + def portsPos(o): - ''' - portsPos(o) - Returns the position of Ports of the pype-object o - ''' - if hasattr(o,'Ports') and hasattr(o,'Placement'): return [rounded(o.Placement.multVec(p)) for p in o.Ports] + """ + portsPos(o) + Returns the position of Ports of the pype-object o + """ + if hasattr(o, "Ports") and hasattr(o, "Placement"): + return [rounded(o.Placement.multVec(p)) for p in o.Ports] + def portsDir(o): - ''' - portsDir(o) - Returns the orientation of Ports of the pype-object o - ''' - dirs=list() - two_ways=['Pipe','Reduct','Flange'] - if hasattr(o,'PType'): - if o.PType in two_ways: - dirs=[o.Placement.Rotation.multVec(p) for p in [FreeCAD.Vector(0,0,-1),FreeCAD.Vector(0,0,1)]] - elif hasattr(o,'Ports') and hasattr(o,'Placement'): - dirs=list() - for p in o.Ports: - if p.Length: - dirs.append(rounded(o.Placement.Rotation.multVec(p).normalize())) - else: - dirs.append(rounded(o.Placement.Rotation.multVec(FreeCAD.Vector(0,0,-1)).normalize())) - return dirs + """ + portsDir(o) + Returns the orientation of Ports of the pype-object o + """ + dirs = list() + two_ways = ["Pipe", "Reduct", "Flange"] + if hasattr(o, "PType"): + if o.PType in two_ways: + dirs = [ + o.Placement.Rotation.multVec(p) + for p in [FreeCAD.Vector(0, 0, -1), FreeCAD.Vector(0, 0, 1)] + ] + elif hasattr(o, "Ports") and hasattr(o, "Placement"): + dirs = list() + for p in o.Ports: + if p.Length: + dirs.append(rounded(o.Placement.Rotation.multVec(p).normalize())) + else: + dirs.append( + rounded( + o.Placement.Rotation.multVec( + FreeCAD.Vector(0, 0, -1) + ).normalize() + ) + ) + return dirs + ################## COMMANDS ######################## -def simpleSurfBend(path=None,profile=None): - 'select the centerline and the O.D. and let it sweep' - curva=FreeCAD.activeDocument().addObject("Part::Feature",translate("Part::Feature","Simple curve")) - if path==None or profile==None: - curva.Shape=Part.makeSweepSurface(*fCmd.edges()[:2]) - elif path.ShapeType==profile.ShapeType=='Edge': - curva.Shape=Part.makeSweepSurface(path,profile) + +def simpleSurfBend(path=None, profile=None): + "select the centerline and the O.D. and let it sweep" + curva = FreeCAD.activeDocument().addObject( + "Part::Feature", translate("Part::Feature", "Simple curve") + ) + if path == None or profile == None: + curva.Shape = Part.makeSweepSurface(*fCmd.edges()[:2]) + elif path.ShapeType == profile.ShapeType == "Edge": + curva.Shape = Part.makeSweepSurface(path, profile) + def makePipe(propList=[], pos=None, Z=None): - '''add a Pipe object - makePipe(propList,pos,Z); - propList is one optional list with 4 elements: - DN (string): nominal diameter - OD (float): outside diameter - thk (float): shell thickness - H (float): length of pipe - Default is "DN50 (SCH-STD)" - pos (vector): position of insertion; default = 0,0,0 - Z (vector): orientation: default = 0,0,1 - Remember: property PRating must be defined afterwards - ''' - if pos==None: - pos=FreeCAD.Vector(0,0,0) - if Z==None: - Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Tube")) - if len(propList)==4: - pFeatures.Pipe(a,*propList) - else: - pFeatures.Pipe(a) - a.ViewObject.Proxy=0 - a.Placement.Base=pos - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),Z) - a.Placement.Rotation=rot.multiply(a.Placement.Rotation) - return a - -def doPipes(propList=['DN50',60.3,3,1000], pypeline=None): - ''' + """add a Pipe object + makePipe(propList,pos,Z); + propList is one optional list with 4 elements: + DN (string): nominal diameter + OD (float): outside diameter + thk (float): shell thickness + H (float): length of pipe + Default is "DN50 (SCH-STD)" + pos (vector): position of insertion; default = 0,0,0 + Z (vector): orientation: default = 0,0,1 + Remember: property PRating must be defined afterwards + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject( + "Part::FeaturePython", translate("Part::FeaturePython", "Tube") + ) + if len(propList) == 4: + pFeatures.Pipe(a, *propList) + else: + pFeatures.Pipe(a) + a.ViewObject.Proxy = 0 + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + return a + + +def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): + """ propList = [ DN (string): nominal diameter OD (float): outside diameter thk (float): shell thickness H (float): length of pipe ] pypeline = string - ''' - FreeCAD.activeDocument().openTransaction('Insert pipe') - plist=list() - if len(fCmd.edges())==0: #..no edges selected - vs=[v for sx in FreeCADGui.Selection.getSelectionEx() for so in sx.SubObjects for v in so.Vertexes] - if len(vs)==0: # ...no vertexes selected - plist.append(makePipe(propList)) - else: # ... one or more vertexes - for v in vs: plist.append(makePipe(propList,v.Point)) - else: - selex=FreeCADGui.Selection.getSelectionEx() - for objex in selex: - o=objex.Object - if fCmd.faces(): # Face selected... - for face in fCmd.faces(): - x=(face.ParameterRange[0]+face.ParameterRange[1])/2 - y=(face.ParameterRange[2]+face.ParameterRange[3])/2 - plist.append(makePipe(propList,face.valueAt(x,y),face.normalAt(x,y))) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - else: - for edge in fCmd.edges([objex]): # ...one or more edges... - if edge.curvatureAt(0)==0: # ...straight edges - pL=propList - pL[3]=edge.Length - plist.append(makePipe(pL,edge.valueAt(0),edge.tangentAt(0))) - else: # ...curved edges - pos=edge.centerOfCurvatureAt(0) - Z=edge.tangentAt(0).cross(edge.normalAt(0)) - if isElbow(o): - p0,p1=[o.Placement.Rotation.multVec(p) for p in o.Ports] - if not fCmd.isParallel(Z,p0): - Z=p1 - plist.append(makePipe(propList,pos,Z)) - if pypeline: - for p in plist: - moveToPyLi(p,pypeline) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - return plist + """ + FreeCAD.activeDocument().openTransaction("Insert pipe") + plist = list() + if len(fCmd.edges()) == 0: # ..no edges selected + vs = [ + v + for sx in FreeCADGui.Selection.getSelectionEx() + for so in sx.SubObjects + for v in so.Vertexes + ] + if len(vs) == 0: # ...no vertexes selected + plist.append(makePipe(propList)) + else: # ... one or more vertexes + for v in vs: + plist.append(makePipe(propList, v.Point)) + else: + selex = FreeCADGui.Selection.getSelectionEx() + for objex in selex: + o = objex.Object + if fCmd.faces(): # Face selected... + for face in fCmd.faces(): + x = (face.ParameterRange[0] + face.ParameterRange[1]) / 2 + y = (face.ParameterRange[2] + face.ParameterRange[3]) / 2 + plist.append( + makePipe(propList, face.valueAt(x, y), face.normalAt(x, y)) + ) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + else: + for edge in fCmd.edges([objex]): # ...one or more edges... + if edge.curvatureAt(0) == 0: # ...straight edges + pL = propList + pL[3] = edge.Length + plist.append(makePipe(pL, edge.valueAt(0), edge.tangentAt(0))) + else: # ...curved edges + pos = edge.centerOfCurvatureAt(0) + Z = edge.tangentAt(0).cross(edge.normalAt(0)) + if isElbow(o): + p0, p1 = [o.Placement.Rotation.multVec(p) for p in o.Ports] + if not fCmd.isParallel(Z, p0): + Z = p1 + plist.append(makePipe(propList, pos, Z)) + if pypeline: + for p in plist: + moveToPyLi(p, pypeline) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + return plist + def makeElbow(propList=[], pos=None, Z=None): - '''Adds an Elbow object - makeElbow(propList,pos,Z); + """Adds an Elbow object + makeElbow(propList,pos,Z); + propList is one optional list with 5 elements: + DN (string): nominal diameter + OD (float): outside diameter + thk (float): shell thickness + BA (float): bend angle + BR (float): bend radius + Default is "DN50" + pos (vector): position of insertion; default = 0,0,0 + Z (vector): orientation: default = 0,0,1 + Remember: property PRating must be defined afterwards + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject( + "Part::FeaturePython", translate("Part::FeaturePython", "Elbow") + ) + if len(propList) == 5: + pFeatures.Elbow(a, *propList) + else: + pFeatures.Elbow(a) + a.ViewObject.Proxy = 0 + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) + # rot=FreeCAD.Rotation(FreeCAD.Vector(0,-1,0),Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + return a + + +def makeElbowBetweenThings(thing1=None, thing2=None, propList=None): + """ + makeElbowBetweenThings(thing1, thing2, propList=None): + Place one elbow at the intersection of thing1 and thing2. + Things can be any combination of intersecting beams, pipes or edges. + If nothing is passed as argument, the function attempts to take the + first two edges selected in the view. propList is one optional list with 5 elements: DN (string): nominal diameter OD (float): outside diameter thk (float): shell thickness - BA (float): bend angle + BA (float): bend angle - that will be recalculated! - BR (float): bend radius - Default is "DN50" - pos (vector): position of insertion; default = 0,0,0 - Z (vector): orientation: default = 0,0,1 - Remember: property PRating must be defined afterwards - ''' - if pos==None: - pos=FreeCAD.Vector(0,0,0) - if Z==None: - Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Elbow")) - if len(propList)==5: - pFeatures.Elbow(a,*propList) - else: - pFeatures.Elbow(a) - a.ViewObject.Proxy=0 - a.Placement.Base=pos - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),Z) - #rot=FreeCAD.Rotation(FreeCAD.Vector(0,-1,0),Z) - a.Placement.Rotation=rot.multiply(a.Placement.Rotation) - return a - -def makeElbowBetweenThings(thing1=None, thing2=None, propList=None): - ''' - makeElbowBetweenThings(thing1, thing2, propList=None): - Place one elbow at the intersection of thing1 and thing2. - Things can be any combination of intersecting beams, pipes or edges. - If nothing is passed as argument, the function attempts to take the - first two edges selected in the view. - propList is one optional list with 5 elements: - DN (string): nominal diameter - OD (float): outside diameter - thk (float): shell thickness - BA (float): bend angle - that will be recalculated! - - BR (float): bend radius - Default is "DN50 (SCH-STD)" - Remember: property PRating must be defined afterwards - ''' - if not (thing1 and thing2): - thing1,thing2=fCmd.edges()[:2] - P=fCmd.intersectionCLines(thing1,thing2) - directions=list() - try: - for thing in [thing1,thing2]: - if fCmd.beams([thing]): - directions.append(rounded((fCmd.beamAx(thing).multiply(thing.Height/2)+thing.Placement.Base)-P)) - elif hasattr(thing,'ShapeType') and thing.ShapeType=='Edge': - directions.append(rounded(thing.CenterOfMass-P)) - except: - return None - ang=180-degrees(directions[0].getAngle(directions[1])) - if ang==0 or ang==180: return None - if not propList: - propList=["DN50",60.3,3.91,ang,45.24] - else: - propList[3]=ang - elb=makeElbow(propList,P,directions[0].negative().cross(directions[1].negative())) - # mate the elbow ends with the pipes or edges - b=fCmd.bisect(directions[0],directions[1]) - elbBisect=rounded(fCmd.beamAx(elb,FreeCAD.Vector(1,1,0))) #if not rounded, fail in plane xz - rot=FreeCAD.Rotation(elbBisect,b) - elb.Placement.Rotation=rot.multiply(elb.Placement.Rotation) - # trim the adjacent tubes - #FreeCAD.activeDocument().recompute() # may delete this row? - portA=elb.Placement.multVec(elb.Ports[0]) - portB=elb.Placement.multVec(elb.Ports[1]) - for tube in [t for t in [thing1,thing2] if fCmd.beams([t])]: - vectA=tube.Shape.Solids[0].CenterOfMass-portA - vectB=tube.Shape.Solids[0].CenterOfMass-portB - if fCmd.isParallel(vectA,fCmd.beamAx(tube)): - fCmd.extendTheBeam(tube,portA) + Default is "DN50 (SCH-STD)" + Remember: property PRating must be defined afterwards + """ + if not (thing1 and thing2): + thing1, thing2 = fCmd.edges()[:2] + P = fCmd.intersectionCLines(thing1, thing2) + directions = list() + try: + for thing in [thing1, thing2]: + if fCmd.beams([thing]): + directions.append( + rounded( + ( + fCmd.beamAx(thing).multiply(thing.Height / 2) + + thing.Placement.Base + ) + - P + ) + ) + elif hasattr(thing, "ShapeType") and thing.ShapeType == "Edge": + directions.append(rounded(thing.CenterOfMass - P)) + except: + return None + ang = 180 - degrees(directions[0].getAngle(directions[1])) + if ang == 0 or ang == 180: + return None + if not propList: + propList = ["DN50", 60.3, 3.91, ang, 45.24] else: - fCmd.extendTheBeam(tube,portB) - return elb + propList[3] = ang + elb = makeElbow( + propList, P, directions[0].negative().cross(directions[1].negative()) + ) + # mate the elbow ends with the pipes or edges + b = fCmd.bisect(directions[0], directions[1]) + elbBisect = rounded( + fCmd.beamAx(elb, FreeCAD.Vector(1, 1, 0)) + ) # if not rounded, fail in plane xz + rot = FreeCAD.Rotation(elbBisect, b) + elb.Placement.Rotation = rot.multiply(elb.Placement.Rotation) + # trim the adjacent tubes + # FreeCAD.activeDocument().recompute() # may delete this row? + portA = elb.Placement.multVec(elb.Ports[0]) + portB = elb.Placement.multVec(elb.Ports[1]) + for tube in [t for t in [thing1, thing2] if fCmd.beams([t])]: + vectA = tube.Shape.Solids[0].CenterOfMass - portA + vectB = tube.Shape.Solids[0].CenterOfMass - portB + if fCmd.isParallel(vectA, fCmd.beamAx(tube)): + fCmd.extendTheBeam(tube, portA) + else: + fCmd.extendTheBeam(tube, portB) + return elb + -def doElbow(propList=['DN50',60.3,3,90,45.225], pypeline=None): - ''' +def doElbow(propList=["DN50", 60.3, 3, 90, 45.225], pypeline=None): + """ propList = [ DN (string): nominal diameter OD (float): outside diameter @@ -283,102 +339,122 @@ def doElbow(propList=['DN50',60.3,3,90,45.225], pypeline=None): BA (float): bend angle BR (float): bend radius ] pypeline = string - ''' - elist=[] - FreeCAD.activeDocument().openTransaction('Insert elbow') - selex=FreeCADGui.Selection.getSelectionEx() - if len(selex)==0: # no selection -> insert one elbow at origin - elist.append(makeElbow(propList)) - elif len(selex)==1 and len(selex[0].SubObjects)==1: #one selection -> ... - if selex[0].SubObjects[0].ShapeType=="Vertex": # ...on vertex - elist.append(makeElbow(propList,selex[0].SubObjects[0].Point)) - elif selex[0].SubObjects[0].ShapeType=="Edge" and selex[0].SubObjects[0].curvatureAt(0)!=0: # ...on center of curved edge - P=selex[0].SubObjects[0].centerOfCurvatureAt(0) - N=selex[0].SubObjects[0].normalAt(0).cross(selex[0].SubObjects[0].tangentAt(0)).normalize() - elb=makeElbow(propList,P) - if isPipe(selex[0].Object): #..on the edge of a pipe - ax=selex[0].Object.Shape.Solids[0].CenterOfMass-P - rot=FreeCAD.Rotation(elb.Ports[0],ax) - elb.Placement.Rotation=rot.multiply(elb.Placement.Rotation) - Port0=getElbowPort(elb) - elb.Placement.move(P-Port0) - elif isElbow(selex[0].Object): #..on the edge of an elbow - p0,p1=[selex[0].Object.Placement.Rotation.multVec(p) for p in selex[0].Object.Ports] - if fCmd.isParallel(p0,N): - elb.Placement.Rotation=FreeCAD.Rotation(elb.Ports[0],p0*-1) - else: - elb.Placement.Rotation=FreeCAD.Rotation(elb.Ports[0],p1*-1) - delta=getElbowPort(elb) - elb.Placement.move(P-delta) - else: #..on any other curved edge - print('hello') - rot=FreeCAD.Rotation(elb.Ports[0],N) - elb.Placement.Rotation=rot.multiply(elb.Placement.Rotation) - # elb.Placement.move(elb.Placement.Rotation.multVec(elb.Ports[0])*-1) - v=portsDir(elb)[0].negative()*elb.Ports[0].Length - elb.Placement.move(v) - elist.append(elb) - FreeCAD.activeDocument().recompute() - else: # multiple selection -> insert one elbow at intersection of two edges or beams or pipes ## - things=[] - for objEx in selex: - if len(fCmd.beams([objEx.Object]))==1: # if the object is a beam or pipe, append it to the "things".. - things.append(objEx.Object) - else: # ..else append its edges - for edge in fCmd.edges([objEx]): - things.append(edge) - if len(things)>=2: - break - try: #create the feature - elb=elist.append(makeElbowBetweenThings(*things[:2],propList=propList)) - except: - FreeCAD.Console.PrintError('Creation of elbow is failed\n') - if pypeline: - for e in elist: - moveToPyLi(e,pypeline) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - return elist + """ + elist = [] + FreeCAD.activeDocument().openTransaction("Insert elbow") + selex = FreeCADGui.Selection.getSelectionEx() + if len(selex) == 0: # no selection -> insert one elbow at origin + elist.append(makeElbow(propList)) + elif len(selex) == 1 and len(selex[0].SubObjects) == 1: # one selection -> ... + if selex[0].SubObjects[0].ShapeType == "Vertex": # ...on vertex + elist.append(makeElbow(propList, selex[0].SubObjects[0].Point)) + elif ( + selex[0].SubObjects[0].ShapeType == "Edge" + and selex[0].SubObjects[0].curvatureAt(0) != 0 + ): # ...on center of curved edge + P = selex[0].SubObjects[0].centerOfCurvatureAt(0) + N = ( + selex[0] + .SubObjects[0] + .normalAt(0) + .cross(selex[0].SubObjects[0].tangentAt(0)) + .normalize() + ) + elb = makeElbow(propList, P) + if isPipe(selex[0].Object): # ..on the edge of a pipe + ax = selex[0].Object.Shape.Solids[0].CenterOfMass - P + rot = FreeCAD.Rotation(elb.Ports[0], ax) + elb.Placement.Rotation = rot.multiply(elb.Placement.Rotation) + Port0 = getElbowPort(elb) + elb.Placement.move(P - Port0) + elif isElbow(selex[0].Object): # ..on the edge of an elbow + p0, p1 = [ + selex[0].Object.Placement.Rotation.multVec(p) + for p in selex[0].Object.Ports + ] + if fCmd.isParallel(p0, N): + elb.Placement.Rotation = FreeCAD.Rotation(elb.Ports[0], p0 * -1) + else: + elb.Placement.Rotation = FreeCAD.Rotation(elb.Ports[0], p1 * -1) + delta = getElbowPort(elb) + elb.Placement.move(P - delta) + else: # ..on any other curved edge + print("hello") + rot = FreeCAD.Rotation(elb.Ports[0], N) + elb.Placement.Rotation = rot.multiply(elb.Placement.Rotation) + # elb.Placement.move(elb.Placement.Rotation.multVec(elb.Ports[0])*-1) + v = portsDir(elb)[0].negative() * elb.Ports[0].Length + elb.Placement.move(v) + elist.append(elb) + FreeCAD.activeDocument().recompute() + else: # multiple selection -> insert one elbow at intersection of two edges or beams or pipes ## + things = [] + for objEx in selex: + if ( + len(fCmd.beams([objEx.Object])) == 1 + ): # if the object is a beam or pipe, append it to the "things".. + things.append(objEx.Object) + else: # ..else append its edges + for edge in fCmd.edges([objEx]): + things.append(edge) + if len(things) >= 2: + break + try: # create the feature + elb = elist.append(makeElbowBetweenThings(*things[:2], propList=propList)) + except: + FreeCAD.Console.PrintError("Creation of elbow is failed\n") + if pypeline: + for e in elist: + moveToPyLi(e, pypeline) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + return elist + def makeFlange(propList=[], pos=None, Z=None): - '''Adds a Flange object - makeFlange(propList,pos,Z); - propList is one optional list with 8 elements: - DN (string): nominal diameter - FlangeType (string): type of Flange - D (float): flange diameter - d (float): bore diameter - df (float): bolts holes distance - f (float): bolts holes diameter - t (float): flange thickness - n (int): nr. of bolts - trf (float): raised-face thikness - OPTIONAL - - drf (float): raised-face diameter - OPTIONAL - - twn (float): welding-neck thikness - OPTIONAL - - dwn (float): welding-neck diameter - OPTIONAL - - ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - - Default is "DN50 (PN16)" - pos (vector): position of insertion; default = 0,0,0 - Z (vector): orientation: default = 0,0,1 - Remember: property PRating must be defined afterwards - ''' - if pos==None: - pos=FreeCAD.Vector(0,0,0) - if Z==None: - Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Flange")) - if len(propList)>=8: - pFeatures.Flange(a,*propList) - else: - pFeatures.Flange(a) - a.ViewObject.Proxy=0 - a.Placement.Base=pos - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),Z) - a.Placement.Rotation=rot.multiply(a.Placement.Rotation) - return a - -def doFlanges(propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0], pypeline=None): - ''' + """Adds a Flange object + makeFlange(propList,pos,Z); + propList is one optional list with 8 elements: + DN (string): nominal diameter + FlangeType (string): type of Flange + D (float): flange diameter + d (float): bore diameter + df (float): bolts holes distance + f (float): bolts holes diameter + t (float): flange thickness + n (int): nr. of bolts + trf (float): raised-face thikness - OPTIONAL - + drf (float): raised-face diameter - OPTIONAL - + twn (float): welding-neck thikness - OPTIONAL - + dwn (float): welding-neck diameter - OPTIONAL - + ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - + Default is "DN50 (PN16)" + pos (vector): position of insertion; default = 0,0,0 + Z (vector): orientation: default = 0,0,1 + Remember: property PRating must be defined afterwards + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject( + "Part::FeaturePython", translate("Part::FeaturePython", "Flange") + ) + if len(propList) >= 8: + pFeatures.Flange(a, *propList) + else: + pFeatures.Flange(a) + a.ViewObject.Proxy = 0 + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + return a + + +def doFlanges( + propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0], pypeline=None +): + """ propList = [ DN (string): nominal diameter FlangeType (string): type of Flange @@ -394,663 +470,799 @@ def doFlanges(propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0], dwn (float): welding-neck diameter - OPTIONAL - ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - pypeline = string - ''' - flist=[] - tubes=[t for t in fCmd.beams() if hasattr(t,'PSize')] - FreeCAD.activeDocument().openTransaction('Insert flange') - if len(fCmd.edges())==0: - vs=[v for sx in FreeCADGui.Selection.getSelectionEx() for so in sx.SubObjects for v in so.Vertexes] - if len(vs)==0: - flist.append(makeFlange(propList)) + """ + flist = [] + tubes = [t for t in fCmd.beams() if hasattr(t, "PSize")] + FreeCAD.activeDocument().openTransaction("Insert flange") + if len(fCmd.edges()) == 0: + vs = [ + v + for sx in FreeCADGui.Selection.getSelectionEx() + for so in sx.SubObjects + for v in so.Vertexes + ] + if len(vs) == 0: + flist.append(makeFlange(propList)) + else: + for v in vs: + flist.append(makeFlange(propList, v.Point)) + elif tubes: + selex = FreeCADGui.Selection.getSelectionEx() + for sx in selex: + if isPipe(sx.Object) and fCmd.edges([sx]): + for edge in fCmd.edges([sx]): + if edge.curvatureAt(0) != 0: + flist.append( + makeFlange( + propList, + edge.centerOfCurvatureAt(0), + sx.Object.Shape.Solids[0].CenterOfMass + - edge.centerOfCurvatureAt(0), + ) + ) else: - for v in vs: - flist.append(makeFlange(propList,v.Point)) - elif tubes: - selex=FreeCADGui.Selection.getSelectionEx() - for sx in selex: - if isPipe(sx.Object) and fCmd.edges([sx]): - for edge in fCmd.edges([sx]): - if edge.curvatureAt(0)!=0: - flist.append(makeFlange(propList,edge.centerOfCurvatureAt(0),sx.Object.Shape.Solids[0].CenterOfMass-edge.centerOfCurvatureAt(0))) - else: - for edge in fCmd.edges(): - if edge.curvatureAt(0)!=0: - flist.append(makeFlange(propList,edge.centerOfCurvatureAt(0),edge.tangentAt(0).cross(edge.normalAt(0)))) - if pypeline: - for f in flist: - moveToPyLi(f,pypeline) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - return flist + for edge in fCmd.edges(): + if edge.curvatureAt(0) != 0: + flist.append( + makeFlange( + propList, + edge.centerOfCurvatureAt(0), + edge.tangentAt(0).cross(edge.normalAt(0)), + ) + ) + if pypeline: + for f in flist: + moveToPyLi(f, pypeline) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + return flist + def makeReduct(propList=[], pos=None, Z=None, conc=True): - '''Adds a Reduct object - makeReduct(propList=[], pos=None, Z=None, conc=True) - propList is one optional list with 6 elements: - PSize (string): nominal diameter - OD (float): major diameter - OD2 (float): minor diameter - thk (float): major thickness - thk2 (float): minor thickness - H (float): length of reduction - pos (vector): position of insertion; default = 0,0,0 - Z (vector): orientation: default = 0,0,1 - conc (bool): True for concentric or Flase for eccentric reduction - Remember: property PRating must be defined afterwards - ''' - if pos==None: - pos=FreeCAD.Vector(0,0,0) - if Z==None: - Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Reduction")) - propList.append(conc) - pFeatures.Reduct(a,*propList) - a.ViewObject.Proxy=0 - a.Placement.Base=pos - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),Z) - a.Placement.Rotation=rot.multiply(a.Placement.Rotation) - return a + """Adds a Reduct object + makeReduct(propList=[], pos=None, Z=None, conc=True) + propList is one optional list with 6 elements: + PSize (string): nominal diameter + OD (float): major diameter + OD2 (float): minor diameter + thk (float): major thickness + thk2 (float): minor thickness + H (float): length of reduction + pos (vector): position of insertion; default = 0,0,0 + Z (vector): orientation: default = 0,0,1 + conc (bool): True for concentric or Flase for eccentric reduction + Remember: property PRating must be defined afterwards + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject( + "Part::FeaturePython", translate("Part::FeaturePython", "Reduction") + ) + propList.append(conc) + pFeatures.Reduct(a, *propList) + a.ViewObject.Proxy = 0 + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + return a + def makeUbolt(propList=[], pos=None, Z=None): - '''Adds a Ubolt object: - makeUbolt(propList,pos,Z); - propList is one optional list with 5 elements: - PSize (string): nominal diameter - ClampType (string): the clamp type or standard - C (float): the diameter of the U-bolt - H (float): the total height of the U-bolt - d (float): the rod diameter + """Adds a Ubolt object: + makeUbolt(propList,pos,Z); + propList is one optional list with 5 elements: + PSize (string): nominal diameter + ClampType (string): the clamp type or standard + C (float): the diameter of the U-bolt + H (float): the total height of the U-bolt + d (float): the rod diameter + pos (vector): position of insertion; default = 0,0,0 + Z (vector): orientation: default = 0,0,1 + Remember: property PRating must be defined afterwards + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject( + "Part::FeaturePython", translate("Part::FeaturePython", "U-Bolt") + ) + if len(propList) == 5: + pFeatures.Ubolt(a, *propList) + else: + pFeatures.Ubolt(a) + a.ViewObject.Proxy = 0 + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + return a + + +def makeShell(L=1000, W=1500, H=1500, thk1=6, thk2=8): + """ + makeShell(L,W,H,thk1,thk2) + Adds the shell of a tank, given + L(ength): default=800 + W(idth): default=400 + H(eight): default=500 + thk (thickness): default=6 + """ + a = FreeCAD.ActiveDocument.addObject( + "Part::FeaturePython", translate("Part::FeaturePython", "Tank") + ) + pFeatures.Shell(a, L, W, H, thk1, thk2) + a.ViewObject.Proxy = 0 + a.Placement.Base = FreeCAD.Vector(0, 0, 0) + a.ViewObject.ShapeColor = 0.0, 0.0, 1.0 + a.ViewObject.Transparency = 85 + FreeCAD.ActiveDocument.recompute() + return a + + +def makeCap(propList=[], pos=None, Z=None): + """add a Cap object + makeCap(propList,pos,Z); + propList is one optional list with 4 elements: + DN (string): nominal diameter + OD (float): outside diameter + thk (float): shell thickness + Default is "DN50 (SCH-STD)" pos (vector): position of insertion; default = 0,0,0 Z (vector): orientation: default = 0,0,1 - Remember: property PRating must be defined afterwards - ''' - if pos==None: - pos=FreeCAD.Vector(0,0,0) - if Z==None: - Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","U-Bolt")) - if len(propList)==5: - pFeatures.Ubolt(a,*propList) - else: - pFeatures.Ubolt(a) - a.ViewObject.Proxy=0 - a.Placement.Base=pos - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),Z) - a.Placement.Rotation=rot.multiply(a.Placement.Rotation) - return a - -def makeShell(L=1000,W=1500,H=1500,thk1=6,thk2=8): - ''' - makeShell(L,W,H,thk1,thk2) - Adds the shell of a tank, given - L(ength): default=800 - W(idth): default=400 - H(eight): default=500 - thk (thickness): default=6 - ''' - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Tank")) - pFeatures.Shell(a,L,W,H,thk1,thk2) - a.ViewObject.Proxy=0 - a.Placement.Base=FreeCAD.Vector(0,0,0) - a.ViewObject.ShapeColor=0.0,0.0,1.0 - a.ViewObject.Transparency=85 - FreeCAD.ActiveDocument.recompute() - return a + Remember: property PRating must be defined afterwards + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject( + "Part::FeaturePython", translate("Part::FeaturePython", "Cap") + ) + if len(propList) == 3: + pFeatures.Cap(a, *propList) + else: + pFeatures.Cap(a) + a.ViewObject.Proxy = 0 + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + return a -def makeCap(propList=[], pos=None, Z=None): - '''add a Cap object - makeCap(propList,pos,Z); - propList is one optional list with 4 elements: - DN (string): nominal diameter - OD (float): outside diameter - thk (float): shell thickness - Default is "DN50 (SCH-STD)" - pos (vector): position of insertion; default = 0,0,0 - Z (vector): orientation: default = 0,0,1 - Remember: property PRating must be defined afterwards - ''' - if pos==None: - pos=FreeCAD.Vector(0,0,0) - if Z==None: - Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Cap")) - if len(propList)==3: - pFeatures.Cap(a,*propList) - else: - pFeatures.Cap(a) - a.ViewObject.Proxy=0 - a.Placement.Base=pos - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),Z) - a.Placement.Rotation=rot.multiply(a.Placement.Rotation) - return a - -def doCaps(propList=['DN50',60.3,3], pypeline=None): - ''' + +def doCaps(propList=["DN50", 60.3, 3], pypeline=None): + """ propList = [ DN (string): nominal diameter OD (float): outside diameter thk (float): shell thickness ] pypeline = string - ''' - clist=[] - FreeCAD.activeDocument().openTransaction('Insert cap') - if len(fCmd.edges())==0: - vs=[v for sx in FreeCADGui.Selection.getSelectionEx() for so in sx.SubObjects for v in so.Vertexes] - if len(vs)==0: # nothing is selected - clist.append(makeCap(propList)) + """ + clist = [] + FreeCAD.activeDocument().openTransaction("Insert cap") + if len(fCmd.edges()) == 0: + vs = [ + v + for sx in FreeCADGui.Selection.getSelectionEx() + for so in sx.SubObjects + for v in so.Vertexes + ] + if len(vs) == 0: # nothing is selected + clist.append(makeCap(propList)) + else: + for v in vs: # vertexes are selected + clist.append(makeCap(propList, v.Point)) else: - for v in vs: # vertexes are selected - clist.append(makeCap(propList,v.Point)) - else: - for edge in fCmd.edges(): - if edge.curvatureAt(0)!=0: # curved edges are selected... - objs=[o for o in FreeCADGui.Selection.getSelection() if hasattr(o,'PSize') and hasattr(o,'OD') and hasattr(o,'thk')] - Z=None - if len(objs)>0: # ...pype objects are selected - Z=edge.centerOfCurvatureAt(0)-objs[0].Shape.Solids[0].CenterOfMass - else: # ...no pype objects are selected - Z=edge.tangentAt(0).cross(edge.normalAt(0)) - clist.append(makeCap(propList,edge.centerOfCurvatureAt(0),Z)) - if pypeline: - for c in clist: - moveToPyLi(c,pypeline) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() + for edge in fCmd.edges(): + if edge.curvatureAt(0) != 0: # curved edges are selected... + objs = [ + o + for o in FreeCADGui.Selection.getSelection() + if hasattr(o, "PSize") and hasattr(o, "OD") and hasattr(o, "thk") + ] + Z = None + if len(objs) > 0: # ...pype objects are selected + Z = ( + edge.centerOfCurvatureAt(0) + - objs[0].Shape.Solids[0].CenterOfMass + ) + else: # ...no pype objects are selected + Z = edge.tangentAt(0).cross(edge.normalAt(0)) + clist.append(makeCap(propList, edge.centerOfCurvatureAt(0), Z)) + if pypeline: + for c in clist: + moveToPyLi(c, pypeline) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + def makeW(): - edges=fCmd.edges() - if len(edges)>1: - first=edges[0] - last=edges[-1] - points=list() - while len(edges)>1: points.append(fCmd.intersectionCLines(edges.pop(0),edges[0])) - delta1=(first.valueAt(0)-points[0]).Length - delta2=(first.valueAt(first.LastParameter)-points[0]).Length - if delta1>delta2: - points.insert(0,first.valueAt(0)) + edges = fCmd.edges() + if len(edges) > 1: + first = edges[0] + last = edges[-1] + points = list() + while len(edges) > 1: + points.append(fCmd.intersectionCLines(edges.pop(0), edges[0])) + delta1 = (first.valueAt(0) - points[0]).Length + delta2 = (first.valueAt(first.LastParameter) - points[0]).Length + if delta1 > delta2: + points.insert(0, first.valueAt(0)) + else: + points.insert(0, first.valueAt(first.LastParameter)) + delta1 = (last.valueAt(0) - points[0]).Length + delta2 = (last.valueAt(last.LastParameter) - points[0]).Length + if delta1 > delta2: + points.append(last.valueAt(0)) + else: + points.append(last.valueAt(last.LastParameter)) + from Draft import makeWire + + try: + p = makeWire(points) + except: + FreeCAD.Console.PrintError("Missing intersection\n") + return None + p.Label = "Path" + drawAsCenterLine(p) + return p + elif FreeCADGui.Selection.getSelection(): + obj = FreeCADGui.Selection.getSelection()[0] + if hasattr(obj, "Shape") and type(obj.Shape) == Part.Wire: + drawAsCenterLine(obj) + return obj else: - points.insert(0,first.valueAt(first.LastParameter)) - delta1=(last.valueAt(0)-points[0]).Length - delta2=(last.valueAt(last.LastParameter)-points[0]).Length - if delta1>delta2: - points.append(last.valueAt(0)) + return None + + +def makePypeLine2( + DN="DN50", + PRating="SCH-STD", + OD=60.3, + thk=3, + BR=None, + lab="Tubatura", + pl=None, + color=(0.8, 0.8, 0.8), +): + """ + makePypeLine2(DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None, lab="Tubatura",pl=None, color=(0.8,0.8,0.8)) + Adds a PypeLine2 object creating pipes over the selected edges. + Default tube is "DN50", "SCH-STD" + Bending Radius is set to 0.75*OD. + """ + if not BR: + BR = 0.75 * OD + # create the pypeLine group + if not pl: + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", lab) + pFeatures.PypeLine2(a, DN, PRating, OD, thk, BR, lab) + pFeatures.ViewProviderPypeLine(a.ViewObject) # a.ViewObject.Proxy=0 + a.ViewObject.ShapeColor = color + if len(FreeCADGui.Selection.getSelection()) == 1: + obj = FreeCADGui.Selection.getSelection()[0] + isWire = ( + hasattr(obj, "Shape") and obj.Shape.Edges + ) # type(obj.Shape)==Part.Wire + isSketch = hasattr(obj, "TypeId") and obj.TypeId == "Sketcher::SketchObject" + if isWire or isSketch: + a.Base = obj + a.Proxy.update(a) + if isWire: + drawAsCenterLine(obj) + elif fCmd.edges(): + path = makeW() + a.Base = path + a.Proxy.update(a) else: - points.append(last.valueAt(last.LastParameter)) - from Draft import makeWire - try: - p=makeWire(points) - except: - FreeCAD.Console.PrintError('Missing intersection\n') - return None - p.Label='Path' - drawAsCenterLine(p) - return p - elif FreeCADGui.Selection.getSelection(): - obj=FreeCADGui.Selection.getSelection()[0] - if hasattr(obj,'Shape') and type(obj.Shape)==Part.Wire: - drawAsCenterLine(obj) - return obj - else: - return None - -def makePypeLine2(DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None, lab="Tubatura", pl=None, color=(0.8,0.8,0.8)): - ''' - makePypeLine2(DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None, lab="Tubatura",pl=None, color=(0.8,0.8,0.8)) - Adds a PypeLine2 object creating pipes over the selected edges. - Default tube is "DN50", "SCH-STD" - Bending Radius is set to 0.75*OD. - ''' - if not BR: - BR=0.75*OD - # create the pypeLine group - if not pl: - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",lab) - pFeatures.PypeLine2(a,DN,PRating,OD,thk,BR, lab) - pFeatures.ViewProviderPypeLine(a.ViewObject) # a.ViewObject.Proxy=0 - a.ViewObject.ShapeColor=color - if len(FreeCADGui.Selection.getSelection())==1: - obj=FreeCADGui.Selection.getSelection()[0] - isWire=hasattr(obj,'Shape') and obj.Shape.Edges #type(obj.Shape)==Part.Wire - isSketch=hasattr(obj,'TypeId') and obj.TypeId=='Sketcher::SketchObject' - if isWire or isSketch: - a.Base=obj - a.Proxy.update(a) - if isWire: - drawAsCenterLine(obj) - elif fCmd.edges(): - path=makeW() - a.Base=path - a.Proxy.update(a) - else: - a=FreeCAD.ActiveDocument.getObjectsByLabel(pl)[0] - group=FreeCAD.ActiveDocument.getObjectsByLabel(a.Group)[0] - a.Proxy.update(a,fCmd.edges()) - FreeCAD.Console.PrintWarning("Objects added to pypeline's group "+a.Group+"\n") - return a - -def makeBranch(base=None, DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None, lab="Traccia", color=(0.8,0.8,0.8)): - ''' - makeBranch(base=None, DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None, lab="Traccia" color=(0.8,0.8,0.8)) - Draft function for PypeBranch. - ''' - if not BR: - BR=0.75*OD - if not base: - if FreeCADGui.Selection.getSelection(): - obj=FreeCADGui.Selection.getSelection()[0] - isWire=hasattr(obj,'Shape') and type(obj.Shape)==Part.Wire - isSketch=hasattr(obj,'TypeId') and obj.TypeId=='Sketcher::SketchObject' - if isWire or isSketch: - base=obj - if isWire: - drawAsCenterLine(obj) - elif fCmd.edges(): - base=makeW() - if base: - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",lab) - pFeatures.PypeBranch2(a,base,DN,PRating,OD,thk,BR) - pFeatures.ViewProviderPypeBranch(a.ViewObject) + a = FreeCAD.ActiveDocument.getObjectsByLabel(pl)[0] + group = FreeCAD.ActiveDocument.getObjectsByLabel(a.Group)[0] + a.Proxy.update(a, fCmd.edges()) + FreeCAD.Console.PrintWarning( + "Objects added to pypeline's group " + a.Group + "\n" + ) return a - else: - FreeCAD.Console.PrintError('Select a valid path.\n') + + +def makeBranch( + base=None, + DN="DN50", + PRating="SCH-STD", + OD=60.3, + thk=3, + BR=None, + lab="Traccia", + color=(0.8, 0.8, 0.8), +): + """ + makeBranch(base=None, DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None, lab="Traccia" color=(0.8,0.8,0.8)) + Draft function for PypeBranch. + """ + if not BR: + BR = 0.75 * OD + if not base: + if FreeCADGui.Selection.getSelection(): + obj = FreeCADGui.Selection.getSelection()[0] + isWire = hasattr(obj, "Shape") and type(obj.Shape) == Part.Wire + isSketch = hasattr(obj, "TypeId") and obj.TypeId == "Sketcher::SketchObject" + if isWire or isSketch: + base = obj + if isWire: + drawAsCenterLine(obj) + elif fCmd.edges(): + base = makeW() + if base: + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", lab) + pFeatures.PypeBranch2(a, base, DN, PRating, OD, thk, BR) + pFeatures.ViewProviderPypeBranch(a.ViewObject) + return a + else: + FreeCAD.Console.PrintError("Select a valid path.\n") + def updatePLColor(sel=None, color=None): - if not sel: - sel=FreeCADGui.Selection.getSelection() - if sel: - pl=sel[0] - if hasattr(pl,'PType') and pl.PType=='PypeLine': - if not color: - color=pl.ViewObject.ShapeColor - group=FreeCAD.activeDocument().getObjectsByLabel(pl.Group)[0] - for o in group.OutList: - if hasattr(o,'PType'): - if o.PType in objToPaint: - o.ViewObject.ShapeColor=color - elif o.PType == 'PypeBranch': - for e in [FreeCAD.ActiveDocument.getObject(name) for name in o.Tubes+o.Curves]: - e.ViewObject.ShapeColor=color - else: - FreeCAD.Console.PrintError('Select first one pype line\n') + if not sel: + sel = FreeCADGui.Selection.getSelection() + if sel: + pl = sel[0] + if hasattr(pl, "PType") and pl.PType == "PypeLine": + if not color: + color = pl.ViewObject.ShapeColor + group = FreeCAD.activeDocument().getObjectsByLabel(pl.Group)[0] + for o in group.OutList: + if hasattr(o, "PType"): + if o.PType in objToPaint: + o.ViewObject.ShapeColor = color + elif o.PType == "PypeBranch": + for e in [ + FreeCAD.ActiveDocument.getObject(name) + for name in o.Tubes + o.Curves + ]: + e.ViewObject.ShapeColor = color + else: + FreeCAD.Console.PrintError("Select first one pype line\n") + def alignTheTube(): - ''' - Mates the selected 2 circular edges - of 2 separate objects. - ''' - try: - t1=FreeCADGui.Selection.getSelection()[0] - t2=FreeCADGui.Selection.getSelection()[-1] - except: - FreeCAD.Console.PrintError("Select at least one object.\n") - return None - d1,d2=fCmd.edges()[:2] - if d1.curvatureAt(0)!=0 and d2.curvatureAt(0)!=0: - n1=d1.tangentAt(0).cross(d1.normalAt(0)) - n2=d2.tangentAt(0).cross(d2.normalAt(0)) - else: - FreeCAD.Console.PrintError("Select 2 curved edges.\n") - return None - rot=FreeCAD.Rotation(n2,n1) - t2.Placement.Rotation=rot.multiply(t2.Placement.Rotation) - #traslazione centri di curvatura - d1,d2=fCmd.edges() #redo selection to get new positions - dist=d1.centerOfCurvatureAt(0)-d2.centerOfCurvatureAt(0) - t2.Placement.move(dist) - #verifica posizione relativa - try: - com1,com2=[t.Shape.Solids[0].CenterOfMass for t in [t1,t2]] - if isElbow(t2): - pass - elif (com1-d1.centerOfCurvatureAt(0)).dot(com2-d1.centerOfCurvatureAt(0))>0: - reverseTheTube(FreeCADGui.Selection.getSelectionEx()[:2][1]) - except: - pass - #TARGET [solved]: verify if t1 or t2 belong to App::Part and changes the Placement consequently - if fCmd.isPartOfPart(t1): - part=fCmd.isPartOfPart(t1) - t2.Placement=part.Placement.multiply(t2.Placement) - if fCmd.isPartOfPart(t2): - part=fCmd.isPartOfPart(t2) - t2.Placement=part.Placement.inverse().multiply(t2.Placement) - -def rotateTheTubeAx(obj=None,vShapeRef=None, angle=45): - ''' - rotateTheTubeAx(obj=None,vShapeRef=None,angle=45) - Rotates obj around the vShapeRef axis of its Shape by an angle. - obj: if not defined, the first in the selection set - vShapeRef: if not defined, the Z axis of the Shape - angle: default=45 deg - ''' - if obj==None: - obj=FreeCADGui.Selection.getSelection()[0] - if vShapeRef==None: - vShapeRef=FreeCAD.Vector(0,0,1) - rot=FreeCAD.Rotation(fCmd.beamAx(obj,vShapeRef),angle) - obj.Placement.Rotation=rot.multiply(obj.Placement.Rotation) + """ + Mates the selected 2 circular edges + of 2 separate objects. + """ + try: + t1 = FreeCADGui.Selection.getSelection()[0] + t2 = FreeCADGui.Selection.getSelection()[-1] + except: + FreeCAD.Console.PrintError("Select at least one object.\n") + return None + d1, d2 = fCmd.edges()[:2] + if d1.curvatureAt(0) != 0 and d2.curvatureAt(0) != 0: + n1 = d1.tangentAt(0).cross(d1.normalAt(0)) + n2 = d2.tangentAt(0).cross(d2.normalAt(0)) + else: + FreeCAD.Console.PrintError("Select 2 curved edges.\n") + return None + rot = FreeCAD.Rotation(n2, n1) + t2.Placement.Rotation = rot.multiply(t2.Placement.Rotation) + # traslazione centri di curvatura + d1, d2 = fCmd.edges() # redo selection to get new positions + dist = d1.centerOfCurvatureAt(0) - d2.centerOfCurvatureAt(0) + t2.Placement.move(dist) + # verifica posizione relativa + try: + com1, com2 = [t.Shape.Solids[0].CenterOfMass for t in [t1, t2]] + if isElbow(t2): + pass + elif (com1 - d1.centerOfCurvatureAt(0)).dot( + com2 - d1.centerOfCurvatureAt(0) + ) > 0: + reverseTheTube(FreeCADGui.Selection.getSelectionEx()[:2][1]) + except: + pass + # TARGET [solved]: verify if t1 or t2 belong to App::Part and changes the Placement consequently + if fCmd.isPartOfPart(t1): + part = fCmd.isPartOfPart(t1) + t2.Placement = part.Placement.multiply(t2.Placement) + if fCmd.isPartOfPart(t2): + part = fCmd.isPartOfPart(t2) + t2.Placement = part.Placement.inverse().multiply(t2.Placement) + + +def rotateTheTubeAx(obj=None, vShapeRef=None, angle=45): + """ + rotateTheTubeAx(obj=None,vShapeRef=None,angle=45) + Rotates obj around the vShapeRef axis of its Shape by an angle. + obj: if not defined, the first in the selection set + vShapeRef: if not defined, the Z axis of the Shape + angle: default=45 deg + """ + if obj == None: + obj = FreeCADGui.Selection.getSelection()[0] + if vShapeRef == None: + vShapeRef = FreeCAD.Vector(0, 0, 1) + rot = FreeCAD.Rotation(fCmd.beamAx(obj, vShapeRef), angle) + obj.Placement.Rotation = rot.multiply(obj.Placement.Rotation) + def reverseTheTube(objEx): - ''' - reverseTheTube(objEx) - Reverse the orientation of objEx spinning it 180 degrees around the x-axis - of its shape. - If an edge is selected, it's used as pivot. - ''' - disp=None - selectedEdges=[e for e in objEx.SubObjects if e.ShapeType=='Edge'] - if selectedEdges: - for edge in fCmd.edges([objEx]): - if edge.curvatureAt(0): - disp=edge.centerOfCurvatureAt(0)-objEx.Object.Placement.Base - break - elif fCmd.beams([objEx.Object]): - ax=fCmd.beamAx(objEx.Object) - disp=ax*((edge.CenterOfMass-objEx.Object.Placement.Base).dot(ax)) - rotateTheTubeAx(objEx.Object,FreeCAD.Vector(1,0,0),180) - if disp: - objEx.Object.Placement.move(disp*2) + """ + reverseTheTube(objEx) + Reverse the orientation of objEx spinning it 180 degrees around the x-axis + of its shape. + If an edge is selected, it's used as pivot. + """ + disp = None + selectedEdges = [e for e in objEx.SubObjects if e.ShapeType == "Edge"] + if selectedEdges: + for edge in fCmd.edges([objEx]): + if edge.curvatureAt(0): + disp = edge.centerOfCurvatureAt(0) - objEx.Object.Placement.Base + break + elif fCmd.beams([objEx.Object]): + ax = fCmd.beamAx(objEx.Object) + disp = ax * ((edge.CenterOfMass - objEx.Object.Placement.Base).dot(ax)) + rotateTheTubeAx(objEx.Object, FreeCAD.Vector(1, 0, 0), 180) + if disp: + objEx.Object.Placement.move(disp * 2) + def rotateTheTubeEdge(ang=45): - if len(fCmd.edges())>0 and fCmd.edges()[0].curvatureAt(0)!=0: - originalPos=fCmd.edges()[0].centerOfCurvatureAt(0) - obj=FreeCADGui.Selection.getSelection()[0] - rotateTheTubeAx(vShapeRef=shapeReferenceAxis(),angle=ang) - newPos=fCmd.edges()[0].centerOfCurvatureAt(0) - obj.Placement.move(originalPos-newPos) - -def placeTheElbow(c,v1=None,v2=None,P=None): - ''' - placeTheElbow(c,v1,v2,P=None) - Puts the curve C between vectors v1 and v2. - If point P is given, translates it in there. - NOTE: v1 and v2 oriented in the same direction along the path! - ''' - if not (v1 and v2): - v1,v2=[e.tangentAt(0) for e in fCmd.edges()] - try: - P=fCmd.intersectionCLines(*fCmd.edges()) - except: pass - if hasattr(c,'PType') and hasattr(c,'BendAngle') and v1 and v2: - v1.normalize() - v2.normalize() - ortho=rounded(fCmd.ortho(v1,v2)) - bisect=rounded(v2-v1) - ang=degrees(v1.getAngle(v2)) - c.BendAngle=ang - rot1=FreeCAD.Rotation(rounded(fCmd.beamAx(c,FreeCAD.Vector(0,0,1))),ortho) - c.Placement.Rotation=rot1.multiply(c.Placement.Rotation) - rot2=FreeCAD.Rotation(rounded(fCmd.beamAx(c,FreeCAD.Vector(1,1,0))),bisect) - c.Placement.Rotation=rot2.multiply(c.Placement.Rotation) - if not P: - P=c.Placement.Base - c.Placement.Base=P - -def placeoTherElbow(c,v1=None,v2=None,P=None): - ''' - Like placeTheElbow() but with more math. - ''' - if not (v1 and v2): - v1,v2=[e.tangentAt(0) for e in fCmd.edges()] - try: - P=fCmd.intersectionCLines(*fCmd.edges()) - except: pass - if hasattr(c,'PType') and hasattr(c,'BendAngle') and v1 and v2: - v1.normalize() - v2.normalize() - ortho=rounded(fCmd.ortho(v1,v2)) - bisect=rounded(v2-v1) - cBisect=rounded(c.Ports[1].normalize()+c.Ports[0].normalize()) # math - cZ=c.Ports[0].cross(c.Ports[1]) # more math - ang=degrees(v1.getAngle(v2)) - c.BendAngle=ang - rot1=FreeCAD.Rotation(rounded(fCmd.beamAx(c,cZ)),ortho) - c.Placement.Rotation=rot1.multiply(c.Placement.Rotation) - rot2=FreeCAD.Rotation(rounded(fCmd.beamAx(c,cBisect)),bisect) - c.Placement.Rotation=rot2.multiply(c.Placement.Rotation) - if not P: - P=c.Placement.Base - c.Placement.Base=P + if len(fCmd.edges()) > 0 and fCmd.edges()[0].curvatureAt(0) != 0: + originalPos = fCmd.edges()[0].centerOfCurvatureAt(0) + obj = FreeCADGui.Selection.getSelection()[0] + rotateTheTubeAx(vShapeRef=shapeReferenceAxis(), angle=ang) + newPos = fCmd.edges()[0].centerOfCurvatureAt(0) + obj.Placement.move(originalPos - newPos) + + +def placeTheElbow(c, v1=None, v2=None, P=None): + """ + placeTheElbow(c,v1,v2,P=None) + Puts the curve C between vectors v1 and v2. + If point P is given, translates it in there. + NOTE: v1 and v2 oriented in the same direction along the path! + """ + if not (v1 and v2): + v1, v2 = [e.tangentAt(0) for e in fCmd.edges()] + try: + P = fCmd.intersectionCLines(*fCmd.edges()) + except: + pass + if hasattr(c, "PType") and hasattr(c, "BendAngle") and v1 and v2: + v1.normalize() + v2.normalize() + ortho = rounded(fCmd.ortho(v1, v2)) + bisect = rounded(v2 - v1) + ang = degrees(v1.getAngle(v2)) + c.BendAngle = ang + rot1 = FreeCAD.Rotation(rounded(fCmd.beamAx(c, FreeCAD.Vector(0, 0, 1))), ortho) + c.Placement.Rotation = rot1.multiply(c.Placement.Rotation) + rot2 = FreeCAD.Rotation( + rounded(fCmd.beamAx(c, FreeCAD.Vector(1, 1, 0))), bisect + ) + c.Placement.Rotation = rot2.multiply(c.Placement.Rotation) + if not P: + P = c.Placement.Base + c.Placement.Base = P + + +def placeoTherElbow(c, v1=None, v2=None, P=None): + """ + Like placeTheElbow() but with more math. + """ + if not (v1 and v2): + v1, v2 = [e.tangentAt(0) for e in fCmd.edges()] + try: + P = fCmd.intersectionCLines(*fCmd.edges()) + except: + pass + if hasattr(c, "PType") and hasattr(c, "BendAngle") and v1 and v2: + v1.normalize() + v2.normalize() + ortho = rounded(fCmd.ortho(v1, v2)) + bisect = rounded(v2 - v1) + cBisect = rounded(c.Ports[1].normalize() + c.Ports[0].normalize()) # math + cZ = c.Ports[0].cross(c.Ports[1]) # more math + ang = degrees(v1.getAngle(v2)) + c.BendAngle = ang + rot1 = FreeCAD.Rotation(rounded(fCmd.beamAx(c, cZ)), ortho) + c.Placement.Rotation = rot1.multiply(c.Placement.Rotation) + rot2 = FreeCAD.Rotation(rounded(fCmd.beamAx(c, cBisect)), bisect) + c.Placement.Rotation = rot2.multiply(c.Placement.Rotation) + if not P: + P = c.Placement.Base + c.Placement.Base = P + def placeThePype(pypeObject, port=0, target=None, targetPort=0): - ''' - placeThePype(pypeObject, port=None, target=None, targetPort=0) - pypeObject: a FeaturePython with PType property - port: an optional port of pypeObject - Aligns pypeObject's Placement to the Port of another pype which is selected in the viewport. - The pype shall be selected to the circular edge nearest to the port concerned. - ''' - pos=Z=FreeCAD.Vector() - if target and hasattr(target,'PType') and hasattr(target,'Ports'): # target is given - pos=portsPos(target)[targetPort] - Z=portsDir(target)[targetPort] - else: # find target - try: - selex=FreeCADGui.Selection.getSelectionEx() - target=selex[0].Object - so=selex[0].SubObjects[0] - except: - FreeCAD.Console.PrintError('No geometry selected\n') - return - if type(so)==Part.Vertex: pick=so.Point - else: pick=so.CenterOfMass - if hasattr(target,'PType') and hasattr(target,'Ports'): # ...selection is another pype-object - pos, Z = nearestPort(target, pick)[1:] - elif fCmd.edges([selex[0]]): # one or more edges selected... - edge=fCmd.edges([selex[0]])[0] - if edge.curvatureAt(0)!=0: # ...and the first is curve - pos=edge.centerOfCurvatureAt(0) - Z=edge.tangentAt(0).cross(edge.normalAt(0)) - # now place pypeObject on target - pOport=pypeObject.Ports[port] - if pOport==FreeCAD.Vector(): - pOport=pypeObject.Ports[port] - if pOport==FreeCAD.Vector(): pOport=FreeCAD.Vector(0,0,-1) - pypeObject.Placement=FreeCAD.Placement(pos+Z*pOport.Length,FreeCAD.Rotation(pOport*-1,Z)) - -def nearestPort (pypeObject,point): - try: - pos=portsPos(pypeObject)[0]; Z=portsDir(pypeObject)[0] - i=nearest=0 - for p in portsPos(pypeObject)[1:] : - i+=1 - if (p-point).Length<(pos-point).Length: - pos=p - Z=portsDir(pypeObject)[i] - nearest=i - return nearest, pos, Z - except: - return None - -def extendTheTubes2intersection(pipe1=None,pipe2=None,both=True): - ''' - Does what it says; also with beams. - If arguments are None, it picks the first 2 selected beams(). - ''' - if not (pipe1 and pipe2): + """ + placeThePype(pypeObject, port=None, target=None, targetPort=0) + pypeObject: a FeaturePython with PType property + port: an optional port of pypeObject + Aligns pypeObject's Placement to the Port of another pype which is selected in the viewport. + The pype shall be selected to the circular edge nearest to the port concerned. + """ + pos = Z = FreeCAD.Vector() + if ( + target and hasattr(target, "PType") and hasattr(target, "Ports") + ): # target is given + pos = portsPos(target)[targetPort] + Z = portsDir(target)[targetPort] + else: # find target + try: + selex = FreeCADGui.Selection.getSelectionEx() + target = selex[0].Object + so = selex[0].SubObjects[0] + except: + FreeCAD.Console.PrintError("No geometry selected\n") + return + if type(so) == Part.Vertex: + pick = so.Point + else: + pick = so.CenterOfMass + if hasattr(target, "PType") and hasattr( + target, "Ports" + ): # ...selection is another pype-object + pos, Z = nearestPort(target, pick)[1:] + elif fCmd.edges([selex[0]]): # one or more edges selected... + edge = fCmd.edges([selex[0]])[0] + if edge.curvatureAt(0) != 0: # ...and the first is curve + pos = edge.centerOfCurvatureAt(0) + Z = edge.tangentAt(0).cross(edge.normalAt(0)) + # now place pypeObject on target + pOport = pypeObject.Ports[port] + if pOport == FreeCAD.Vector(): + pOport = pypeObject.Ports[port] + if pOport == FreeCAD.Vector(): + pOport = FreeCAD.Vector(0, 0, -1) + pypeObject.Placement = FreeCAD.Placement( + pos + Z * pOport.Length, FreeCAD.Rotation(pOport * -1, Z) + ) + + +def nearestPort(pypeObject, point): try: - pipe1,pipe2=fCmd.beams()[:2] + pos = portsPos(pypeObject)[0] + Z = portsDir(pypeObject)[0] + i = nearest = 0 + for p in portsPos(pypeObject)[1:]: + i += 1 + if (p - point).Length < (pos - point).Length: + pos = p + Z = portsDir(pypeObject)[i] + nearest = i + return nearest, pos, Z except: - FreeCAD.Console.PrintError('Insufficient arguments for extendTheTubes2intersection\n') - P=fCmd.intersectionCLines(pipe1,pipe2) - if P!=None: - fCmd.extendTheBeam(pipe1,P) - if both: - fCmd.extendTheBeam(pipe2,P) - -def header(): #start 20200725 - ''' - creates an header with multiple branches - ''' - import BOPTools.JoinFeatures - branches=fCmd.beams() - for p in branches: - if not hasattr(p,'PType'): - branches.pop(branches.index(p)) - elif p.PType!='Pipe': - branches.pop(branches.index(p)) - if len(branches)>1: - header=branches.pop(0) - print ("Header is "+header.Label) - pl=header.Placement - for t in [header]+branches: - t.Placement=pl.inverse().multiply(t.Placement) - O=FreeCAD.Vector(0,0,0) - Z=FreeCAD.Vector(0,0,1) - for t in branches: - P=t.Proxy.nearestPort(FreeCAD.Vector())[1] - if t.Proxy.nearestPort(O)[0]: - u=fCmd.beamAx(t).negative() - else: - u=fCmd.beamAx(t) - I=P.projectToPlane(O,u) - I[2]=0.0 - # migliorare aggiustamento delta in funzione di ang e t.OD - delta=(float(header.OD/2)**2-I.Length**2)**.5-float(header.thk)-float(t.OD/2) - if round(u.dot(Z),5) or delta.imag:# or round(I.Length+float(t.OD)/2,3)>round(float(header.OD)/2,3): - print('%s has exception and will not be connected' %(t.Label)) - branches[branches.index(t)]=None - t.Placement=pl.multiply(t.Placement) - else: - fCmd.extendTheBeam(t,I+u*delta) - ### join and move back - branches=[b for b in branches if b] - if branches: - join= BOPTools.JoinFeatures.makeConnect('Header') - join.Objects=[header]+branches - join.Placement=pl - join.Refine=True - for pipe in join.Objects: - pipe.ViewObject.Visibility=False + return None + + +def extendTheTubes2intersection(pipe1=None, pipe2=None, both=True): + """ + Does what it says; also with beams. + If arguments are None, it picks the first 2 selected beams(). + """ + if not (pipe1 and pipe2): + try: + pipe1, pipe2 = fCmd.beams()[:2] + except: + FreeCAD.Console.PrintError( + "Insufficient arguments for extendTheTubes2intersection\n" + ) + P = fCmd.intersectionCLines(pipe1, pipe2) + if P != None: + fCmd.extendTheBeam(pipe1, P) + if both: + fCmd.extendTheBeam(pipe2, P) + + +def header(): # start 20200725 + """ + creates an header with multiple branches + """ + import BOPTools.JoinFeatures + + branches = fCmd.beams() + for p in branches: + if not hasattr(p, "PType"): + branches.pop(branches.index(p)) + elif p.PType != "Pipe": + branches.pop(branches.index(p)) + if len(branches) > 1: + header = branches.pop(0) + print("Header is " + header.Label) + pl = header.Placement + for t in [header] + branches: + t.Placement = pl.inverse().multiply(t.Placement) + O = FreeCAD.Vector(0, 0, 0) + Z = FreeCAD.Vector(0, 0, 1) + for t in branches: + P = t.Proxy.nearestPort(FreeCAD.Vector())[1] + if t.Proxy.nearestPort(O)[0]: + u = fCmd.beamAx(t).negative() + else: + u = fCmd.beamAx(t) + I = P.projectToPlane(O, u) + I[2] = 0.0 + # migliorare aggiustamento delta in funzione di ang e t.OD + delta = ( + (float(header.OD / 2) ** 2 - I.Length**2) ** 0.5 + - float(header.thk) + - float(t.OD / 2) + ) + if ( + round(u.dot(Z), 5) or delta.imag + ): # or round(I.Length+float(t.OD)/2,3)>round(float(header.OD)/2,3): + print("%s has exception and will not be connected" % (t.Label)) + branches[branches.index(t)] = None + t.Placement = pl.multiply(t.Placement) + else: + fCmd.extendTheBeam(t, I + u * delta) + ### join and move back + branches = [b for b in branches if b] + if branches: + join = BOPTools.JoinFeatures.makeConnect("Header") + join.Objects = [header] + branches + join.Placement = pl + join.Refine = True + for pipe in join.Objects: + pipe.ViewObject.Visibility = False + else: + header.Placement = pl.multiply(header.Placement) + FreeCAD.activeDocument().recompute() else: - header.Placement=pl.multiply(header.Placement) - FreeCAD.activeDocument().recompute() - else: - FreeCAD.Console.PrintError('Insufficient pipes selected\n') + FreeCAD.Console.PrintError("Insufficient pipes selected\n") def laydownTheTube(pipe=None, refFace=None, support=None): - ''' - laydownTheTube(pipe=None, refFace=None, support=None) - Makes one pipe touch one face if the center-line is parallel to it. - If support is not None, support is moved towards pipe. - ''' - if not(pipe and refFace): # without argument take from selection set - refFace=[f for f in fCmd.faces() if type(f.Surface)==Part.Plane][0] - pipe=[p for p in fCmd.beams() if hasattr(p,'OD')] [0] - try: - if type(refFace.Surface)==Part.Plane and fCmd.isOrtho(refFace,fCmd.beamAx(pipe)) and hasattr(pipe,'OD'): - dist=rounded(refFace.normalAt(0,0).multiply(refFace.normalAt(0,0).dot(pipe.Placement.Base-refFace.CenterOfMass)-float(pipe.OD)/2)) - if support: - support.Placement.move(dist) - else: - pipe.Placement.move(dist.multiply(-1)) - else: - FreeCAD.Console.PrintError('Face is not flat or not parallel to axis of pipe\n') - except: - FreeCAD.Console.PrintError('Wrong selection\n') - -def breakTheTubes(point,pipes=[],gap=0): - ''' - breakTheTube(point,pipes=[],gap=0) - Breaks the "pipes" at "point" leaving a "gap". - ''' - pipes2nd=list() - if not pipes: - pipes=[p for p in fCmd.beams() if isPipe(p)] - if pipes: - for pipe in pipes: - if pointlen(obj1.Ports)-1 or port2>len(obj2.Ports)-1: - FreeCAD.Console.PrintError('Wrong port(s) number\n') + """ + rotateTheElbowPort(curve=None, port=0, ang=45) + Rotates one curve aroud one of its circular edges. + """ + if curve == None: + try: + curve = FreeCADGui.Selection.getSelection()[0] + if not isElbow(curve): + FreeCAD.Console.PrintError("Please select an elbow.\n") + return + except: + FreeCAD.Console.PrintError("Please select something before.\n") + rotateTheTubeAx(curve, curve.Ports[port], ang) + + +def join(obj1, port1, obj2, port2): + """ + join(obj1,port1,obj2,port2) + \t obj1, obj2 = two "Pype" parts + \t port1, port2 = their respective ports to join + """ + if hasattr(obj1, "PType") and hasattr(obj2, "PType"): + if port1 > len(obj1.Ports) - 1 or port2 > len(obj2.Ports) - 1: + FreeCAD.Console.PrintError("Wrong port(s) number\n") + else: + v1 = portsDir(obj1)[port1] + v2 = portsDir(obj2)[port2] + rot = FreeCAD.Rotation(v2, v1.negative()) + obj2.Placement.Rotation = rot.multiply(obj2.Placement.Rotation) + p1 = portsPos(obj1)[port1] + p2 = portsPos(obj2)[port2] + obj2.Placement.move(p1 - p2) else: - v1=portsDir(obj1)[port1] - v2=portsDir(obj2)[port2] - rot=FreeCAD.Rotation(v2,v1.negative()) - obj2.Placement.Rotation=rot.multiply(obj2.Placement.Rotation) - p1=portsPos(obj1)[port1] - p2=portsPos(obj2)[port2] - obj2.Placement.move(p1-p2) - else: - FreeCAD.Console.PrintError('Object(s) are not pypes\n') + FreeCAD.Console.PrintError("Object(s) are not pypes\n") + def makeValve(propList=[], pos=None, Z=None): - '''add a Valve object - makeValve(propList,pos,Z); - propList is one optional list with at least 4 elements: - DN (string): nominal diameter - VType (string): type of valve - OD (float): outside diameter - ID (float): inside diameter - H (float): length of pipe - Kv (float): valve's flow factor (optional) - Default is "DN50 ball valve ('ball')" - pos (vector): position of insertion; default = 0,0,0 - Z (vector): orientation: default = 0,0,1 - ''' - if pos==None: - pos=FreeCAD.Vector(0,0,0) - if Z==None: - Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",translate("Part::FeaturePython","Valve")) - if len(propList): - pFeatures.Valve(a,*propList) - else: - pFeatures.Valve(a) - a.ViewObject.Proxy=0 - a.Placement.Base=pos - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),Z) - a.Placement.Rotation=rot.multiply(a.Placement.Rotation) - return a - -def doValves(propList=["DN50", "ball", 72, 50, 40, 150],pypeline=None, pos=0): - ''' + """add a Valve object + makeValve(propList,pos,Z); + propList is one optional list with at least 4 elements: + DN (string): nominal diameter + VType (string): type of valve + OD (float): outside diameter + ID (float): inside diameter + H (float): length of pipe + Kv (float): valve's flow factor (optional) + Default is "DN50 ball valve ('ball')" + pos (vector): position of insertion; default = 0,0,0 + Z (vector): orientation: default = 0,0,1 + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject( + "Part::FeaturePython", translate("Part::FeaturePython", "Valve") + ) + if len(propList): + pFeatures.Valve(a, *propList) + else: + pFeatures.Valve(a) + a.ViewObject.Proxy = 0 + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + return a + + +def doValves(propList=["DN50", "ball", 72, 50, 40, 150], pypeline=None, pos=0): + """ propList = [ DN (string): nominal diameter VType (string): type of valve @@ -1060,179 +1272,237 @@ def doValves(propList=["DN50", "ball", 72, 50, 40, 150],pypeline=None, pos=0): Kv (float): valve's flow factor (optional) ] pypeline = string pos (]0..100[) = position along pipe or edge - ''' - # self.lastValve=None - color=0.05,0.3,0.75 - vlist=[] - # d=self.pipeDictList[self.sizeList.currentRow()] - FreeCAD.activeDocument().openTransaction('Insert valve') - # propList=[d['PSize'],d['VType'],float(pq(d['OD'])),float(pq(d['ID'])),float(pq(d['H'])),float(pq(d['Kv']))] - if 0 < pos < 100: # ..place the valve in the middle of pipe(s) - pipes=[p for p in FreeCADGui.Selection.getSelection() if isPipe(p)] - if pipes: - for p1 in pipes: - vlist.append(makeValve(propList)) - p2=breakTheTubes(float(p1.Height)*pos/100, pipes=[p1], gap=float(vlist[-1].Height))[0] - if p2 and pypeline: moveToPyLi(p2,pypeline) - vlist[-1].Placement=p1.Placement - vlist[-1].Placement.move(portsDir(p1)[1]*float(p1.Height)) - vlist[-1].ViewObject.ShapeColor=color - # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) - # FreeCAD.ActiveDocument.recompute() - elif len(fCmd.edges())==0: #..no edges selected - vs=[v for sx in FreeCADGui.Selection.getSelectionEx() for so in sx.SubObjects for v in so.Vertexes] - if len(vs)==0: # ...no vertexes selected - vlist.append(makeValve(propList)) - vlist[-1].ViewObject.ShapeColor=color - # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) - else: - for v in vs: # ... one or more vertexes - vlist.append(makeValve(propList,v.Point)) - vlist[-1].ViewObject.ShapeColor=color - # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) - else: - selex=FreeCADGui.Selection.getSelectionEx() - for objex in selex: - o=objex.Object - for edge in fCmd.edges([objex]): # ...one or more edges... - if edge.curvatureAt(0)==0: # ...straight edges - vlist.append(makeValve(propList,edge.valueAt(edge.LastParameter/2-propList[4]/2),edge.tangentAt(0))) - # if self.combo.currentText()!='': - # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) - else: # ...curved edges - pos=edge.centerOfCurvatureAt(0) # SNIPPET TO ALIGN WITH THE PORTS OF Pype SELECTED: BEGIN... - if hasattr(o,'PType') and len(o.Ports)==2: - p0,p1=portsPos(o) - if (p0-pos).Length<(p1-pos).Length: - Z=portsDir(o)[0] - else: - Z=portsDir(o)[1] - else: - Z=edge.tangentAt(0).cross(edge.normalAt(0)) # ...END - vlist.append(makeValve(propList,pos,Z)) - # if self.combo.currentText()!='': + """ + # self.lastValve=None + color = 0.05, 0.3, 0.75 + vlist = [] + # d=self.pipeDictList[self.sizeList.currentRow()] + FreeCAD.activeDocument().openTransaction("Insert valve") + # propList=[d['PSize'],d['VType'],float(pq(d['OD'])),float(pq(d['ID'])),float(pq(d['H'])),float(pq(d['Kv']))] + if 0 < pos < 100: # ..place the valve in the middle of pipe(s) + pipes = [p for p in FreeCADGui.Selection.getSelection() if isPipe(p)] + if pipes: + for p1 in pipes: + vlist.append(makeValve(propList)) + p2 = breakTheTubes( + float(p1.Height) * pos / 100, + pipes=[p1], + gap=float(vlist[-1].Height), + )[0] + if p2 and pypeline: + moveToPyLi(p2, pypeline) + vlist[-1].Placement = p1.Placement + vlist[-1].Placement.move(portsDir(p1)[1] * float(p1.Height)) + vlist[-1].ViewObject.ShapeColor = color + # if self.combo.currentText()!='': + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + # FreeCAD.ActiveDocument.recompute() + elif len(fCmd.edges()) == 0: # ..no edges selected + vs = [ + v + for sx in FreeCADGui.Selection.getSelectionEx() + for so in sx.SubObjects + for v in so.Vertexes + ] + if len(vs) == 0: # ...no vertexes selected + vlist.append(makeValve(propList)) + vlist[-1].ViewObject.ShapeColor = color + # if self.combo.currentText()!='': # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) - vlist[-1].ViewObject.ShapeColor=color - if pypeline: - for v in vlist: - moveToPyLi(v,pypeline) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - return vlist + else: + for v in vs: # ... one or more vertexes + vlist.append(makeValve(propList, v.Point)) + vlist[-1].ViewObject.ShapeColor = color + # if self.combo.currentText()!='': + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + else: + selex = FreeCADGui.Selection.getSelectionEx() + for objex in selex: + o = objex.Object + for edge in fCmd.edges([objex]): # ...one or more edges... + if edge.curvatureAt(0) == 0: # ...straight edges + vlist.append( + makeValve( + propList, + edge.valueAt(edge.LastParameter / 2 - propList[4] / 2), + edge.tangentAt(0), + ) + ) + # if self.combo.currentText()!='': + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + else: # ...curved edges + pos = edge.centerOfCurvatureAt( + 0 + ) # SNIPPET TO ALIGN WITH THE PORTS OF Pype SELECTED: BEGIN... + if hasattr(o, "PType") and len(o.Ports) == 2: + p0, p1 = portsPos(o) + if (p0 - pos).Length < (p1 - pos).Length: + Z = portsDir(o)[0] + else: + Z = portsDir(o)[1] + else: + Z = edge.tangentAt(0).cross(edge.normalAt(0)) # ...END + vlist.append(makeValve(propList, pos, Z)) + # if self.combo.currentText()!='': + # pCmd.moveToPyLi(self.lastValve,self.combo.currentText()) + vlist[-1].ViewObject.ShapeColor = color + if pypeline: + for v in vlist: + moveToPyLi(v, pypeline) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + return vlist + def attachToTube(port=None): - pypes=[p for p in FreeCADGui.Selection.getSelection() if hasattr(p,'PType')] - tube=None - try: - tubes=[t for t in pypes if t.PType=='Pipe'] - if tubes: - tube=tubes[0] - pypes.pop(pypes.index(tube)) - for p in pypes: - p.MapMode = 'Concentric' - if not port: port=tube.Proxy.nearestPort(p.Shape.Solids[0].CenterOfMass)[0] - if port==0: - if p.PType!='Flange': p.MapReversed = True - else: p.MapReversed = False - p.Support = [(tube,'Edge3')] - elif port==1: - if p.PType!='Flange': p.MapReversed = False - else: p.MapReversed = True - p.Support = [(tube,'Edge1')] - if p.PType=='Elbow': p.AttachmentOffset = FreeCAD.Placement(FreeCAD.Vector(0, 0, p.Ports[0].Length), FreeCAD.Rotation(p.Ports[1],FreeCAD.Vector(0, 0, 1).negative())) - FreeCAD.Console.PrintMessage('%s attached to %s\n' %(p.Label,tube.Label)) - else: - for p in pypes: - p.MapMode='Deactivated' - FreeCAD.Console.PrintMessage('Object Detached\n') - except: - FreeCAD.Console.PrintError('Nothing attached\n') - -def makeNozzle(DN='DN50', H=200, OD=60.3, thk=3,D=160, d=62, df=132,f=14,t=15,n=4): - ''' - makeNozzle(DN,OD,thk,D,df,f,t,n) - DN (string): nominal diameter - OD (float): pipe outside diameter - thk (float): pipe wall thickness - D (float): flange diameter - d (float): flange hole - df (float): bolts holes distance - f (float): bolts holes diameter - t (float): flange thickness - n (int): nr. of bolts - ''' - selex=FreeCADGui.Selection.getSelectionEx() - for sx in selex: - #e=sx.SubObjects[0] - s=sx.Object - curved=[e for e in fCmd.edges([sx]) if e.curvatureAt(0)] - for e in curved: - pipe=makePipe([DN,OD,thk,H], pos=e.centerOfCurvatureAt(0),Z=e.tangentAt(0).cross(e.normalAt(0))) - FreeCAD.ActiveDocument.recompute() - flange=makeFlange([DN,'S.O.',D,d,df,f,t,n],pos=portsPos(pipe)[1],Z=portsDir(pipe)[1]) - pipe.MapReversed = False - pipe.Support = [(s,fCmd.edgeName(s,e)[1])] - pipe.MapMode = 'Concentric' - FreeCADGui.Selection.clearSelection() - FreeCADGui.Selection.addSelection(pipe) - FreeCADGui.Selection.addSelection(flange) - flange.Support = [(pipe,'Edge1')] - flange.MapReversed = True - flange.MapMode = 'Concentric' - FreeCAD.ActiveDocument.recompute() + pypes = [p for p in FreeCADGui.Selection.getSelection() if hasattr(p, "PType")] + tube = None + try: + tubes = [t for t in pypes if t.PType == "Pipe"] + if tubes: + tube = tubes[0] + pypes.pop(pypes.index(tube)) + for p in pypes: + p.MapMode = "Concentric" + if not port: + port = tube.Proxy.nearestPort(p.Shape.Solids[0].CenterOfMass)[0] + if port == 0: + if p.PType != "Flange": + p.MapReversed = True + else: + p.MapReversed = False + p.Support = [(tube, "Edge3")] + elif port == 1: + if p.PType != "Flange": + p.MapReversed = False + else: + p.MapReversed = True + p.Support = [(tube, "Edge1")] + if p.PType == "Elbow": + p.AttachmentOffset = FreeCAD.Placement( + FreeCAD.Vector(0, 0, p.Ports[0].Length), + FreeCAD.Rotation( + p.Ports[1], FreeCAD.Vector(0, 0, 1).negative() + ), + ) + FreeCAD.Console.PrintMessage( + "%s attached to %s\n" % (p.Label, tube.Label) + ) + else: + for p in pypes: + p.MapMode = "Deactivated" + FreeCAD.Console.PrintMessage("Object Detached\n") + except: + FreeCAD.Console.PrintError("Nothing attached\n") + + +def makeNozzle(DN="DN50", H=200, OD=60.3, thk=3, D=160, d=62, df=132, f=14, t=15, n=4): + """ + makeNozzle(DN,OD,thk,D,df,f,t,n) + DN (string): nominal diameter + OD (float): pipe outside diameter + thk (float): pipe wall thickness + D (float): flange diameter + d (float): flange hole + df (float): bolts holes distance + f (float): bolts holes diameter + t (float): flange thickness + n (int): nr. of bolts + """ + selex = FreeCADGui.Selection.getSelectionEx() + for sx in selex: + # e=sx.SubObjects[0] + s = sx.Object + curved = [e for e in fCmd.edges([sx]) if e.curvatureAt(0)] + for e in curved: + pipe = makePipe( + [DN, OD, thk, H], + pos=e.centerOfCurvatureAt(0), + Z=e.tangentAt(0).cross(e.normalAt(0)), + ) + FreeCAD.ActiveDocument.recompute() + flange = makeFlange( + [DN, "S.O.", D, d, df, f, t, n], + pos=portsPos(pipe)[1], + Z=portsDir(pipe)[1], + ) + pipe.MapReversed = False + pipe.Support = [(s, fCmd.edgeName(s, e)[1])] + pipe.MapMode = "Concentric" + FreeCADGui.Selection.clearSelection() + FreeCADGui.Selection.addSelection(pipe) + FreeCADGui.Selection.addSelection(flange) + flange.Support = [(pipe, "Edge1")] + flange.MapReversed = True + flange.MapMode = "Concentric" + FreeCAD.ActiveDocument.recompute() + def makeRoute(n=Z): - curvedEdges=[e for e in fCmd.edges() if e.curvatureAt(0)!=0] - if curvedEdges: - s=FreeCAD.ActiveDocument.addObject('Sketcher::SketchObject',translate("Sketcher::SketchObject",'pipeRoute')) - s.MapMode = "SectionOfRevolution" - sup=fCmd.edgeName() - s.Support = [sup] - if fCmd.isPartOfPart(sup[0]): #TARGET [working]: takes care if support belongs to App::Part - part=fCmd.isPartOfPart(sup[0]) - FreeCAD.Console.PrintMessage('*** '+sup[0].Label+' is part of '+part.Label+' ***\n') #debug - #s.AttachmentOffset=part.Placement.multiply(s.AttachmentOffset) - else: - return None - if fCmd.faces(): - n=fCmd.faces()[0].normalAt(0,0) - x=s.Placement.Rotation.multVec(X) - z=s.Placement.Rotation.multVec(Z) - t=x.dot(n)*x+z.dot(n)*z - alfa=degrees(z.getAngle(t)) - if t.Length>0.000000001: - s.AttachmentOffset.Rotation=s.AttachmentOffset.Rotation.multiply(FreeCAD.Rotation(Y,alfa)) - FreeCAD.ActiveDocument.recompute() - FreeCADGui.activeDocument().setEdit(s.Name) + curvedEdges = [e for e in fCmd.edges() if e.curvatureAt(0) != 0] + if curvedEdges: + s = FreeCAD.ActiveDocument.addObject( + "Sketcher::SketchObject", translate("Sketcher::SketchObject", "pipeRoute") + ) + s.MapMode = "SectionOfRevolution" + sup = fCmd.edgeName() + s.Support = [sup] + if fCmd.isPartOfPart( + sup[0] + ): # TARGET [working]: takes care if support belongs to App::Part + part = fCmd.isPartOfPart(sup[0]) + FreeCAD.Console.PrintMessage( + "*** " + sup[0].Label + " is part of " + part.Label + " ***\n" + ) # debug + # s.AttachmentOffset=part.Placement.multiply(s.AttachmentOffset) + else: + return None + if fCmd.faces(): + n = fCmd.faces()[0].normalAt(0, 0) + x = s.Placement.Rotation.multVec(X) + z = s.Placement.Rotation.multVec(Z) + t = x.dot(n) * x + z.dot(n) * z + alfa = degrees(z.getAngle(t)) + if t.Length > 0.000000001: + s.AttachmentOffset.Rotation = s.AttachmentOffset.Rotation.multiply( + FreeCAD.Rotation(Y, alfa) + ) + FreeCAD.ActiveDocument.recompute() + FreeCADGui.activeDocument().setEdit(s.Name) + def flatten(p1=None, p2=None, c=None): - if not (p1 and p2) and len(fCmd.beams())>1: - p1,p2=fCmd.beams()[:2] - else: FreeCAD.Console.PrintError('Select two intersecting pipes\n') - if not c: - curves=[e for e in FreeCADGui.Selection.getSelection() if hasattr(e,'PType') and hasattr(e,'BendAngle')] - if curves: c=curves[0] - else: FreeCAD.Console.PrintError('Select at least one elbow') - try: - P=fCmd.intersectionCLines(p1,p2) - com1=p1.Shape.Solids[0].CenterOfMass - com2=p2.Shape.Solids[0].CenterOfMass - v1=P-com1 - v2=com2-P - FreeCAD.ActiveDocument.openTransaction('Place one curve') - placeoTherElbow(curves[0],v1,v2,P) - FreeCAD.ActiveDocument.recompute() # recompute for the elbow - port1,port2=portsPos(curves[0]) - if (com1-port1).Length<(com1-port2).Length: - fCmd.extendTheBeam(p1,port1) - fCmd.extendTheBeam(p2,port2) + if not (p1 and p2) and len(fCmd.beams()) > 1: + p1, p2 = fCmd.beams()[:2] + else: + FreeCAD.Console.PrintError("Select two intersecting pipes\n") + if not c: + curves = [ + e + for e in FreeCADGui.Selection.getSelection() + if hasattr(e, "PType") and hasattr(e, "BendAngle") + ] + if curves: + c = curves[0] else: - fCmd.extendTheBeam(p1,port2) - fCmd.extendTheBeam(p2,port1) - FreeCAD.ActiveDocument.recompute() # recompute for the pipes - FreeCAD.ActiveDocument.commitTransaction() - except: - FreeCAD.Console.PrintError('Intersection point not found\n') + FreeCAD.Console.PrintError("Select at least one elbow") + try: + P = fCmd.intersectionCLines(p1, p2) + com1 = p1.Shape.Solids[0].CenterOfMass + com2 = p2.Shape.Solids[0].CenterOfMass + v1 = P - com1 + v2 = com2 - P + FreeCAD.ActiveDocument.openTransaction("Place one curve") + placeoTherElbow(curves[0], v1, v2, P) + FreeCAD.ActiveDocument.recompute() # recompute for the elbow + port1, port2 = portsPos(curves[0]) + if (com1 - port1).Length < (com1 - port2).Length: + fCmd.extendTheBeam(p1, port1) + fCmd.extendTheBeam(p2, port2) + else: + fCmd.extendTheBeam(p1, port2) + fCmd.extendTheBeam(p2, port1) + FreeCAD.ActiveDocument.recompute() # recompute for the pipes + FreeCAD.ActiveDocument.commitTransaction() + except: + FreeCAD.Console.PrintError("Intersection point not found\n") From a3106faafa339b154928d212db7657c0332acc2c Mon Sep 17 00:00:00 2001 From: Edgar Date: Sun, 3 May 2020 23:48:53 -0500 Subject: [PATCH 024/135] Fixed typo on addproperty Wrong typo syntax --- pFeatures.py | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) diff --git a/pFeatures.py b/pFeatures.py index 95ea243..355ccba 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -997,6 +997,7 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings class Valve(pypeType): +<<<<<<< HEAD """Class for object PType="Valve" Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100]) obj: the "App::FeaturePython object" @@ -1242,3 +1243,155 @@ def purge(self, fp): for name in fp.Curves: FreeCAD.ActiveDocument.removeObject(name) fp.Curves = [] +======= + '''Class for object PType="Valve" + Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100]) + obj: the "App::FeaturePython object" + PSize (string): nominal diameter + PRating (string): ! the valve's type ! + OD (float): outside diameter + H (float): length of valve''' + def __init__(self, obj,DN="DN50",VType="ball",OD=72, ID=50, H=40, Kv=150): + # initialize the parent class + super(Valve,self).__init__(obj) + # define common properties + obj.PType="Valve" + obj.PRating=VType + obj.PSize=DN + obj.Kv=Kv + # define specific properties + obj.addProperty("App::PropertyLength","OD","Valve",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD + obj.addProperty("App::PropertyLength","ID","Valve",QT_TRANSLATE_NOOP("App::Property","Inside diameter")).ID=ID + obj.addProperty("App::PropertyLength","Height","Valve",QT_TRANSLATE_NOOP("App::Property","Length of tube")).Height=H + def execute(self, fp): + c=Part.makeCone(fp.OD/2,fp.OD/5,fp.Height/2) + v=c.fuse(c.mirror(FreeCAD.Vector(0,0,fp.Height/2),FreeCAD.Vector(0,0,1))) + if fp.PRating.find('ball')+1 or fp.PRating.find('globe')+1: + r=min(fp.Height*0.45,fp.OD/2) + v=v.fuse(Part.makeSphere(r,FreeCAD.Vector(0,0,fp.Height/2))) + fp.Shape = v + fp.Ports=[FreeCAD.Vector(),FreeCAD.Vector(0,0,float(fp.Height))] + super(Valve,self).execute(fp) # perform common operations + +class PypeBranch2(pypeType): # use AttachExtensionPython + '''Class for object PType="PypeBranch2" + Single-line pipe branch linked to its center-line using AttachExtensionPython + ex: a=PypeBranch2(obj,base,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None) + type(obj)=FeaturePython + type(base)=DWire or SketchObject + ''' + def __init__(self, obj,base,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None): + # initialize the parent class + super(PypeBranch2,self).__init__(obj) + # define common properties + obj.PType="PypeBranch" + obj.PSize=DN + obj.PRating=PRating + # define specific properties + obj.addExtension("App::GroupExtensionPython",obj) # GROUP test in progress! + obj.addProperty("App::PropertyLength","OD","PypeBranch",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD + obj.addProperty("App::PropertyLength","thk","PypeBranch",QT_TRANSLATE_NOOP("App::Property","Wall thickness")).thk=thk + if not BR: BR=0.75*OD + obj.addProperty("App::PropertyLength","BendRadius","PypeBranch",QT_TRANSLATE_NOOP("App::Property","Bend Radius")).BendRadius=BR + obj.addProperty("App::PropertyStringList","Tubes","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The tubes of the branch.")) + obj.addProperty("App::PropertyStringList","Curves","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The curves of the branch.")) + obj.addProperty("App::PropertyLink","Base","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The path.")) + if hasattr(base,"Shape") and base.Shape.Edges: + obj.Base=base + else: + FreeCAD.Console.PrintError('Base not valid\n') + def onChanged(self, fp, prop): + if prop=='Base' and hasattr(fp,'OD') and hasattr(fp,'thk') and hasattr(fp,'BendRadius'): + self.purge(fp) + self.redraw(fp) + if prop=='BendRadius' and hasattr(fp,'Curves'): + BR=fp.BendRadius + for curve in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]: + curve.BendRadius=BR + if prop=='OD' and hasattr(fp,'Tubes') and hasattr(fp,'Curves'): + OD=fp.OD + for obj in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]: + if obj.PType=='Elbow': obj.BendRadius=OD*.75 + obj.OD=OD + fp.BendRadius=OD*.75 + if prop=='thk' and hasattr(fp,'Tubes') and hasattr(fp,'Curves'): + thk=fp.thk + for obj in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]: + if hasattr(obj,'thk'): obj.thk=thk + def execute(self, fp): + if len(fp.Tubes)!=len(fp.Base.Shape.Edges): + self.purge(fp) + self.redraw(fp) + return + from math import tan + for i in range(len(fp.Tubes)): + L=fp.Base.Shape.Edges[i].Length + R=fp.BendRadius + # adjust the curve + if i0: + alfa=e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i-1].tangentAt(0))/2 + L-=R*tan(alfa) + offset=R*tan(alfa) + if i<(len(fp.Base.Shape.Edges)-1): + alfa=e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i+1].tangentAt(0))/2 + L-=R*tan(alfa) + eSupport='Edge'+str(i+1) + t=pCmd.makePipe([fp.PSize,float(fp.OD),float(fp.thk),L]) + t.PRating=fp.PRating + t.PSize=fp.PSize + t.Support = [(fp.Base,eSupport)] + t.MapMode = 'NormalToEdge' + t.MapReversed = True + t.AttachmentOffset=FreeCAD.Placement(FreeCAD.Vector(0,0,offset),FreeCAD.Rotation()) + tubes.append(t.Name) + #---Create the curve--- + if i>0: + e0=fp.Base.Shape.Edges[i-1] + alfa=degrees(e0.tangentAt(0).getAngle(e.tangentAt(0))) + c=pCmd.makeElbow([fp.PSize,float(fp.OD),float(fp.thk),alfa,R]) + c.PRating=fp.PRating + c.PSize=fp.PSize + O='Vertex'+str(i+1) + c.MapReversed = False + c.Support = [(fp.Base,O)] + c.MapMode = 'Translate' + pCmd.placeTheElbow(c,e0.tangentAt(0),e.tangentAt(0)) + curves.append(c.Name) + fp.Tubes=tubes + fp.Curves=curves + fp.addObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]) + def purge(self,fp): + if hasattr(fp,'Tubes'): + fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes]) + for name in fp.Tubes: FreeCAD.ActiveDocument.removeObject(name) + fp.Tubes=[] + if hasattr(fp,'Curves'): + fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]) + for name in fp.Curves: FreeCAD.ActiveDocument.removeObject(name) + fp.Curves=[] +>>>>>>> baf0fdd (Fixed typo on addproperty) From aa86a67d562bce71c83eedd7c5a075fb5895a9d3 Mon Sep 17 00:00:00 2001 From: Edgar Date: Mon, 4 May 2020 07:52:57 -0500 Subject: [PATCH 025/135] Added locale update function Added locale update function --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 242cdac..e5b5dea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ __pycache__/ +<<<<<<< HEAD test_**.sh +======= +>>>>>>> 5f2f63f (Added locale update function) From 4bc68df42dac54c32e13436bb66ff9d47330ce10 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Mon, 11 Mar 2024 14:12:59 -0600 Subject: [PATCH 026/135] Add bash script to update translations --- translations/update_translation.sh | 120 +++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100755 translations/update_translation.sh diff --git a/translations/update_translation.sh b/translations/update_translation.sh new file mode 100755 index 0000000..797988e --- /dev/null +++ b/translations/update_translation.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash + +# -------------------------------------------------------------------------------------------------- +# +# Update translation files +# +# Supported locales on FreeCAD <2024-01-20, FreeCADGui.supportedLocales(), total=40>: +# {'English': 'en', 'Afrikaans': 'af', 'Arabic': 'ar', 'Basque': 'eu', 'Belarusian': 'be', +# 'Bulgarian': 'bg', 'Catalan': 'ca', 'Chinese Simplified': 'zh-CN', +# 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr', 'Czech': 'cs', 'Dutch': 'nl', +# 'Filipino': 'fil', 'Finnish': 'fi', 'French': 'fr', 'Galician': 'gl', 'Georgian': 'ka', +# 'German': 'de', 'Greek': 'el', 'Hungarian': 'hu', 'Indonesian': 'id', 'Italian': 'it', +# 'Japanese': 'ja', 'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', 'Norwegian': 'no', +# 'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR', 'Romanian': 'ro', +# 'Russian': 'ru', 'Serbian': 'sr', 'Serbian, Latin': 'sr-CS', 'Slovak': 'sk', +# 'Slovenian': 'sl', 'Spanish': 'es-ES', 'Spanish, Argentina': 'es-AR', 'Swedish': 'sv-SE', +# 'Turkish': 'tr', 'Ukrainian': 'uk', 'Valencian': 'val-ES', 'Vietnamese': 'vi'} +# +# NOTE: WORKFLOW +# 0. Install Qt tools +# Debian-based (e.g., Ubuntu): $ sudo apt-get install qttools5-dev-tools pyqt6-dev-tools +# Fedora-based: $ sudo dnf install qt6-linguist qt6-devel +# Arch-based: $ sudo pacman -S qt6-tools python-pyqt6 +# 1. Make the script executable +# $ chmod +x update_translation.sh +# 2. Execute the script passing the locale code as first parameter +# The script has to be executed within the `resources/translations` directory +# Only update the files you're translating! +# $ ./update_translation.sh es-ES +# 3. Do the translation via Qt Linguist and use `File>Release` +# 4. If releasing with the script execute the script passing the locale code as first parameter +# and use '-r' flag next +# $ ./update_translation.sh es-ES -r +# +# The usage of `pylupdate6` is preferred over 'pylupdate5' when extracting text strings from +# Python files. +# +# -------------------------------------------------------------------------------------------------- + +supported_locales=( + "en" "af" "ar" "eu" "be" "bg" "ca" "zh-CN" "zh-TW" "hr" + "cs" "nl" "fil" "fi" "fr" "gl" "ka" "de" "el" "hu" + "id" "it" "ja" "kab" "ko" "lt" "no" "pl" "pt-PT" "pt-BR" + "ro" "ru" "sr" "es-ES" "es-AR" "sv-SE" "tr" "uk" "val-ES" "vi" +) + +is_locale_supported() { + local locale="$1" + for supported_locale in "${supported_locales[@]}"; do + if [[ "$supported_locale" == "$locale" ]]; then + return 0 + fi + done + return 1 +} + +get_strings() { + # Get translatable strings from ../ui/*.ui Qt Designer files + lupdate ../dialogz/*.ui -ts uifiles.ts -no-obsolete + # Get translatable strings from ../../*.py Python files + pylupdate6 ../*.py -ts pyfiles.ts +} + +delete_files() { + # Delete files that are no longer needed + rm uifiles.ts + rm pyfiles.ts + rm -f _${WB}.ts +} + +add_new_locale() { + echo -e "\033[1;33m\n\t<<< Creating '${WB}_${LOCALE}.ts' file >>>\n\033[m" + get_strings + # Join strings from Qt Designer and Python files into temp file + lconvert -i uifiles.ts pyfiles.ts -o _${WB}.ts + # Add generic file + lconvert -i _${WB}.ts -o ${WB}.ts + # Add specified locale file + lconvert -source-language en -target-language $LOCALE \ + -i _${WB}.ts -o ${WB}_${LOCALE}.ts +} + +update_locale() { + echo -e "\033[1;32m\n\t<<< Updating '${WB}_${LOCALE}.ts' file >>>\n\033[m" + get_strings + # Join strings from Qt Designer and Python files + lconvert -i uifiles.ts pyfiles.ts -o _${WB}.ts + # Join newly created file with older file (-no-obsolete) + # Update generic file + lconvert -i _${WB}.ts ${WB}.ts -o ${WB}.ts + # Update specified locale file + lconvert -source-language en -target-language $LOCALE \ + -i _${WB}.ts ${WB}_${LOCALE}.ts -o ${WB}_${LOCALE}.ts +} + +release_translation() { + # Release translation (creation of *.qm file from *.ts file) + lrelease ${WB}_${LOCALE}.ts +} + +# Main function ------------------------------------------------------------------------------------ + +WB="dodo" +LOCALE="$1" + +if is_locale_supported "$LOCALE"; then + if [ "$2" == "-r" ]; then + release_translation + else + if [ ! -f "${WB}_${LOCALE}.ts" ]; then + add_new_locale + else + update_locale + fi + delete_files + fi +else + echo "Verify your language code. Case sensitive." + echo "If it's correct ask a maintainer to add support for your language on FreeCAD." +fi From 4433ead4866b11cf872e27f15d27a9b958dcb2a7 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 14 Mar 2024 15:14:05 -0600 Subject: [PATCH 027/135] Mark missing strings for translation --- CUtils.py | 317 +++++++++++++--------- fForms.py | 1 + fObservers.py | 431 +++++++++++++++++------------ uCmd.py | 735 ++++++++++++++++++++++++++++---------------------- 4 files changed, 870 insertions(+), 614 deletions(-) diff --git a/CUtils.py b/CUtils.py index 96111eb..c3d20bc 100644 --- a/CUtils.py +++ b/CUtils.py @@ -1,163 +1,230 @@ -#(c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD -__license__="LGPL 3" +__license__ = "LGPL 3" # import FreeCAD modules -import FreeCAD, FreeCADGui,inspect , os +import FreeCAD, FreeCADGui, inspect, os from PySide.QtCore import QT_TRANSLATE_NOOP # helper ------------------------------------------------------------------- # FreeCAD TemplatePyMod module # (c) 2007 Juergen Riegel LGPL -def addCommand(name,cmdObject): - (list,num) = inspect.getsourcelines(cmdObject.Activated) - pos = 0 - # check for indentation - while(list[1][pos] == ' ' or list[1][pos] == '\t'): - pos += 1 - source = "" - for i in range(len(list)-1): - source += list[i+1][pos:] - FreeCADGui.addCommand(name,cmdObject,source) - -#--------------------------------------------------------------------------- + +def addCommand(name, cmdObject): + (list, num) = inspect.getsourcelines(cmdObject.Activated) + pos = 0 + # check for indentation + while list[1][pos] == " " or list[1][pos] == "\t": + pos += 1 + source = "" + for i in range(len(list) - 1): + source += list[i + 1][pos:] + FreeCADGui.addCommand(name, cmdObject, source) + + +# --------------------------------------------------------------------------- # The command classes -#--------------------------------------------------------------------------- +# --------------------------------------------------------------------------- + class queryModel: + def Activated(self): + import FreeCAD, FreeCADGui, uForms - def Activated(self): - import FreeCAD, FreeCADGui, uForms - form = uForms.QueryForm(FreeCADGui.Selection) + form = uForms.QueryForm(FreeCADGui.Selection) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "query.svg" + ), + "Accel": "Q,M", + "MenuText": QT_TRANSLATE_NOOP("queryModel", "query the model"), + "ToolTip": QT_TRANSLATE_NOOP("queryModel", "Click objects to print infos"), + } - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","query.svg"), - 'Accel':"Q,M", - 'MenuText':QT_TRANSLATE_NOOP('queryModel','query the model'), - 'ToolTip':QT_TRANSLATE_NOOP('queryModel','Click objects to print infos')} class moveWorkPlane: - ''' - Tool to set the DraftWorkingPlane according existing geometry of - the model. - The normal of plane is set: - * 1st according the selected face, - * then according the plane defined by a curved edge, - * at last according the plane defined by two straight edges. - The origin is set: - * 1st according the selected vertex, - * then according the center of curvature of a curved edge, - * at last according the intersection of two straight edges. - ''' - def Activated(self): - import uCmd - uCmd.setWP() - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","grid.svg"), - 'Accel':"A,W", - 'MenuText':QT_TRANSLATE_NOOP('moveWorkPlane','align Workplane'), - 'ToolTip':QT_TRANSLATE_NOOP('moveWorkPlane','Moves and rotates the drafting workplane with points, edges and faces')} + """ + Tool to set the DraftWorkingPlane according existing geometry of + the model. + The normal of plane is set: + * 1st according the selected face, + * then according the plane defined by a curved edge, + * at last according the plane defined by two straight edges. + The origin is set: + * 1st according the selected vertex, + * then according the center of curvature of a curved edge, + * at last according the intersection of two straight edges. + """ + + def Activated(self): + import uCmd + + uCmd.setWP() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "grid.svg" + ), + "Accel": "A,W", + "MenuText": QT_TRANSLATE_NOOP("moveWorkPlane", "align Workplane"), + "ToolTip": QT_TRANSLATE_NOOP( + "moveWorkPlane", + "Moves and rotates the drafting workplane with points, edges and faces", + ), + } + class rotateWorkPlane: + def Activated(self): + import FreeCAD, FreeCADGui, uForms + + form = uForms.rotWPForm() - def Activated(self): - import FreeCAD, FreeCADGui, uForms - form = uForms.rotWPForm() + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "rotWP.svg" + ), + "Accel": "R,W", + "MenuText": QT_TRANSLATE_NOOP("rotateWorkPlane", "rotate Workplane"), + "ToolTip": QT_TRANSLATE_NOOP( + "rotateWorkPlane", "Spin the Draft working plane about one of its axes" + ), + } - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","rotWP.svg"), - 'Accel':"R,W", - 'MenuText':QT_TRANSLATE_NOOP('rotateWorkPlane','rotate Workplane'), - 'ToolTip':QT_TRANSLATE_NOOP('rotateWorkPlane','Spin the Draft working plane about one of its axes')} class offsetWorkPlane: + def Activated(self): + if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): + import uCmd + + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt( + "gridSize" + ) + sc = [float(x * s) for x in [1, 1, 0.2]] + arrow = uCmd.arrow( + FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s + ) + from PySide.QtGui import QInputDialog as qid + from DraftGui import translate + + offset = qid.getInt( + None, + translate("offsetWorkPlane", "Offset Work Plane"), + translate("offsetWorkPlane", "Offset: "), + ) + if offset[1] > 0: + uCmd.offsetWP(offset[0]) + # FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(arrow.node) + arrow.closeArrow() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "offsetWP.svg" + ), + "Accel": "O,W", + "MenuText": QT_TRANSLATE_NOOP("offsetWorkPlane", "offset Workplane"), + "ToolTip": QT_TRANSLATE_NOOP( + "offsetWorkPlane", "Shifts the WP alongg its normal." + ), + } - def Activated(self): - if hasattr(FreeCAD,'DraftWorkingPlane') and hasattr(FreeCADGui,'Snapper'): - import uCmd - s=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") - sc=[float(x*s) for x in [1,1,.2]] - arrow =uCmd.arrow(FreeCAD.DraftWorkingPlane.getPlacement(),scale=sc,offset=s) - from PySide.QtGui import QInputDialog as qid - from DraftGui import translate - offset=qid.getInt(None, translate('offsetWorkPlane','Offset Work Plane'), translate('offsetWorkPlane','Offset: ')) - if offset[1]>0: - uCmd.offsetWP(offset[0]) - #FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(arrow.node) - arrow.closeArrow() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","offsetWP.svg"), - 'Accel':"O,W", - 'MenuText':QT_TRANSLATE_NOOP('offsetWorkPlane','offset Workplane'), - 'ToolTip':QT_TRANSLATE_NOOP('offsetWorkPlane','Shifts the WP alongg its normal.')} class hackedL: + def Activated(self): + import uCmd - def Activated(self): - import uCmd - form = uCmd.hackedLine() + form = uCmd.hackedLine() - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","hackedL.svg"), - 'Accel':"H,L", - 'MenuText':QT_TRANSLATE_NOOP('hackedL','draw a DWire'), - 'ToolTip':QT_TRANSLATE_NOOP('hackedL','WP is re-positioned at each point. Possible to spin and offset it.')} + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "hackedL.svg" + ), + "Accel": "H,L", + "MenuText": QT_TRANSLATE_NOOP("hackedL", "draw a DWire"), + "ToolTip": QT_TRANSLATE_NOOP( + "hackedL", + "WP is re-positioned at each point. Possible to spin and offset it.", + ), + } -class moveHandle: - def Activated(self): - import uCmd - FreeCADGui.Control.showDialog(uCmd.handleDialog()) - #form = uCmd.handleDialog() +class moveHandle: + def Activated(self): + import uCmd - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","moveHandle.svg"), - 'Accel':"M,H", - 'MenuText':QT_TRANSLATE_NOOP('moveHandle','Move objects'), - 'ToolTip':QT_TRANSLATE_NOOP('moveHandle','Move quickly objects inside viewport')} + FreeCADGui.Control.showDialog(uCmd.handleDialog()) + # form = uCmd.handleDialog() -class dpCalc: + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "moveHandle.svg" + ), + "Accel": "M,H", + "MenuText": QT_TRANSLATE_NOOP("moveHandle", "Move objects"), + "ToolTip": QT_TRANSLATE_NOOP( + "moveHandle", "Move quickly objects inside viewport" + ), + } - def Activated(self): - import uForms - FreeCADGui.Control.showDialog(uForms.dpCalcDialog()) - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","delta.svg"), - 'MenuText':QT_TRANSLATE_NOOP('dpCalc','Pressure loss calculator'), - 'ToolTip':QT_TRANSLATE_NOOP('dpCalc','Calculate pressure loss in "pypes" using ChEDL libraries.\n See __doc__ of the module for futher information.')} +class dpCalc: + def Activated(self): + import uForms -class selectSolids: + FreeCADGui.Control.showDialog(uForms.dpCalcDialog()) - def Activated(self): - from fCmd import getSolids - if FreeCADGui.Selection.getSelection(): allDoc=False - else: allDoc=True - getSolids(allDoc) + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "delta.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("dpCalc", "Pressure loss calculator"), + "ToolTip": QT_TRANSLATE_NOOP( + "dpCalc", + 'Calculate pressure loss in "pypes" using ChEDL libraries.\n See __doc__ of the module for futher information.', + ), + } - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)), - "iconz","solids.svg"), - 'MenuText':QT_TRANSLATE_NOOP('selectSolids','Select solids'), - 'ToolTip':QT_TRANSLATE_NOOP('selectSolids','Grab all solids or those partially selected\n to export in .step format')} -#--------------------------------------------------------------------------- +class selectSolids: + def Activated(self): + from fCmd import getSolids + + if FreeCADGui.Selection.getSelection(): + allDoc = False + else: + allDoc = True + getSolids(allDoc) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "solids.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("selectSolids", "Select solids"), + "ToolTip": QT_TRANSLATE_NOOP( + "selectSolids", + "Grab all solids or those partially selected\n to export in .step format", + ), + } + + +# --------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager -#--------------------------------------------------------------------------- -addCommand('queryModel',queryModel()) -addCommand('moveWorkPlane',moveWorkPlane()) -addCommand('rotateWorkPlane',rotateWorkPlane()) -addCommand('offsetWorkPlane',offsetWorkPlane()) -addCommand('hackedL',hackedL()) -addCommand('moveHandle',moveHandle()) -addCommand('dpCalc',dpCalc()) -addCommand('selectSolids',selectSolids()) +# --------------------------------------------------------------------------- +addCommand("queryModel", queryModel()) +addCommand("moveWorkPlane", moveWorkPlane()) +addCommand("rotateWorkPlane", rotateWorkPlane()) +addCommand("offsetWorkPlane", offsetWorkPlane()) +addCommand("hackedL", hackedL()) +addCommand("moveHandle", moveHandle()) +addCommand("dpCalc", dpCalc()) +addCommand("selectSolids", selectSolids()) diff --git a/fForms.py b/fForms.py index 2579499..fcbc016 100644 --- a/fForms.py +++ b/fForms.py @@ -399,6 +399,7 @@ def __init__(self): icon = QIcon() icon.addPixmap(z[0], QIcon.Normal, QIcon.Off) z[1].setIcon(icon) + # TODO: translation def setProfile(self, typeS): if typeS=='square': self.form.labImg.setPixmap(pixSquare) diff --git a/fObservers.py b/fObservers.py index 182844c..c2e3047 100644 --- a/fObservers.py +++ b/fObservers.py @@ -1,196 +1,281 @@ -#(c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD -__title__="frameTools selection observers" -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" +__title__ = "frameTools selection observers" +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" import FreeCAD, FreeCADGui, fCmd from DraftGui import translate -class frameObserverPrototype(object): - def __init__(self,msg): - self.beam=self.edge=None - FreeCADGui.Selection.clearSelection() - try: - self.av=FreeCADGui.activeDocument().activeView() - self.stop=self.av.addEventCallback("SoKeyboardEvent",self.goOut) - FreeCAD.Console.PrintMessage('\n'+msg+'\n') - FreeCAD.Console.PrintWarning('*** [ESC] to exit. ***\n') - except: - FreeCAD.Console.PrintError('No view available\n') - FreeCADGui.Selection.removeObserver(self) - def goOut(self,info): - down = (info["State"] == "DOWN") - k=info['Key'] - if k=="ESCAPE": - FreeCAD.Console.PrintMessage("I'm escaping.\n") - self.av.removeEventCallback("SoKeyboardEvent",self.stop) - FreeCADGui.Selection.removeObserver(self) - -class frameItObserver(frameObserverPrototype): + +class frameObserverPrototype(object): + def __init__(self, msg): + self.beam = self.edge = None + FreeCADGui.Selection.clearSelection() + try: + self.av = FreeCADGui.activeDocument().activeView() + self.stop = self.av.addEventCallback("SoKeyboardEvent", self.goOut) + FreeCAD.Console.PrintMessage("\n" + msg + "\n") + FreeCAD.Console.PrintWarning("*** [ESC] to exit. ***\n") + except: + FreeCAD.Console.PrintError("No view available\n") + FreeCADGui.Selection.removeObserver(self) + + def goOut(self, info): + down = info["State"] == "DOWN" + k = info["Key"] + if k == "ESCAPE": + FreeCAD.Console.PrintMessage("I'm escaping.\n") + self.av.removeEventCallback("SoKeyboardEvent", self.stop) + FreeCADGui.Selection.removeObserver(self) + + +class frameItObserver(frameObserverPrototype): def __init__(self): - super(frameItObserver,self).__init__(translate("fObservers", "Select one beam and one edge")) - self.beam=self.edge=None - def addSelection(self,doc,obj,sub,pnt): - selex=FreeCADGui.Selection.getSelectionEx() - if self.beam==None and hasattr(selex[len(selex)-1].Object,'Height'): - self.beam=selex[len(selex)-1].Object - FreeCAD.Console.PrintMessage('Beam selected\n') - elif self.edge==None and selex[len(selex)-1].SubObjects[0].ShapeType=='Edge': - self.edge=selex[len(selex)-1].SubObjects[0] - FreeCAD.Console.PrintMessage('Edge selected\n') - if self.edge!=None and self.beam!=None: - fCmd.placeTheBeam(self.beam,self.edge) - FreeCAD.Console.PrintMessage('Beam placed.\n') - FreeCAD.Console.PrintWarning('Select another beam and another edge.\n[ESC] to exit.\n') - self.beam=self.edge=None - FreeCAD.activeDocument().recompute() - -class fillFrameObserver(frameObserverPrototype): + super(frameItObserver, self).__init__( + translate("fObservers", "Select one beam and one edge") + ) + self.beam = self.edge = None + + def addSelection(self, doc, obj, sub, pnt): + selex = FreeCADGui.Selection.getSelectionEx() + if self.beam == None and hasattr(selex[len(selex) - 1].Object, "Height"): + self.beam = selex[len(selex) - 1].Object + FreeCAD.Console.PrintMessage("Beam selected\n") + elif ( + self.edge == None + and selex[len(selex) - 1].SubObjects[0].ShapeType == "Edge" + ): + self.edge = selex[len(selex) - 1].SubObjects[0] + FreeCAD.Console.PrintMessage("Edge selected\n") + if self.edge != None and self.beam != None: + fCmd.placeTheBeam(self.beam, self.edge) + FreeCAD.Console.PrintMessage("Beam placed.\n") + FreeCAD.Console.PrintWarning( + "Select another beam and another edge.\n[ESC] to exit.\n" + ) + self.beam = self.edge = None + FreeCAD.activeDocument().recompute() + + +class fillFrameObserver(frameObserverPrototype): def __init__(self): - super(fillFrameObserver,self).__init__(translate("fObservers", "First select the base beam, then the edges")) - self.beam=None - def addSelection(self,doc,obj,sub,pnt): - if self.beam==None and FreeCAD.getDocument(doc).getObject(obj).TypeId=='Part::FeaturePython': - self.beam=FreeCAD.getDocument(doc).getObject(obj) - FreeCAD.Console.PrintMessage('Beam type selected.\n') + super(fillFrameObserver, self).__init__( + translate("fObservers", "First select the base beam, then the edges") + ) + self.beam = None + + def addSelection(self, doc, obj, sub, pnt): + if ( + self.beam == None + and FreeCAD.getDocument(doc).getObject(obj).TypeId == "Part::FeaturePython" + ): + self.beam = FreeCAD.getDocument(doc).getObject(obj) + FreeCAD.Console.PrintMessage("Beam type selected.\n") else: - subObject=FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) - if subObject.ShapeType=="Edge" and self.beam!=None: - fCmd.placeTheBeam(FreeCAD.activeDocument().copyObject(self.beam,True),subObject) + subObject = FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) + if subObject.ShapeType == "Edge" and self.beam != None: + fCmd.placeTheBeam( + FreeCAD.activeDocument().copyObject(self.beam, True), subObject + ) + class levelBeamObserver(frameObserverPrototype): def __init__(self): - super(levelBeamObserver,self).__init__(translate("fObservers", "First select the target plane, then the faces to align")) - self.targetFace=None - def addSelection(self,doc,obj,sub,pnt): - subObject=FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) - if subObject.ShapeType=="Face": - if self.targetFace==None: - self.targetFace=subObject - FreeCAD.Console.PrintMessage('Target face selected.\n') - else: - beam=FreeCAD.getDocument(doc).getObject(obj) - FreeCAD.activeDocument().openTransaction(translate("fObservers", "levelTheBeam", "Transaction")) - fCmd.levelTheBeam(beam,[self.targetFace,subObject]) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.Console.PrintMessage('Face moved.\n') - FreeCAD.Console.PrintWarning('Select another face or press [ESC].\n') + super(levelBeamObserver, self).__init__( + translate( + "fObservers", "First select the target plane, then the faces to align" + ) + ) + self.targetFace = None + + def addSelection(self, doc, obj, sub, pnt): + subObject = FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) + if subObject.ShapeType == "Face": + if self.targetFace == None: + self.targetFace = subObject + FreeCAD.Console.PrintMessage("Target face selected.\n") + else: + beam = FreeCAD.getDocument(doc).getObject(obj) + FreeCAD.activeDocument().openTransaction( + translate("fObservers", "levelTheBeam", "Transaction") + ) + fCmd.levelTheBeam(beam, [self.targetFace, subObject]) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.Console.PrintMessage("Face moved.\n") + FreeCAD.Console.PrintWarning("Select another face or press [ESC].\n") + class alignFlangeObserver(frameObserverPrototype): def __init__(self): - super(alignFlangeObserver,self).__init__(translate("fObservers", "Select the target face, then the others")) - self.faceBase=None - def addSelection(self,doc,obj,sub,pnt): - subObject=FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) - if subObject.ShapeType=="Face": - if self.faceBase==None: - self.faceBase=subObject - FreeCAD.Console.PrintMessage('Target face selected.\n') - else: - FreeCAD.activeDocument().openTransaction(translate("fObservers", "alignFlange", "Transaction")) - fCmd.rotTheBeam(FreeCAD.getDocument(doc).getObject(obj),self.faceBase,subObject) - FreeCAD.activeDocument().commitTransaction() + super(alignFlangeObserver, self).__init__( + translate("fObservers", "Select the target face, then the others") + ) + self.faceBase = None + + def addSelection(self, doc, obj, sub, pnt): + subObject = FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) + if subObject.ShapeType == "Face": + if self.faceBase == None: + self.faceBase = subObject + FreeCAD.Console.PrintMessage("Target face selected.\n") + else: + FreeCAD.activeDocument().openTransaction( + translate("fObservers", "alignFlange", "Transaction") + ) + fCmd.rotTheBeam( + FreeCAD.getDocument(doc).getObject(obj), self.faceBase, subObject + ) + FreeCAD.activeDocument().commitTransaction() + class alignEdgeObserver(frameObserverPrototype): def __init__(self): - super(alignEdgeObserver,self).__init__(translate("fObservers", "Select two edges to join.")) - self.edges=[] - def addSelection(self,doc,obj,sub,pnt): - subObject=FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) - if subObject.ShapeType=="Edge": - self.edges.append(subObject) - FreeCAD.Console.PrintMessage("Edge"+str(len(self.edges))+" OK\n") - if len(self.edges)>1: - sel=FreeCADGui.Selection.getSelection() - beam=sel[len(sel)-1] - FreeCAD.activeDocument().openTransaction(translate("fObservers", "joinTheBeamsEdges", "Transaction")) - fCmd.joinTheBeamsEdges(beam,self.edges[0],self.edges[1]) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.Console.PrintMessage('Done.\n') - self.edges=[] - FreeCAD.Console.PrintWarning('Select other edges or [ESC] to exit\n') - -class stretchBeamObserver(frameObserverPrototype): #OBSOLETE: replaced with dialog - def __init__(self): - super(stretchBeamObserver,self).__init__(translate("fObservers", "Select the beam and input the length")) - self.beam=None - def addSelection(self,doc,obj,sub,pnt): - Obj=FreeCAD.getDocument(doc).getObject(obj) - if self.beam==None and Obj.TypeId=='Part::FeaturePython' and hasattr(Obj,'Height'): - self.beam=Obj - FreeCAD.Console.PrintMessage('Beam type selected.\n') - from PySide.QtGui import QInputDialog as qid - dist=float(qid.getText(None,"stretch a beam","old length = "+str(self.beam.Height)+"\nnew length?")[0]) - fCmd.stretchTheBeam(self.beam,dist) - FreeCAD.activeDocument().recompute() - self.av.removeEventCallback("SoKeyboardEvent",self.stop) - FreeCADGui.Selection.removeObserver(self) - FreeCAD.Console.PrintMessage("I quit.") - -class extendObserver(frameObserverPrototype): #OBSOLETE: replaced with dialog + super(alignEdgeObserver, self).__init__( + translate("fObservers", "Select two edges to join.") + ) + self.edges = [] + + def addSelection(self, doc, obj, sub, pnt): + subObject = FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) + if subObject.ShapeType == "Edge": + self.edges.append(subObject) + FreeCAD.Console.PrintMessage("Edge" + str(len(self.edges)) + " OK\n") + if len(self.edges) > 1: + sel = FreeCADGui.Selection.getSelection() + beam = sel[len(sel) - 1] + FreeCAD.activeDocument().openTransaction( + translate("fObservers", "joinTheBeamsEdges", "Transaction") + ) + fCmd.joinTheBeamsEdges(beam, self.edges[0], self.edges[1]) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.Console.PrintMessage("Done.\n") + self.edges = [] + FreeCAD.Console.PrintWarning("Select other edges or [ESC] to exit\n") + + +class stretchBeamObserver(frameObserverPrototype): # OBSOLETE: replaced with dialog def __init__(self): - super(extendObserver,self).__init__(translate("fObservers", "First Select the target shape, then the beams to extend.")) - self.target=None - def addSelection(self,doc,obj,sub,pnt): - lastSel=FreeCAD.getDocument(doc).getObject(obj) - subLastSel=lastSel.Shape.getElement(sub) - if lastSel.TypeId=='Part::FeaturePython' and hasattr(lastSel,"Height") and self.target!=None: - fCmd.extendTheBeam(lastSel,self.target) - if self.target==None and subLastSel.ShapeType in ["Edge","Face","Vertex"]: - self.target=subLastSel - FreeCAD.Console.PrintMessage('Target selected.\n') - -class adjustAngleObserver(frameObserverPrototype): + super(stretchBeamObserver, self).__init__( + translate("fObservers", "Select the beam and input the length") + ) + self.beam = None + + def addSelection(self, doc, obj, sub, pnt): + Obj = FreeCAD.getDocument(doc).getObject(obj) + if ( + self.beam == None + and Obj.TypeId == "Part::FeaturePython" + and hasattr(Obj, "Height") + ): + self.beam = Obj + FreeCAD.Console.PrintMessage("Beam type selected.\n") + from PySide.QtGui import QInputDialog as qid + + dist = float( + qid.getText( + None, + "stretch a beam", + "old length = " + str(self.beam.Height) + "\nnew length?", + )[0] + ) + fCmd.stretchTheBeam(self.beam, dist) + FreeCAD.activeDocument().recompute() + self.av.removeEventCallback("SoKeyboardEvent", self.stop) + FreeCADGui.Selection.removeObserver(self) + FreeCAD.Console.PrintMessage("I quit.") + + +class extendObserver(frameObserverPrototype): # OBSOLETE: replaced with dialog def __init__(self): - super(adjustAngleObserver,self).__init__(translate("fObservers", "Select 2 edges")) - self.edges=[] - self.beams=[] - def addSelection(self,doc,obj,sub,pnt): - lastSel=FreeCAD.getDocument(doc).getObject(obj) - subLastSel=lastSel.Shape.getElement(sub) - if lastSel.TypeId=='Part::FeaturePython' and hasattr(lastSel,"Height") and subLastSel.ShapeType=="Edge": - self.edges.append(subLastSel) - self.beams.append(lastSel) - FreeCAD.Console.PrintMessage('Edge/beam pair nr.'+str(len(self.edges))+' selected.\n') - if (len(self.edges)==len(self.beams)==2): - if fCmd.isOrtho(*self.edges): - self.beams.reverse() - FreeCAD.ActiveDocument.openTransaction(translate("fObservers", "Adjust angle", "Transaction")) - for i in range(len(self.edges)): - fCmd.extendTheBeam(self.beams[i],self.edges[i]) - FreeCAD.ActiveDocument.commitTransaction() - FreeCAD.Console.PrintWarning("Adjustment executed.\n") - else: - FreeCAD.Console.PrintError("Edges must be orthogonal.\n") - self.edges=[] - self.beams=[] - FreeCADGui.Selection.clearSelection() - FreeCAD.activeDocument().recompute() - FreeCAD.Console.PrintWarning("Repeat selection or press [ESC]\n") + super(extendObserver, self).__init__( + translate( + "fObservers", "First Select the target shape, then the beams to extend." + ) + ) + self.target = None + + def addSelection(self, doc, obj, sub, pnt): + lastSel = FreeCAD.getDocument(doc).getObject(obj) + subLastSel = lastSel.Shape.getElement(sub) + if ( + lastSel.TypeId == "Part::FeaturePython" + and hasattr(lastSel, "Height") + and self.target != None + ): + fCmd.extendTheBeam(lastSel, self.target) + if self.target == None and subLastSel.ShapeType in ["Edge", "Face", "Vertex"]: + self.target = subLastSel + FreeCAD.Console.PrintMessage("Target selected.\n") + -class rotjoinObserver(frameObserverPrototype): # OBSOLETE +class adjustAngleObserver(frameObserverPrototype): def __init__(self): - super(rotjoinObserver,self).__init__(translate("fObservers", "Select 2 edges =>[Ctrl]+select")) - self.edges=[] - def addSelection(self,doc,obj,sub,pnt): - lastSel=FreeCAD.getDocument(doc).getObject(obj) - subLastSel=lastSel.Shape.getElement(sub) - if subLastSel.ShapeType=="Edge": - self.edges.append(subLastSel) - FreeCAD.Console.PrintMessage('Edge'+str(len(self.edges))+' OK.\n') - if len(self.edges)==2: - try: - FreeCAD.activeDocument().openTransaction(translate("fObservers", "rotJoin", "Transaction")) - fCmd.rotjoinTheBeam() - FreeCAD.activeDocument().commitTransaction() - FreeCAD.activeDocument().recompute() - FreeCAD.Console.PrintWarning("Edges aligned.\n") - except: - FreeCAD.Console.PrintError("Edges must be selected holding [Ctrl] down for the correct execution. \nRetry.\n") - self.edges=[] - FreeCADGui.Selection.clearSelection() - FreeCAD.Console.PrintWarning("Repeat selection or press [ESC]\n") + super(adjustAngleObserver, self).__init__( + translate("fObservers", "Select 2 edges") + ) + self.edges = [] + self.beams = [] + + def addSelection(self, doc, obj, sub, pnt): + lastSel = FreeCAD.getDocument(doc).getObject(obj) + subLastSel = lastSel.Shape.getElement(sub) + if ( + lastSel.TypeId == "Part::FeaturePython" + and hasattr(lastSel, "Height") + and subLastSel.ShapeType == "Edge" + ): + self.edges.append(subLastSel) + self.beams.append(lastSel) + FreeCAD.Console.PrintMessage( + "Edge/beam pair nr." + str(len(self.edges)) + " selected.\n" + ) + if len(self.edges) == len(self.beams) == 2: + if fCmd.isOrtho(*self.edges): + self.beams.reverse() + FreeCAD.ActiveDocument.openTransaction( + translate("fObservers", "Adjust angle", "Transaction") + ) + for i in range(len(self.edges)): + fCmd.extendTheBeam(self.beams[i], self.edges[i]) + FreeCAD.ActiveDocument.commitTransaction() + FreeCAD.Console.PrintWarning("Adjustment executed.\n") + else: + FreeCAD.Console.PrintError("Edges must be orthogonal.\n") + self.edges = [] + self.beams = [] + FreeCADGui.Selection.clearSelection() + FreeCAD.activeDocument().recompute() + FreeCAD.Console.PrintWarning("Repeat selection or press [ESC]\n") +class rotjoinObserver(frameObserverPrototype): # OBSOLETE + def __init__(self): + super(rotjoinObserver, self).__init__( + translate("fObservers", "Select 2 edges =>[Ctrl]+select") + ) + self.edges = [] + + def addSelection(self, doc, obj, sub, pnt): + lastSel = FreeCAD.getDocument(doc).getObject(obj) + subLastSel = lastSel.Shape.getElement(sub) + if subLastSel.ShapeType == "Edge": + self.edges.append(subLastSel) + FreeCAD.Console.PrintMessage("Edge" + str(len(self.edges)) + " OK.\n") + if len(self.edges) == 2: + try: + FreeCAD.activeDocument().openTransaction( + translate("fObservers", "rotJoin", "Transaction") + ) + fCmd.rotjoinTheBeam() + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + FreeCAD.Console.PrintWarning("Edges aligned.\n") + except: + FreeCAD.Console.PrintError( + "Edges must be selected holding [Ctrl] down for the correct execution. \nRetry.\n" + ) + self.edges = [] + FreeCADGui.Selection.clearSelection() + FreeCAD.Console.PrintWarning("Repeat selection or press [ESC]\n") diff --git a/uCmd.py b/uCmd.py index 310450f..1305a23 100644 --- a/uCmd.py +++ b/uCmd.py @@ -1,337 +1,440 @@ +# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD -#(c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD - -__license__="LGPL 3" +__license__ = "LGPL 3" import FreeCAD, FreeCADGui, fCmd, dodoDialogs from os.path import join, dirname, abspath from DraftGui import translate from pivy import coin -def setWP(): #TARGET [working]: deal with App::Parts - 'function to change working plane' - import FreeCAD, FreeCADGui, fCmd - normal=point=None - curves=[] - straight=[] - Z=FreeCAD.Vector(0,0,1) - for edge in fCmd.edges(): - if edge.curvatureAt(0)!=0: - curves.append(edge) + +def setWP(): # TARGET [working]: deal with App::Parts + "function to change working plane" + import FreeCAD, FreeCADGui, fCmd + + normal = point = None + curves = [] + straight = [] + Z = FreeCAD.Vector(0, 0, 1) + for edge in fCmd.edges(): + if edge.curvatureAt(0) != 0: + curves.append(edge) + else: + straight.append(edge) + # define normal: 1st from face->2nd from curve->3rd from straight edges + if fCmd.faces(): + normal = fCmd.faces()[0].normalAt(0, 0) + elif curves: + normal = curves[0].tangentAt(0).cross(curves[0].normalAt(0)) + elif len(straight) > 1: + if straight and not fCmd.isParallel( + straight[0].tangentAt(0), straight[1].tangentAt(0) + ): + normal = straight[0].tangentAt(0).cross(straight[1].tangentAt(0)) + elif FreeCADGui.Selection.getSelection(): + normal = FreeCAD.DraftWorkingPlane.getRotation().multVec(Z) else: - straight.append(edge) - # define normal: 1st from face->2nd from curve->3rd from straight edges - if fCmd.faces(): - normal=fCmd.faces()[0].normalAt(0,0) - elif curves: - normal=curves[0].tangentAt(0).cross(curves[0].normalAt(0)) - elif len(straight)>1: - if straight and not fCmd.isParallel(straight[0].tangentAt(0),straight[1].tangentAt(0)): - normal=straight[0].tangentAt(0).cross(straight[1].tangentAt(0)) - elif FreeCADGui.Selection.getSelection(): - normal=FreeCAD.DraftWorkingPlane.getRotation().multVec(Z) - else: - normal=Z - # define point: 1st from vertex->2nd from centerOfCurvature->3rd from intersection->4th from center of edge - points=[v.Point for sx in FreeCADGui.Selection.getSelectionEx() for v in sx.SubObjects if v.ShapeType=='Vertex'] - if not points: - points=[edge.centerOfCurvatureAt(0) for edge in curves] - if not points and len(straight)>1: - inters=fCmd.intersectionCLines(straight[0],straight[1]) - if inters: - points.append(inters) - if not points and len(straight): - points.append(straight[0].CenterOfMass) - if points: - point=points[0] - else: - point=FreeCAD.Vector() - # move the draft WP - FreeCAD.DraftWorkingPlane.alignToPointAndAxis(point,normal) - FreeCADGui.Snapper.setGrid() -def rotWP(ax=None,ang=45): - import FreeCAD, FreeCADGui - if not ax: - ax=FreeCAD.Vector(0,0,1) - if hasattr(FreeCAD,'DraftWorkingPlane') and hasattr(FreeCADGui,'Snapper'): - pl=FreeCAD.DraftWorkingPlane.getPlacement() - pRot=FreeCAD.Placement(FreeCAD.Vector(),FreeCAD.Rotation(ax,ang)) - newpl=pl.multiply(pRot) - FreeCAD.DraftWorkingPlane.setFromPlacement(newpl) + normal = Z + # define point: 1st from vertex->2nd from centerOfCurvature->3rd from intersection->4th from center of edge + points = [ + v.Point + for sx in FreeCADGui.Selection.getSelectionEx() + for v in sx.SubObjects + if v.ShapeType == "Vertex" + ] + if not points: + points = [edge.centerOfCurvatureAt(0) for edge in curves] + if not points and len(straight) > 1: + inters = fCmd.intersectionCLines(straight[0], straight[1]) + if inters: + points.append(inters) + if not points and len(straight): + points.append(straight[0].CenterOfMass) + if points: + point = points[0] + else: + point = FreeCAD.Vector() + # move the draft WP + FreeCAD.DraftWorkingPlane.alignToPointAndAxis(point, normal) FreeCADGui.Snapper.setGrid() - return newpl + + +def rotWP(ax=None, ang=45): + import FreeCAD, FreeCADGui + + if not ax: + ax = FreeCAD.Vector(0, 0, 1) + if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): + pl = FreeCAD.DraftWorkingPlane.getPlacement() + pRot = FreeCAD.Placement(FreeCAD.Vector(), FreeCAD.Rotation(ax, ang)) + newpl = pl.multiply(pRot) + FreeCAD.DraftWorkingPlane.setFromPlacement(newpl) + FreeCADGui.Snapper.setGrid() + return newpl + + def offsetWP(delta): - import FreeCAD,FreeCADGui - if hasattr(FreeCAD,'DraftWorkingPlane') and hasattr(FreeCADGui,'Snapper'): - rot=FreeCAD.DraftWorkingPlane.getPlacement().Rotation - offset=rot.multVec(FreeCAD.Vector(0,0,delta)) - point=FreeCAD.DraftWorkingPlane.getPlacement().Base+offset - FreeCAD.DraftWorkingPlane.alignToPointAndAxis(point,offset) - FreeCADGui.Snapper.setGrid() + import FreeCAD, FreeCADGui + + if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): + rot = FreeCAD.DraftWorkingPlane.getPlacement().Rotation + offset = rot.multVec(FreeCAD.Vector(0, 0, delta)) + point = FreeCAD.DraftWorkingPlane.getPlacement().Base + offset + FreeCAD.DraftWorkingPlane.alignToPointAndAxis(point, offset) + FreeCADGui.Snapper.setGrid() + + def getSubElement(): - subelements=list() - for sx in FreeCADGui.Selection.getSelectionEx(): - obj=sx.Object - for name in sx.SubElementNames: - subelements.append((obj.Shape.getElement(name),name)) - return subelements - + subelements = list() + for sx in FreeCADGui.Selection.getSelectionEx(): + obj = sx.Object + for name in sx.SubElementNames: + subelements.append((obj.Shape.getElement(name), name)) + return subelements + + class arrow(object): - ''' - This class draws a green arrow to be used as an auxiliary compass - to show position and orientation of objects. - arrow(pl=None, scale=[100,100,20],offset=100,name='ARROW') - ''' - def __init__(self,pl=None, scale=[100,100,20],offset=100,name='ARROW'): - # define main properties - self.view=FreeCADGui.ActiveDocument.ActiveView - self.sg=self.view.getSceneGraph() - self.cb=self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.pickCB) - # define OpenInventor properties - self.node=coin.SoSeparator() #self.node=coin.SoSelection() - self.name=name - self.node.setName(self.name) - self.color=coin.SoBaseColor(); self.color.rgb=0,0.8,0 - self.transform=coin.SoTransform(); self.transform.scaleFactor.setValue(scale) - self.cone=coin.SoCone() - # create children of node - self.node.addChild(self.color) - self.node.addChild(self.transform) - self.node.addChild(self.cone) - # draw the arrow and move it to its Placement with the specified offset - self.sg.addChild(self.node) - self.offset=offset - if not pl: - pl=FreeCAD.Placement() - self.moveto(pl) - def closeArrow(self): - self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.cb) - self.sg.removeChild(self.node) - def moveto(self,pl): - import FreeCAD - rotx90=FreeCAD.Base.Rotation(FreeCAD.Vector(0,1,0),FreeCAD.Vector(0,0,1)) - self.Placement=pl - self.transform.rotation.setValue(tuple(self.Placement.Rotation.multiply(rotx90).Q)) - offsetV=self.Placement.Rotation.multVec(FreeCAD.Vector(0,0,self.offset)) - self.transform.translation.setValue(tuple(self.Placement.Base+offsetV)) - def pickCB(self, ecb): - event=ecb.getEvent() - arg=None - if event.getState()==coin.SoMouseButtonEvent.DOWN: - render_manager=self.view.getViewer().getSoRenderManager() - doPick=coin.SoRayPickAction(render_manager.getViewportRegion()) - doPick.setPoint(coin.SbVec2s(*ecb.getEvent().getPosition())) - doPick.apply(render_manager.getSceneGraph()) - points=doPick.getPickedPointList() - if points.getLength(): - path=points[0].getPath() - if str(tuple(path)[-2].getName())==self.name: self.pickAction(path,event,arg) - def pickAction(self,path=None,event=None,arg=None): # sample - if path: - for n in path: - if str(n.getName())==self.name: - FreeCAD.Console.PrintMessage("You hit the %s\n"%self.name) #replace here the action to perform - self.closeArrow() + """ + This class draws a green arrow to be used as an auxiliary compass + to show position and orientation of objects. + arrow(pl=None, scale=[100,100,20],offset=100,name='ARROW') + """ + + def __init__(self, pl=None, scale=[100, 100, 20], offset=100, name="ARROW"): + # define main properties + self.view = FreeCADGui.ActiveDocument.ActiveView + self.sg = self.view.getSceneGraph() + self.cb = self.view.addEventCallbackPivy( + coin.SoMouseButtonEvent.getClassTypeId(), self.pickCB + ) + # define OpenInventor properties + self.node = coin.SoSeparator() # self.node=coin.SoSelection() + self.name = name + self.node.setName(self.name) + self.color = coin.SoBaseColor() + self.color.rgb = 0, 0.8, 0 + self.transform = coin.SoTransform() + self.transform.scaleFactor.setValue(scale) + self.cone = coin.SoCone() + # create children of node + self.node.addChild(self.color) + self.node.addChild(self.transform) + self.node.addChild(self.cone) + # draw the arrow and move it to its Placement with the specified offset + self.sg.addChild(self.node) + self.offset = offset + if not pl: + pl = FreeCAD.Placement() + self.moveto(pl) + + def closeArrow(self): + self.view.removeEventCallbackPivy( + coin.SoMouseButtonEvent.getClassTypeId(), self.cb + ) + self.sg.removeChild(self.node) + + def moveto(self, pl): + import FreeCAD + + rotx90 = FreeCAD.Base.Rotation(FreeCAD.Vector(0, 1, 0), FreeCAD.Vector(0, 0, 1)) + self.Placement = pl + self.transform.rotation.setValue( + tuple(self.Placement.Rotation.multiply(rotx90).Q) + ) + offsetV = self.Placement.Rotation.multVec(FreeCAD.Vector(0, 0, self.offset)) + self.transform.translation.setValue(tuple(self.Placement.Base + offsetV)) + + def pickCB(self, ecb): + event = ecb.getEvent() + arg = None + if event.getState() == coin.SoMouseButtonEvent.DOWN: + render_manager = self.view.getViewer().getSoRenderManager() + doPick = coin.SoRayPickAction(render_manager.getViewportRegion()) + doPick.setPoint(coin.SbVec2s(*ecb.getEvent().getPosition())) + doPick.apply(render_manager.getSceneGraph()) + points = doPick.getPickedPointList() + if points.getLength(): + path = points[0].getPath() + if str(tuple(path)[-2].getName()) == self.name: + self.pickAction(path, event, arg) + + def pickAction(self, path=None, event=None, arg=None): # sample + if path: + for n in path: + if str(n.getName()) == self.name: + FreeCAD.Console.PrintMessage( + "You hit the %s\n" % self.name + ) # replace here the action to perform + self.closeArrow() + class arrow_move(arrow): - ''' - arrow_move(edit,edit2,pl=None,direct=None,M=100) - edit,edit2: displacement and angle QLineEdit widgets - pl: the placement of the arrow - direct: the displacement vector - M: the scale of display - This class derives from "arrow" and adds the ability to move the selected - objects when the arrow is picked. This is accomplished by redefining the - method "pickAction". - ''' - def __init__(self, edit, edit2, pl=None, direct=None, M=100.0, objs=None): - self.objs=objs - self.edge=None - self.edit=edit - self.edit2=edit2 - # define direction - self.scale=M - if direct: self.direct=direct - else: self.direct=FreeCAD.Vector(0,0,1)*M - # define placement - if not pl:pl=FreeCAD.Placement() - # draw arrow - super(arrow_move,self).__init__(pl=pl, scale=[M/2,M/2,M/10], offset=M/2) - def pickAction(self,path=None,event=None,arg=None): - FreeCAD.activeDocument().openTransaction(translate("uCmd", "Quick move", "Transaction")) - if event.wasCtrlDown(): k=-1*float(self.edit.text()) - else: k=1*float(self.edit.text()) - sel=FreeCADGui.Selection.getSelection() - if sel: self.objs=[o for o in sel if hasattr(o,'Shape')] - if event.wasCtrlDown() and event.wasAltDown(): - alfa=float(self.edit2.text()) - if fCmd.edges(): - self.edge=fCmd.edges()[0] - for o in self.objs: fCmd.rotateTheBeamAround(o, self.edge, alfa) - elif self.edge: - for o in self.objs: fCmd.rotateTheBeamAround(o, self.edge, alfa) - else: - for o in self.objs: o.Placement.move(self.direct*k) - self.Placement.move(self.direct*k) - pl,direct,M=[self.Placement,self.direct,self.scale] - self.closeArrow() - self.__init__(self.edit, self.edit2, pl,direct,M,self.objs) - FreeCAD.activeDocument().commitTransaction() + """ + arrow_move(edit,edit2,pl=None,direct=None,M=100) + edit,edit2: displacement and angle QLineEdit widgets + pl: the placement of the arrow + direct: the displacement vector + M: the scale of display + This class derives from "arrow" and adds the ability to move the selected + objects when the arrow is picked. This is accomplished by redefining the + method "pickAction". + """ + + def __init__(self, edit, edit2, pl=None, direct=None, M=100.0, objs=None): + self.objs = objs + self.edge = None + self.edit = edit + self.edit2 = edit2 + # define direction + self.scale = M + if direct: + self.direct = direct + else: + self.direct = FreeCAD.Vector(0, 0, 1) * M + # define placement + if not pl: + pl = FreeCAD.Placement() + # draw arrow + super(arrow_move, self).__init__( + pl=pl, scale=[M / 2, M / 2, M / 10], offset=M / 2 + ) + + def pickAction(self, path=None, event=None, arg=None): + FreeCAD.activeDocument().openTransaction( + translate("uCmd", "Quick move", "Transaction") + ) + if event.wasCtrlDown(): + k = -1 * float(self.edit.text()) + else: + k = 1 * float(self.edit.text()) + sel = FreeCADGui.Selection.getSelection() + if sel: + self.objs = [o for o in sel if hasattr(o, "Shape")] + if event.wasCtrlDown() and event.wasAltDown(): + alfa = float(self.edit2.text()) + if fCmd.edges(): + self.edge = fCmd.edges()[0] + for o in self.objs: + fCmd.rotateTheBeamAround(o, self.edge, alfa) + elif self.edge: + for o in self.objs: + fCmd.rotateTheBeamAround(o, self.edge, alfa) + else: + for o in self.objs: + o.Placement.move(self.direct * k) + self.Placement.move(self.direct * k) + pl, direct, M = [self.Placement, self.direct, self.scale] + self.closeArrow() + self.__init__(self.edit, self.edit2, pl, direct, M, self.objs) + FreeCAD.activeDocument().commitTransaction() + class handleDialog(dodoDialogs.protoTypeDialog): - def __init__(self): - self.arrow=None - super(handleDialog,self).__init__('disp.ui') - self.form.edit1.setValidator(QDoubleValidator()) - self.form.edit2.setValidator(QDoubleValidator()) - self.form.btn1.clicked.connect(self.selectAction) - self.form.scrollbar.valueChanged.connect(lambda: self.form.edit1.setText("%i" %self.form.scrollbar.value())) - self.form.dial.valueChanged.connect(lambda: self.form.edit2.setText("%i" %self.form.dial.value())) - from sys import platform - if platform.startswith('win'): - self.form.lab2.hide() - def selectAction(self): - self.objs=FreeCADGui.Selection.getSelection() - L=direct=None - pl=FreeCAD.Placement() - # define general size of arrow - if self.arrow: self.arrow.closeArrow() - M=100.0 - moveSet=[o for o in FreeCADGui.Selection.getSelection() if hasattr(o,'Shape')] - if moveSet: - bb=moveSet[0].Shape.BoundBox - for o in moveSet: bb=bb.united(o.Shape.BoundBox) - edgesLens=[e.Length for o in moveSet for e in o.Shape.Edges] - M=(bb.XLength+bb.YLength+bb.ZLength)/6.0 - # define placement of arrow - orig=bb.Center - orig[2]=bb.ZMax+bb.ZLength*0.1 - pl.move(orig) - # define direction and displacement - if fCmd.faces(): - direct=fCmd.faces()[0].normalAt(0,0) - elif fCmd.edges(): - direct=fCmd.edges()[0].tangentAt(0) - # create the arrow_move object - if direct: - pl.Rotation=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),direct).multiply(pl.Rotation) - self.arrow=arrow_move(self.form.edit1,self.form.edit2,pl=pl,direct=direct,M=M,objs=self.objs) - def accept(self): - self.reject() - def reject(self): - if self.arrow: self.arrow.closeArrow() - if FreeCAD.ActiveDocument: FreeCAD.ActiveDocument.recompute() - super(handleDialog,self).reject() + def __init__(self): + self.arrow = None + super(handleDialog, self).__init__("disp.ui") + self.form.edit1.setValidator(QDoubleValidator()) + self.form.edit2.setValidator(QDoubleValidator()) + self.form.btn1.clicked.connect(self.selectAction) + self.form.scrollbar.valueChanged.connect( + lambda: self.form.edit1.setText("%i" % self.form.scrollbar.value()) + ) + self.form.dial.valueChanged.connect( + lambda: self.form.edit2.setText("%i" % self.form.dial.value()) + ) + from sys import platform + + if platform.startswith("win"): + self.form.lab2.hide() + + def selectAction(self): + self.objs = FreeCADGui.Selection.getSelection() + L = direct = None + pl = FreeCAD.Placement() + # define general size of arrow + if self.arrow: + self.arrow.closeArrow() + M = 100.0 + moveSet = [ + o for o in FreeCADGui.Selection.getSelection() if hasattr(o, "Shape") + ] + if moveSet: + bb = moveSet[0].Shape.BoundBox + for o in moveSet: + bb = bb.united(o.Shape.BoundBox) + edgesLens = [e.Length for o in moveSet for e in o.Shape.Edges] + M = (bb.XLength + bb.YLength + bb.ZLength) / 6.0 + # define placement of arrow + orig = bb.Center + orig[2] = bb.ZMax + bb.ZLength * 0.1 + pl.move(orig) + # define direction and displacement + if fCmd.faces(): + direct = fCmd.faces()[0].normalAt(0, 0) + elif fCmd.edges(): + direct = fCmd.edges()[0].tangentAt(0) + # create the arrow_move object + if direct: + pl.Rotation = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), direct).multiply( + pl.Rotation + ) + self.arrow = arrow_move( + self.form.edit1, + self.form.edit2, + pl=pl, + direct=direct, + M=M, + objs=self.objs, + ) + + def accept(self): + self.reject() + + def reject(self): + if self.arrow: + self.arrow.closeArrow() + if FreeCAD.ActiveDocument: + FreeCAD.ActiveDocument.recompute() + super(handleDialog, self).reject() + class label3D(object): - ''' - This class writes a 2D label in the 3D viewport. - To be used as an auxiliary tool to show flags during execution - of commands. - Note: default text size is 30 units. - label3D(pl=None, sizeFont=30, color=(1.0,0.6,0.0), text='TEXT') - ''' - def __init__(self,pl=None, sizeFont=30, color=(1.0,0.6,0.0), text='TEXT'): - import FreeCAD, FreeCADGui - self.node=coin.SoSeparator() - self.color=coin.SoBaseColor() - self.color.rgb=color - self.node.addChild(self.color) - self.transform=coin.SoTransform() - self.node.addChild(self.transform) - self.font=coin.SoFont() - self.node.addChild(self.font) - self.font.size=sizeFont - self.text=coin.SoText2() - self.text.string=text - self.node.addChild(self.text) - self.sg=FreeCADGui.ActiveDocument.ActiveView.getSceneGraph() - self.sg.addChild(self.node) - if not pl: - pl=FreeCAD.Placement() - self.moveto(pl) - def removeLabel(self): - self.sg.removeChild(self.node) - def moveto(self,pl): - import FreeCAD - self.Placement=pl - self.transform.translation.setValue(tuple(self.Placement.Base)) - self.transform.rotation.setValue(tuple(self.Placement.Rotation.Q)) - -import DraftTools,Draft,uForms + """ + This class writes a 2D label in the 3D viewport. + To be used as an auxiliary tool to show flags during execution + of commands. + Note: default text size is 30 units. + label3D(pl=None, sizeFont=30, color=(1.0,0.6,0.0), text='TEXT') + """ + + def __init__(self, pl=None, sizeFont=30, color=(1.0, 0.6, 0.0), text="TEXT"): + import FreeCAD, FreeCADGui + + self.node = coin.SoSeparator() + self.color = coin.SoBaseColor() + self.color.rgb = color + self.node.addChild(self.color) + self.transform = coin.SoTransform() + self.node.addChild(self.transform) + self.font = coin.SoFont() + self.node.addChild(self.font) + self.font.size = sizeFont + self.text = coin.SoText2() + self.text.string = text + self.node.addChild(self.text) + self.sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph() + self.sg.addChild(self.node) + if not pl: + pl = FreeCAD.Placement() + self.moveto(pl) + + def removeLabel(self): + self.sg.removeChild(self.node) + + def moveto(self, pl): + import FreeCAD + + self.Placement = pl + self.transform.translation.setValue(tuple(self.Placement.Base)) + self.transform.rotation.setValue(tuple(self.Placement.Rotation.Q)) + + +import DraftTools, Draft, uForms from PySide.QtGui import * + + class hackedLine(DraftTools.Line): - ''' - One hack of the class DraftTools.Line - to make 3D drafting easier. - ''' - def __init__(self, wireFlag=True): - DraftTools.Line.__init__(self,wireFlag) - self.Activated() - dialogPath=join(dirname(abspath(__file__)),"dialogz","hackedline.ui") - self.hackedUI=FreeCADGui.PySideUic.loadUi(dialogPath) - self.hackedUI.btnRot.clicked.connect(self.rotateWP) - self.hackedUI.btnOff.clicked.connect(self.offsetWP) - self.hackedUI.btnXY.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(0,0,1))) - self.hackedUI.btnXZ.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(0,1,0))) - self.hackedUI.btnYZ.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(1,0,0))) - self.ui.layout.addWidget(self.hackedUI) - def alignWP(self, norm): - FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.node[-1],norm) - FreeCADGui.Snapper.setGrid() - def offsetWP(self): - if hasattr(FreeCAD,'DraftWorkingPlane') and hasattr(FreeCADGui,'Snapper'): - s=FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") - sc=[float(x*s) for x in [1,1,.2]] - varrow =arrow(FreeCAD.DraftWorkingPlane.getPlacement(),scale=sc,offset=s) - offset=QInputDialog.getInt(None, translate("uCmd", "Offset Work Plane"), translate("uCmd", "Offset: ")) - if offset[1]: - offsetWP(offset[0]) - FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(varrow.node) - def rotateWP(self): - self.form=uForms.rotWPForm() - def action(self,arg): #re-defintition of the method of parent - "scene event handler" - if arg["Type"] == "SoKeyboardEvent" and arg["State"]=='DOWN': - # key detection - if arg["Key"] == "ESCAPE": - self.finish() - elif arg["ShiftDown"] and arg["CtrlDown"]: - if arg["Key"] in ('M','m'): - if self.hackedUI.cb1.isChecked(): - self.hackedUI.cb1.setChecked(False) - else: - self.hackedUI.cb1.setChecked(True) - elif arg["Key"] in ('O','o'): - self.offsetWP() - elif arg["Key"] in ('R','r'): - self.rotateWP() - elif arg["Type"] == "SoLocation2Event": - # mouse movement detection - self.point,ctrlPoint,info = DraftTools.getPoint(self,arg) - elif arg["Type"] == "SoMouseButtonEvent": - # mouse button detection - if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): - if (arg["Position"] == self.pos): - self.finish(False,cont=True) - else: - if (not self.node) and (not self.support): - DraftTools.getSupport(arg) - self.point,ctrlPoint,info = DraftTools.getPoint(self,arg) - if self.point: - self.ui.redraw() - self.pos = arg["Position"] - self.node.append(self.point) - self.drawSegment(self.point) - if self.hackedUI.cb1.isChecked(): - rot=FreeCAD.DraftWorkingPlane.getPlacement().Rotation - normal=rot.multVec(FreeCAD.Vector(0,0,1)) - FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.point,normal) - FreeCADGui.Snapper.setGrid() - if (not self.isWire and len(self.node) == 2): - self.finish(False,cont=True) - if (len(self.node) > 2): - if ((self.point-self.node[0]).Length < Draft.tolerance()): - self.undolast() - self.finish(True,cont=True) + """ + One hack of the class DraftTools.Line + to make 3D drafting easier. + """ + + def __init__(self, wireFlag=True): + DraftTools.Line.__init__(self, wireFlag) + self.Activated() + dialogPath = join(dirname(abspath(__file__)), "dialogz", "hackedline.ui") + self.hackedUI = FreeCADGui.PySideUic.loadUi(dialogPath) + self.hackedUI.btnRot.clicked.connect(self.rotateWP) + self.hackedUI.btnOff.clicked.connect(self.offsetWP) + self.hackedUI.btnXY.clicked.connect( + lambda: self.alignWP(FreeCAD.Vector(0, 0, 1)) + ) + self.hackedUI.btnXZ.clicked.connect( + lambda: self.alignWP(FreeCAD.Vector(0, 1, 0)) + ) + self.hackedUI.btnYZ.clicked.connect( + lambda: self.alignWP(FreeCAD.Vector(1, 0, 0)) + ) + self.ui.layout.addWidget(self.hackedUI) + + def alignWP(self, norm): + FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.node[-1], norm) + FreeCADGui.Snapper.setGrid() + + def offsetWP(self): + if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt( + "gridSize" + ) + sc = [float(x * s) for x in [1, 1, 0.2]] + varrow = arrow(FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s) + offset = QInputDialog.getInt( + None, + translate("uCmd", "Offset Work Plane"), + translate("uCmd", "Offset: "), + ) + if offset[1]: + offsetWP(offset[0]) + FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild( + varrow.node + ) + + def rotateWP(self): + self.form = uForms.rotWPForm() + def action(self, arg): # re-defintition of the method of parent + "scene event handler" + if arg["Type"] == "SoKeyboardEvent" and arg["State"] == "DOWN": + # key detection + if arg["Key"] == "ESCAPE": + self.finish() + elif arg["ShiftDown"] and arg["CtrlDown"]: + if arg["Key"] in ("M", "m"): + if self.hackedUI.cb1.isChecked(): + self.hackedUI.cb1.setChecked(False) + else: + self.hackedUI.cb1.setChecked(True) + elif arg["Key"] in ("O", "o"): + self.offsetWP() + elif arg["Key"] in ("R", "r"): + self.rotateWP() + elif arg["Type"] == "SoLocation2Event": + # mouse movement detection + self.point, ctrlPoint, info = DraftTools.getPoint(self, arg) + elif arg["Type"] == "SoMouseButtonEvent": + # mouse button detection + if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): + if arg["Position"] == self.pos: + self.finish(False, cont=True) + else: + if (not self.node) and (not self.support): + DraftTools.getSupport(arg) + self.point, ctrlPoint, info = DraftTools.getPoint(self, arg) + if self.point: + self.ui.redraw() + self.pos = arg["Position"] + self.node.append(self.point) + self.drawSegment(self.point) + if self.hackedUI.cb1.isChecked(): + rot = FreeCAD.DraftWorkingPlane.getPlacement().Rotation + normal = rot.multVec(FreeCAD.Vector(0, 0, 1)) + FreeCAD.DraftWorkingPlane.alignToPointAndAxis( + self.point, normal + ) + FreeCADGui.Snapper.setGrid() + if not self.isWire and len(self.node) == 2: + self.finish(False, cont=True) + if len(self.node) > 2: + if (self.point - self.node[0]).Length < Draft.tolerance(): + self.undolast() + self.finish(True, cont=True) From c05a1af3f784f4ccbf5cae42df188d6d60ca9b37 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 17 Mar 2024 01:29:30 -0600 Subject: [PATCH 028/135] remove older translates folder & fix conflicts with pFeatures.py --- pFeatures.py | 153 ----------------------------- translations/update_translation.sh | 120 ---------------------- translationz/dodo_es-ES.qm | Bin 33746 -> 34610 bytes 3 files changed, 273 deletions(-) delete mode 100755 translations/update_translation.sh diff --git a/pFeatures.py b/pFeatures.py index 355ccba..95ea243 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -997,7 +997,6 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings class Valve(pypeType): -<<<<<<< HEAD """Class for object PType="Valve" Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100]) obj: the "App::FeaturePython object" @@ -1243,155 +1242,3 @@ def purge(self, fp): for name in fp.Curves: FreeCAD.ActiveDocument.removeObject(name) fp.Curves = [] -======= - '''Class for object PType="Valve" - Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100]) - obj: the "App::FeaturePython object" - PSize (string): nominal diameter - PRating (string): ! the valve's type ! - OD (float): outside diameter - H (float): length of valve''' - def __init__(self, obj,DN="DN50",VType="ball",OD=72, ID=50, H=40, Kv=150): - # initialize the parent class - super(Valve,self).__init__(obj) - # define common properties - obj.PType="Valve" - obj.PRating=VType - obj.PSize=DN - obj.Kv=Kv - # define specific properties - obj.addProperty("App::PropertyLength","OD","Valve",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD - obj.addProperty("App::PropertyLength","ID","Valve",QT_TRANSLATE_NOOP("App::Property","Inside diameter")).ID=ID - obj.addProperty("App::PropertyLength","Height","Valve",QT_TRANSLATE_NOOP("App::Property","Length of tube")).Height=H - def execute(self, fp): - c=Part.makeCone(fp.OD/2,fp.OD/5,fp.Height/2) - v=c.fuse(c.mirror(FreeCAD.Vector(0,0,fp.Height/2),FreeCAD.Vector(0,0,1))) - if fp.PRating.find('ball')+1 or fp.PRating.find('globe')+1: - r=min(fp.Height*0.45,fp.OD/2) - v=v.fuse(Part.makeSphere(r,FreeCAD.Vector(0,0,fp.Height/2))) - fp.Shape = v - fp.Ports=[FreeCAD.Vector(),FreeCAD.Vector(0,0,float(fp.Height))] - super(Valve,self).execute(fp) # perform common operations - -class PypeBranch2(pypeType): # use AttachExtensionPython - '''Class for object PType="PypeBranch2" - Single-line pipe branch linked to its center-line using AttachExtensionPython - ex: a=PypeBranch2(obj,base,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None) - type(obj)=FeaturePython - type(base)=DWire or SketchObject - ''' - def __init__(self, obj,base,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None): - # initialize the parent class - super(PypeBranch2,self).__init__(obj) - # define common properties - obj.PType="PypeBranch" - obj.PSize=DN - obj.PRating=PRating - # define specific properties - obj.addExtension("App::GroupExtensionPython",obj) # GROUP test in progress! - obj.addProperty("App::PropertyLength","OD","PypeBranch",QT_TRANSLATE_NOOP("App::Property","Outside diameter")).OD=OD - obj.addProperty("App::PropertyLength","thk","PypeBranch",QT_TRANSLATE_NOOP("App::Property","Wall thickness")).thk=thk - if not BR: BR=0.75*OD - obj.addProperty("App::PropertyLength","BendRadius","PypeBranch",QT_TRANSLATE_NOOP("App::Property","Bend Radius")).BendRadius=BR - obj.addProperty("App::PropertyStringList","Tubes","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The tubes of the branch.")) - obj.addProperty("App::PropertyStringList","Curves","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The curves of the branch.")) - obj.addProperty("App::PropertyLink","Base","PypeBranch",QT_TRANSLATE_NOOP("App::Property","The path.")) - if hasattr(base,"Shape") and base.Shape.Edges: - obj.Base=base - else: - FreeCAD.Console.PrintError('Base not valid\n') - def onChanged(self, fp, prop): - if prop=='Base' and hasattr(fp,'OD') and hasattr(fp,'thk') and hasattr(fp,'BendRadius'): - self.purge(fp) - self.redraw(fp) - if prop=='BendRadius' and hasattr(fp,'Curves'): - BR=fp.BendRadius - for curve in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]: - curve.BendRadius=BR - if prop=='OD' and hasattr(fp,'Tubes') and hasattr(fp,'Curves'): - OD=fp.OD - for obj in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]: - if obj.PType=='Elbow': obj.BendRadius=OD*.75 - obj.OD=OD - fp.BendRadius=OD*.75 - if prop=='thk' and hasattr(fp,'Tubes') and hasattr(fp,'Curves'): - thk=fp.thk - for obj in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]: - if hasattr(obj,'thk'): obj.thk=thk - def execute(self, fp): - if len(fp.Tubes)!=len(fp.Base.Shape.Edges): - self.purge(fp) - self.redraw(fp) - return - from math import tan - for i in range(len(fp.Tubes)): - L=fp.Base.Shape.Edges[i].Length - R=fp.BendRadius - # adjust the curve - if i0: - alfa=e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i-1].tangentAt(0))/2 - L-=R*tan(alfa) - offset=R*tan(alfa) - if i<(len(fp.Base.Shape.Edges)-1): - alfa=e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i+1].tangentAt(0))/2 - L-=R*tan(alfa) - eSupport='Edge'+str(i+1) - t=pCmd.makePipe([fp.PSize,float(fp.OD),float(fp.thk),L]) - t.PRating=fp.PRating - t.PSize=fp.PSize - t.Support = [(fp.Base,eSupport)] - t.MapMode = 'NormalToEdge' - t.MapReversed = True - t.AttachmentOffset=FreeCAD.Placement(FreeCAD.Vector(0,0,offset),FreeCAD.Rotation()) - tubes.append(t.Name) - #---Create the curve--- - if i>0: - e0=fp.Base.Shape.Edges[i-1] - alfa=degrees(e0.tangentAt(0).getAngle(e.tangentAt(0))) - c=pCmd.makeElbow([fp.PSize,float(fp.OD),float(fp.thk),alfa,R]) - c.PRating=fp.PRating - c.PSize=fp.PSize - O='Vertex'+str(i+1) - c.MapReversed = False - c.Support = [(fp.Base,O)] - c.MapMode = 'Translate' - pCmd.placeTheElbow(c,e0.tangentAt(0),e.tangentAt(0)) - curves.append(c.Name) - fp.Tubes=tubes - fp.Curves=curves - fp.addObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes+fp.Curves]) - def purge(self,fp): - if hasattr(fp,'Tubes'): - fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes]) - for name in fp.Tubes: FreeCAD.ActiveDocument.removeObject(name) - fp.Tubes=[] - if hasattr(fp,'Curves'): - fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]) - for name in fp.Curves: FreeCAD.ActiveDocument.removeObject(name) - fp.Curves=[] ->>>>>>> baf0fdd (Fixed typo on addproperty) diff --git a/translations/update_translation.sh b/translations/update_translation.sh deleted file mode 100755 index 797988e..0000000 --- a/translations/update_translation.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env bash - -# -------------------------------------------------------------------------------------------------- -# -# Update translation files -# -# Supported locales on FreeCAD <2024-01-20, FreeCADGui.supportedLocales(), total=40>: -# {'English': 'en', 'Afrikaans': 'af', 'Arabic': 'ar', 'Basque': 'eu', 'Belarusian': 'be', -# 'Bulgarian': 'bg', 'Catalan': 'ca', 'Chinese Simplified': 'zh-CN', -# 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr', 'Czech': 'cs', 'Dutch': 'nl', -# 'Filipino': 'fil', 'Finnish': 'fi', 'French': 'fr', 'Galician': 'gl', 'Georgian': 'ka', -# 'German': 'de', 'Greek': 'el', 'Hungarian': 'hu', 'Indonesian': 'id', 'Italian': 'it', -# 'Japanese': 'ja', 'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', 'Norwegian': 'no', -# 'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR', 'Romanian': 'ro', -# 'Russian': 'ru', 'Serbian': 'sr', 'Serbian, Latin': 'sr-CS', 'Slovak': 'sk', -# 'Slovenian': 'sl', 'Spanish': 'es-ES', 'Spanish, Argentina': 'es-AR', 'Swedish': 'sv-SE', -# 'Turkish': 'tr', 'Ukrainian': 'uk', 'Valencian': 'val-ES', 'Vietnamese': 'vi'} -# -# NOTE: WORKFLOW -# 0. Install Qt tools -# Debian-based (e.g., Ubuntu): $ sudo apt-get install qttools5-dev-tools pyqt6-dev-tools -# Fedora-based: $ sudo dnf install qt6-linguist qt6-devel -# Arch-based: $ sudo pacman -S qt6-tools python-pyqt6 -# 1. Make the script executable -# $ chmod +x update_translation.sh -# 2. Execute the script passing the locale code as first parameter -# The script has to be executed within the `resources/translations` directory -# Only update the files you're translating! -# $ ./update_translation.sh es-ES -# 3. Do the translation via Qt Linguist and use `File>Release` -# 4. If releasing with the script execute the script passing the locale code as first parameter -# and use '-r' flag next -# $ ./update_translation.sh es-ES -r -# -# The usage of `pylupdate6` is preferred over 'pylupdate5' when extracting text strings from -# Python files. -# -# -------------------------------------------------------------------------------------------------- - -supported_locales=( - "en" "af" "ar" "eu" "be" "bg" "ca" "zh-CN" "zh-TW" "hr" - "cs" "nl" "fil" "fi" "fr" "gl" "ka" "de" "el" "hu" - "id" "it" "ja" "kab" "ko" "lt" "no" "pl" "pt-PT" "pt-BR" - "ro" "ru" "sr" "es-ES" "es-AR" "sv-SE" "tr" "uk" "val-ES" "vi" -) - -is_locale_supported() { - local locale="$1" - for supported_locale in "${supported_locales[@]}"; do - if [[ "$supported_locale" == "$locale" ]]; then - return 0 - fi - done - return 1 -} - -get_strings() { - # Get translatable strings from ../ui/*.ui Qt Designer files - lupdate ../dialogz/*.ui -ts uifiles.ts -no-obsolete - # Get translatable strings from ../../*.py Python files - pylupdate6 ../*.py -ts pyfiles.ts -} - -delete_files() { - # Delete files that are no longer needed - rm uifiles.ts - rm pyfiles.ts - rm -f _${WB}.ts -} - -add_new_locale() { - echo -e "\033[1;33m\n\t<<< Creating '${WB}_${LOCALE}.ts' file >>>\n\033[m" - get_strings - # Join strings from Qt Designer and Python files into temp file - lconvert -i uifiles.ts pyfiles.ts -o _${WB}.ts - # Add generic file - lconvert -i _${WB}.ts -o ${WB}.ts - # Add specified locale file - lconvert -source-language en -target-language $LOCALE \ - -i _${WB}.ts -o ${WB}_${LOCALE}.ts -} - -update_locale() { - echo -e "\033[1;32m\n\t<<< Updating '${WB}_${LOCALE}.ts' file >>>\n\033[m" - get_strings - # Join strings from Qt Designer and Python files - lconvert -i uifiles.ts pyfiles.ts -o _${WB}.ts - # Join newly created file with older file (-no-obsolete) - # Update generic file - lconvert -i _${WB}.ts ${WB}.ts -o ${WB}.ts - # Update specified locale file - lconvert -source-language en -target-language $LOCALE \ - -i _${WB}.ts ${WB}_${LOCALE}.ts -o ${WB}_${LOCALE}.ts -} - -release_translation() { - # Release translation (creation of *.qm file from *.ts file) - lrelease ${WB}_${LOCALE}.ts -} - -# Main function ------------------------------------------------------------------------------------ - -WB="dodo" -LOCALE="$1" - -if is_locale_supported "$LOCALE"; then - if [ "$2" == "-r" ]; then - release_translation - else - if [ ! -f "${WB}_${LOCALE}.ts" ]; then - add_new_locale - else - update_locale - fi - delete_files - fi -else - echo "Verify your language code. Case sensitive." - echo "If it's correct ask a maintainer to add support for your language on FreeCAD." -fi diff --git a/translationz/dodo_es-ES.qm b/translationz/dodo_es-ES.qm index 521ae61542e1f9cb0bc3a37398b930aef42c84a0..3b0007bc85b95f912c2399f6708d7f18699c2317 100644 GIT binary patch delta 2448 zcmaJ?YgAKL7XI?M_vT(n!ZXUFNWrE&6bg(F7>t5K@r4KiiXZ}B5P@7w!c!|c)$z4P ziwCNpRjbviUFuBLskXH`QkO$jP+RQGv^rI^wQ5mUt94atXNOd0b&YF&+5y-Mts zo5=ffERbS`a^!np@*>#X+v)sP7tV-bFRB6?XV|fRe=?vC#{u`Z0BbF}|C$Q)`y(#A zLdOdu@y%m*VE!`P2#p5@txrdD~wMjkQ%7&}Wo=I!fAMPh}#;sBxu{*JgDQZ*W zNQ3(901~J6P=C%0l+*?Fb@M&)vO|4+MLke|QzLBa0esGB^m}Q4z$T6P@<%}RJDRDp z$g>HDG&z^)y-71PCHKgL%#|AZ*AnpiZ#0g!Ody-rR5!H%dD)sZ8-@bh*P7;pu|Ui( zns2QX(!a%f$4wKR!tcV7|v;zTv-XcnD4@>qb_V1 zpk2QH7|`%CQ#8I&`(Dif;s$EFYMRL+S$lp-H?_b=+DCWx1M?u9)s?AG1bnWbo+Ke0k zcRrj7NUQl>{@a03X8xde3t$Z9kF{q}uy^@W7D_f{58v6j6&T#Ze|3k><$lTc9-j%g zjdP*jdH#Mb?Pp#P2HrYB{eD^q&z%Sa?h#&E^#d>@Kp4@h0g@AiIF19JV?vUc1h$d$ zRgZ~e?{VhFcam0h4Y_v z0;Pk68>_Yh8Ck;ZFp};&Q>QsW=aTR1jD72?I^)Gnl*-S#^xZ?Lp3m#%`Z=X7)v1$sQb>aX&`DB6cRJmG0%^#4l3i$*5-(Hz$9qZ1 zZxjPcuvEU#3cNH&vKG+5OWP$aKM+f4MMq032h#|eKb#c^k)G8)(g{CGCuWFrPHY8A z`mxP|ud&8JRgS;d@BIh8bW`rLqe7tP{C~Ld`ifyG4z;lie1gh1q%E)8%Pp z19j2;SN~+7?>%m7V*|;dYi^qjbgtnVE6|zzau>V(^Z08t)4E(JH@UF(E4D@#STw3i z4;zihko$Tem+n=;9=+GGU1UJE-h163nkEnRq3dSQH0se?X7>R69ev8WWSS-s`r=0v zZPG=3ZOwOpP`yXKH*7HIqT0ys4-Njw zH1q0yHkd6$qg4!}zc@%`JjHUv!14BGL)kQ98=7F4_s|YZU0`VN18U%ly0Mc2E9Ht)HrlSFsaNi#^25YMu)JYqA4bGuuZE;V+-e#F zcy$_gKM0^E=`ik{_Y)=4Y&=y>w4%H5^m*!v#8mc+Xd1L2*m(CO6)EqI@rN^ir=C7w zd@w*JFB-~droXMBdmO~hd3doXJ-`|W6KIFl+tvY;!x7ds^k>KR>@jy z;U&-dLFFU~KqxX1hD6v=hEiBj2pfVRV=iPJ9RN>{6q*?(JAw-9%IpFyjjk{miX+jc zR9k2FF`1FTRH^+Fs)^&*_hEU;;E`aLE97EFkYbhlcr4E%Vs-fuLC<85L@+Co!Hz@FY2f4kGW9^#8R6p_tgJDB~yDR#3*3^jIl|0{c@|saUD14=QuWmA}b+ zz;99?fiYy7+$SzA#Fw=f`LN0PVxz|xo9vWSMWqNLSq|BmbiXI=(YnvMV5Ct@8^te# zGcVU?G3_XrhiX#!Up*daRMNtVAcqoUFP9y~bK;*#8Gx~nEmYGIVzWDi5pO6(sH9rQ aKh4f+S!llbPG{5#b-~Arv?7h#qA8zNmtGOK( zokxvdFclFA~1v^LBR%m<>%k>E2UuHlF*WCbrxznl(?-{Hb(1^V-AULykX^xc&`B=8~qz1z(|(M-nPr1ce6 z?G$fuBm}dmUEx6Vb{27$a?TiJ&lXTl&&kYsAR3snnc3WT0t+0h7-7KD)y&aPHD=#u zFP%OKc($?)uTLR=)U!=jDd~_l7e@NAt;ec?&==Sn7s)@*XS1ebRir~TJJxWW;$C*% zz7NxZ26lPP5qj_@`?G*P%yqEgy)v-s8+I?y4ouP5zaM@9JhEFbrEVkgc)?UeBEzWq}aKvyz)7^!DVY_h9=WSqySvWGv38?-;Tl*qbT;7rlncGPg`rGZpZA&Qce8{1eL@V%oDEps6DM!|2YAd^ zoYv0+u_0n4W59!&7%Rs@JHf_svn<+WN+tGH(YYaytXU~Kt45HCPK|KIB+*$%m_H;s z>qoFnybz`V9!W0r@)El*bpg4);*G6u1F7-iKp>?)He2F5XkY9vlKOxAv!wp8n@YJQ z&3h-Dlzu>Z&U+-aDoOj!4madFr8moe2TEVpss)SVnL(-Z+-RbrQ2MgHo%YR<&USW? zGvcN1XRikqX33*NRuJRtA$kP%h~w zrKawc>xZXMm)wz?coR{&MLr&u3luyqcaG`-^j-3$bKx+dRA&$mQz1TPgXfK_G+T~p zGevV~c8(#YmmHAD8{&860EM20mFtUu$tw&+&(LH`sW)tDA<05Q3|l7As98H+s}_Sp zifh8symd9n_KH}KlRTq+JI>BT>FK) zaQHPERA=1fjGJWJI?YcC(K4jT>dr6=v2xvgkCE2PdbB-~**kr;`?sfe(A+xZLhA+> z+AnD5B}?XvWeSRE3_dcXh?&%7S-TWd+d-l{K^av$j$HbOGNJZqnmBz*bZ#FY+*We# z(JRU4l(IFqfYry9dYLpSJgL+#r8wu3((ngSlXy@|l>>ro6-M1rqPA?SQF^?AD1F!H z6CX*}-!cY7(=~dVan_Y1B;9dsk8E+Qsx%g4&~4!}jH~aK0P_ot>%18`EYbMl$Uh*Y z)L40K3H8iD`&RHsZj%qfG139%({_yw+p?;tMk)_sTq7# zTMsFe@`KuFjsr|x>N~@}PWDjGc9R97r)jAM^SE+P_0P{qq9s46|D2-{ nkh)(T9zzb|))mm?uH~s~AJQK7G-(b+Xl^vH$mXL76|?>W+l3Vm From a049e0ecf234c1a29635978d6a9782c004034f87 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 31 Mar 2024 00:08:26 -0600 Subject: [PATCH 029/135] Spanish translation complete --- dialogz/dp.ui | 14 +- dialogz/hackedline.ui | 12 +- dialogz/rotAround.ui | 12 +- dialogz/sections.ui | 43 +- dialogz/shapes.ui | 4 +- dialogz/tank.ui | 15 +- dodoDialogs.py | 6 +- pForms.py | 2 +- translationz/dodo.ts | 1069 ++++++++++++++++--------- translationz/dodo_es-ES.qm | Bin 34610 -> 50817 bytes translationz/dodo_es-ES.ts | 1497 ++++++++++++++++++++++-------------- uForms.py | 10 +- 12 files changed, 1708 insertions(+), 976 deletions(-) diff --git a/dialogz/dp.ui b/dialogz/dp.ui index 798b309..fcefd3d 100644 --- a/dialogz/dp.ui +++ b/dialogz/dp.ui @@ -1,6 +1,6 @@ - DialogDp + Dialog @@ -71,7 +71,7 @@ - 100 + 100 Qt::AlignCenter @@ -93,7 +93,7 @@ - 20 + 20 Qt::AlignCenter @@ -269,7 +269,7 @@ - 0 + 0 Qt::AlignCenter @@ -288,7 +288,7 @@ - 0 + 0 Qt::AlignCenter @@ -326,7 +326,7 @@ - 1 + 1 Qt::AlignCenter @@ -348,7 +348,7 @@ - 20 + 20 Qt::AlignCenter diff --git a/dialogz/hackedline.ui b/dialogz/hackedline.ui index 95a90f1..7bf8629 100644 --- a/dialogz/hackedline.ui +++ b/dialogz/hackedline.ui @@ -1,13 +1,13 @@ - DialogHackedLine + Dialog 0 0 - 196 - 110 + 278 + 118 @@ -80,7 +80,7 @@ Align WP to principal plane - XY + XY @@ -108,7 +108,7 @@ Align WP to principal plane - XZ + XZ @@ -136,7 +136,7 @@ Align WP to principal plane - YZ + YZ diff --git a/dialogz/rotAround.ui b/dialogz/rotAround.ui index adbbedd..0ab38c3 100644 --- a/dialogz/rotAround.ui +++ b/dialogz/rotAround.ui @@ -1,13 +1,13 @@ - DialogRotAround + Dialog 0 0 275 - 242 + 256 @@ -41,7 +41,7 @@ - Z + Z @@ -60,7 +60,7 @@ - 90 + 90 Qt::AlignCenter @@ -82,7 +82,7 @@ - Y + Y @@ -154,7 +154,7 @@ - X + X diff --git a/dialogz/sections.ui b/dialogz/sections.ui index a09fa14..367e801 100644 --- a/dialogz/sections.ui +++ b/dialogz/sections.ui @@ -1,6 +1,6 @@ - DialogSections + Dialog @@ -45,7 +45,7 @@ - 45 + 45 Qt::AlignCenter @@ -55,7 +55,7 @@ - D + D Qt::AlignCenter @@ -65,7 +65,7 @@ - 45 + 45 Qt::AlignCenter @@ -75,7 +75,7 @@ - 80 + 80 Qt::AlignCenter @@ -85,7 +85,7 @@ - H + H Qt::AlignCenter @@ -95,7 +95,7 @@ - B + B Qt::AlignCenter @@ -145,7 +145,7 @@ - 5 + 5 Qt::AlignCenter @@ -165,7 +165,7 @@ - 5 + 5 Qt::AlignCenter @@ -185,7 +185,7 @@ - 5 + 5 Qt::AlignCenter @@ -353,8 +353,8 @@ 0 0 - 153 - 321 + 151 + 320 @@ -382,7 +382,7 @@ ... - + :/images/square.png:/images/square.png @@ -420,7 +420,7 @@ ... - + :/images/circle.png:/images/circle.png @@ -455,7 +455,7 @@ ... - + :/images/T.png:/images/T.png @@ -490,7 +490,7 @@ ... - + :/images/U.png:/images/U.png @@ -525,7 +525,7 @@ ... - + :/images/H.png:/images/H.png @@ -560,7 +560,7 @@ ... - + :/images/L.png:/images/L.png @@ -595,7 +595,7 @@ ... - + :/images/Z.png:/images/Z.png @@ -630,7 +630,7 @@ ... - + :/images/omega.png:/images/omega.png @@ -681,7 +681,7 @@ - :/images/square.png + :/images/square.png true @@ -773,7 +773,6 @@ profile - diff --git a/dialogz/shapes.ui b/dialogz/shapes.ui index ee03106..cbcd701 100644 --- a/dialogz/shapes.ui +++ b/dialogz/shapes.ui @@ -1,6 +1,6 @@ - DialogShapes + Dialog @@ -29,7 +29,7 @@ - - + - Qt::AlignCenter diff --git a/dialogz/tank.ui b/dialogz/tank.ui index 360fd5a..d948909 100644 --- a/dialogz/tank.ui +++ b/dialogz/tank.ui @@ -1,6 +1,6 @@ - DialogTank + Dialog @@ -23,7 +23,7 @@ - 1 + 0 @@ -72,6 +72,9 @@ 0 + + + Qt::AlignCenter @@ -114,6 +117,9 @@ 0 + + + Qt::AlignCenter @@ -156,6 +162,9 @@ 0 + + + Qt::AlignCenter @@ -263,7 +272,7 @@ - 200 + 200 Qt::AlignCenter diff --git a/dodoDialogs.py b/dodoDialogs.py index 1e7d725..047c458 100644 --- a/dodoDialogs.py +++ b/dodoDialogs.py @@ -30,7 +30,7 @@ def __init__(self, dialog="anyFile.ui"): self.mw.addAction(self.actionS) self.actionESC = QAction(self.mw) FreeCAD.Console.PrintMessage( - translate("protoTypeDialog", '"%s" to select; "%s" to execute\n') + translate("protoTypeDialog", '"%s" to select; "%s" to execute') % ( self.actionS.shortcuts()[0].toString(), self.actionX.shortcuts()[0].toString(), @@ -43,7 +43,7 @@ def __init__(self, dialog="anyFile.ui"): ) # SoKeyboardEvents replaced by QAction' except: FreeCAD.Console.PrintError( - translate("protoTypeDialog", "No view available.\n") + translate("protoTypeDialog", "No view available.") ) def action(self, arg): @@ -79,7 +79,7 @@ def reject(self): self.mw.removeAction(self.actionX) self.mw.removeAction(self.actionS) FreeCAD.Console.PrintMessage( - translate("protoTypeDialog", 'Actions "%s" and "%s" removed\n') + translate("protoTypeDialog", 'Actions "%s" and "%s" removed') % (self.actionX.objectName(), self.actionS.objectName()) ) try: diff --git a/pForms.py b/pForms.py index 77b1c64..9c62b2f 100644 --- a/pForms.py +++ b/pForms.py @@ -115,7 +115,7 @@ def __init__(self): self.ratingList.setCurrentRow(0) self.btn1.clicked.connect(self.insert) self.edit1 = QLineEdit() - self.edit1.setPlaceholderText("") + self.edit1.setPlaceholderText(translate("insertPipeForm", "")) self.edit1.setAlignment(Qt.AlignHCenter) self.edit1.setValidator(QDoubleValidator()) self.edit1.editingFinished.connect(lambda: self.sli.setValue(100)) diff --git a/translationz/dodo.ts b/translationz/dodo.ts index 1e59be6..6faa927 100644 --- a/translationz/dodo.ts +++ b/translationz/dodo.ts @@ -693,12 +693,28 @@ dpCalcDialog + + + + *** CUSTOM FLUID *** + + + + + <custom fluid> + + No data found + + + It seems the fluid has not a liquid state. + + It seems the fluid has not @@ -715,6 +731,11 @@ a liquid state. Flow (m3/h) + + + It seems the fluid has not a gas state. + + It seems the fluid has not @@ -1081,6 +1102,11 @@ a gas state. Insert pipes + + + <length> + + Reverse @@ -1584,18 +1610,33 @@ Branches and header's axes must be ortho protoTypeDialog + + + "%s" to select; "%s" to execute + + "%s" to select; "%s" to execute + + + No view available. + + No view available. + + + Actions "%s" and "%s" removed + + Actions "%s" and "%s" removed @@ -1840,508 +1881,968 @@ Branches and header's axes must be ortho - DialogAlign + Dialog - - Align flanges + + Dp calculator - - normY + + calculation - - YZ + + Nr. of curves = 0 - - (S)elect face + + Roughness (um) - - XZ + + Flow-rate (m3/h) - - hotkeys: "S" to select, "X" to execute + + Total length = 0 - - XY + + Scope - - < select a target face > + + <on selection> - - Set normal + + Pipe material - - Set notmal + + fluid properties - - normX + + Density (kg/m3) - - normZ + + liquid - - Invert normal + + T (°C) - - - DialogBeamShift - - Move + + Viscosity (cP) - - Multiple: + + gas/vapour - - - 1 + + Name - - - - 0 + + P abs. (bar) - - Set dist. + + results - - Z: + + Export - - Z: + + *** LIQUID *** - - Steps: + + --- - - Steps: + + + Dialog - - Y: + + (M)ove origin on click - - Y: + + (R)otate WP - - copy + + (O)ffset WP - - X: + + + + Align WP to principal plane - - X: + + Rotate around axis - - hotkeys: "S" to select, "X" to execute + + Reverse - - - DialogBeamStretch - - Stretch + + <select one axis> - - (S)et length + + copy items - - both + + hotkeys: "S" to select, "X" to execute - - head + + (S)et axis - - tail + + Beams profile editor - - New length - mm: + + t1 - - hotkeys: "S" to select, "X" to execute + + t2 - - Stretched end: + + t3 - - - DialogDisp - - Dialog + + <name> - - Angle: + + NW - - SET + + N - - * Click on arrow to move - * Ctrl+Click to go back - * Ctrl+Alt+Click to rotate + + NE - - Displacement: + + W - - 100 + + C - - 90 + + E - - - DialogDp - - Dp calculator + + SW - - calculation + + S - - Nr. of curves = 0 + + SE - - Roughness (um) + + + + + + + + + ... - - 100 + + Full section - - - 20 + + Apply +dimensions - - Flow-rate (m3/h) + + Shift +profile + + + + + Import shapes + + + + + <shapes> + + + + + Tank + + + + + Length + + + + + X + + + + + Width: + + + + + Y + + + + + Height: + + + + + Z + + + + + Nozzles + + + + + Pipe type: + + + + + + <select> + + + + + Flange type: + + + + + Add nozzle + + + + + DialogAlign + + + Align flanges + + + + + normY + + + + + YZ + + + + + (S)elect face + + + + + XZ + + + + + hotkeys: "S" to select, "X" to execute + + + + + XY + + + + + < select a target face > + + + + + Set normal + + + + + Set notmal + + + + + normX + + + + + normZ + + + + + Invert normal + + + + + DialogBeamShift + + + Move + + + + + Multiple: + + + + + + 1 + + + + + + + 0 + + + + + Set dist. + + + + + Z: + + + + + Z: + + + + + Steps: + + + + + Steps: + + + + + Y: + + + + + Y: + + + + + copy + + + + + X: + + + + + X: + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogBeamStretch + + + Stretch + + + + + (S)et length + + + + + both + + + + + head + + + + + tail + + + + + New length - mm: + + + + + hotkeys: "S" to select, "X" to execute + + + + + Stretched end: + + + + + DialogDisp + + + Dialog + + + + + Angle: + + + + + SET + + + + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate - - Total length = 0 + + Displacement: - - Scope + + 100 - - <on selection> + + 90 + + + DialogExtend - - Pipe material + + Extend beams - - fluid properties + + < select a target > - - Density (kg/m3) + + (S)elect target - - liquid + + hotkeys: "S" to select, "X" to execute + + + DialogFBranch - - T (°C) + + FrameBranch Manager - - Viscosity (cP) + + <no target selected> - - + + <degrees> + + + + + offset tail + + + + + Trim/Extend + + + + + AddBeams + + + + + Add single beam + + + + + Add single + + + + + ChangeProfile + + + + + <name> + + + + + <no item selected> + + + + + Redraw + + + + + offset head + + + + + RemoveBeams + + + + + Get targets + + + + + <length> + + + + + hotkeys: "S" to select, "X" to trim + + + + + DialogFillFrame + + + Fill frame + + + + + move + + + + + (S)elect + + + + + < select a beam > + + + + + copy + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogJoinPypes + + + Join pypes + + + + + Reset + + + + + hotkeys: "S" to select, "X" to execute + + + + + DialogProtoPipeForm + + + Dialog + + + + + Rating: + + + + + Insert + + + + + DialogRoute + + + Create pipe route + + + + + Y + + + + + X + + + + + Z + + + + + global Z + + + + + Normal to sketch: + + + + + Offset (mm): + + + + 0 - - gas/vapour + + <select an edge> - - 1 + + Get edge - - Name + + (S)et normal - - P abs. (bar) + + hotkeys: +"S" to select normal from geometry +"X" to execute + + + DialogValves - - results + + Insert valves - - Export + + Apply - - *** LIQUID *** + + Reverse - - --- + + Type: - DialogExtend - - - Extend beams - - - - - < select a target > - - + DialogDp - - (S)elect target + + Dp calculator - - hotkeys: "S" to select, "X" to execute + + calculation - - - DialogFBranch - - FrameBranch Manager + + Nr. of curves = 0 - - <no target selected> + + Roughness (um) - - <degrees> + + 100 - - offset tail + + + 20 - - Trim/Extend + + Flow-rate (m3/h) - - AddBeams + + Total length = 0 - - Add single beam + + Scope - - Add single + + <on selection> - - ChangeProfile + + Pipe material - - <name> + + fluid properties - - <no item selected> + + Density (kg/m3) - - Redraw + + liquid - - offset head + + T (°C) - - RemoveBeams + + Viscosity (cP) - - Get targets + + + 0 - - <length> + + gas/vapour - - hotkeys: "S" to select, "X" to trim + + 1 - - - DialogFillFrame - - Fill frame + + Name - - move + + P abs. (bar) - - (S)elect + + results - - < select a beam > + + Export - - copy + + *** LIQUID *** - - hotkeys: "S" to select, "X" to execute + + --- @@ -2390,42 +2891,6 @@ Branches and header's axes must be ortho - - DialogJoinPypes - - - Join pypes - - - - - Reset - - - - - hotkeys: "S" to select, "X" to execute - - - - - DialogProtoPipeForm - - - Dialog - - - - - Rating: - - - - - Insert - - - DialogRotAround @@ -2479,71 +2944,6 @@ Branches and header's axes must be ortho - - DialogRoute - - - Create pipe route - - - - - Y - - - - - X - - - - - Z - - - - - global Z - - - - - Normal to sketch: - - - - - Offset (mm): - - - - - 0 - - - - - <select an edge> - - - - - Get edge - - - - - (S)et normal - - - - - hotkeys: -"S" to select normal from geometry -"X" to execute - - - DialogSections @@ -2771,27 +3171,4 @@ profile - - DialogValves - - - Insert valves - - - - - Apply - - - - - Reverse - - - - - Type: - - - diff --git a/translationz/dodo_es-ES.qm b/translationz/dodo_es-ES.qm index 3b0007bc85b95f912c2399f6708d7f18699c2317..87892a9447d086e09b9159afa98bbb8f1f265e65 100644 GIT binary patch delta 14371 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 MY+t7nJKK5SKQEPf5dZ)H diff --git a/translationz/dodo_es-ES.ts b/translationz/dodo_es-ES.ts index 83e1c72..5798226 100644 --- a/translationz/dodo_es-ES.ts +++ b/translationz/dodo_es-ES.ts @@ -1,6 +1,6 @@ - + App::Property @@ -430,7 +430,7 @@ Rating of pipeFeature - + Grado de caracteristica de tuberia @@ -459,7 +459,7 @@ Quick Insert - + Insercion rapida @@ -601,27 +601,27 @@ Break the pipes - + Romper las tuberias Length - + Longituf <reference> - + <referencia> PypeLine: - + Linea de tubo: <none> - + <ninguno> @@ -695,22 +695,27 @@ dpCalcDialog + + + + *** CUSTOM FLUID *** + *** FLUIDO PERSONALIZADO *** + + + + <custom fluid> + <Fluido personalizado> + No data found Datos no encontrados - - - It seems the fluid has not -a liquid state. - - It seems the fluid has not a liquid state. - Parece que el fluido no tiene un estado liquido + Parece que el fluido no tiene un estado liquido. @@ -722,16 +727,10 @@ a liquid state. Flow (m3/h) Flujo (m3/h) - - - It seems the fluid has not -a gas state. - - It seems the fluid has not a gas state. - Parece que el fluido no tiene un estado gaseoso + Parece que el fluido no tiene un estado gaseoso. @@ -762,7 +761,7 @@ a gas state. Extend the beam either to a face, a vertex or the c.o.m. of the selected object - Extiende la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado + Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado @@ -770,7 +769,7 @@ a gas state. Extends pipe to intersection - Extiende tubo a la interseccion + Extender tubo a la interseccion @@ -778,7 +777,7 @@ a gas state. Extends pipes to intersection - Extiende tubos a la interseccion + Extender tubos a la interseccion @@ -786,77 +785,77 @@ a gas state. Select one beam and one edge - + Seleccionar una viga y un borde First select the base beam, then the edges - + Primero seleccionar la base, luego los bordes First select the target plane, then the faces to align - + Primero seleccionar el plano objetivo, luego las caras a alinear levelTheBeam Transaction - + Nivelar la viga Select the target face, then the others - + Seleccionar la cara objetivo, luego las otras alignFlange Transaction - + Alinear brida Select two edges to join. - + Seleccionar dos bordes para unir. joinTheBeamsEdges Transaction - + Unir los bordes de las vigas Select the beam and input the length - + Selecciona la viga y la entrada de la longitud First Select the target shape, then the beams to extend. - + Primero selecciona la forma objetivo, luego la viga a extender. Select 2 edges - + Seleccionar 2 bordes Adjust angle Transaction - + Ajustar angulo Select 2 edges =>[Ctrl]+select - + Seleccionar 2 bordes =>[Ctrl]+seleccionar rotJoin Transaction - + Rotar union @@ -937,17 +936,17 @@ a gas state. Insert a branch - + Insertar una ramificacion <name> - + <nombre> <bend radius> - + <radio de dobles> @@ -963,17 +962,17 @@ a gas state. Insert caps - + Insertar tapones Reverse - + Invertir Apply - + Aplicar @@ -989,48 +988,49 @@ a gas state. Insert elbows - + Insertar codos <bend angle> - + <angulo de dobles> <bend radius> - + <radio de dobles> Trim/Extend - + Cortar/Extender Reverse - + Invertir Apply - + Aplicar 0 deg - + 0 grados Wrong selection - + Seleccion equivocada + deg - + grados @@ -1046,17 +1046,17 @@ a gas state. Insert flanges - + Insertar bridas Reverse - + Invertir Apply - + Aplicar @@ -1087,6 +1087,11 @@ a gas state. Insert pipes Insertar tuberia + + + <length> + <Longitud> + Reverse @@ -1116,42 +1121,42 @@ a gas state. PypeLine Manager - + Gestor de linea de tubo <name> - + <nombre> Redraw - + Redibujar Part list - + Lista de parte Color - + Color Get Path - + Obtener trayectoria Get Profile - + Obtener perfil <new> - + <nuevo> @@ -1167,22 +1172,22 @@ a gas state. Insert reductions - + Insertar reducciones Reverse - + Invertir Apply - + Aplicar Eccentric - + Excentrico @@ -1203,7 +1208,7 @@ a gas state. <select an edge> - + <seleccionar un borde> @@ -1237,22 +1242,22 @@ a gas state. doing combine - + Haciendo combinado files read - + leer archivos files not read - + no leer archivos listNozzles: %s - + Lista de boquillas: %s @@ -1268,32 +1273,32 @@ a gas state. Insert U-bolt - + Insertar tornillo U - no ref. face - - + Sin cara de referencia Ref. face - + Cara de referencia Head - + Cabecera Middle - + Medio Tail - + Cola @@ -1309,22 +1314,22 @@ a gas state. Insert valves - + Insertar valvulas Reverse - + Invertir Apply - + Aplicar Insert in pipe - + Insertar en tubo @@ -1382,7 +1387,13 @@ a gas state. Connect branches to one header pipe Branches and header's axes must be ortho - + Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + + + + Connect branches to one header pipe + Branches and header's axes must be ortho + Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales @@ -1457,7 +1468,7 @@ Branches and header's axes must be ortho Offset: - Desface: + Desface: @@ -1504,7 +1515,7 @@ Branches and header's axes must be ortho Move WP on click - Mover plano de trabajo al click + Mover plano de trabajo al click @@ -1582,7 +1593,7 @@ Branches and header's axes must be ortho Rating: - + Grado: @@ -1592,12 +1603,6 @@ Branches and header's axes must be ortho protoTypeDialog - - - "%s" to select; "%s" to execute - - - "%s" to select; "%s" to execute @@ -1605,15 +1610,8 @@ Branches and header's axes must be ortho - No view available. - - Vista no disponible - - - - Actions "%s" and "%s" removed - - + No view available. + Vista no disponible. @@ -1769,7 +1767,7 @@ para exportar en formato step Offset: - Desface: + Desface: @@ -1792,7 +1790,7 @@ para exportar en formato step Base: - Base: + Base: @@ -1802,7 +1800,7 @@ para exportar en formato step Rotation angle: - Angulo de rotacion: + Angulo de rotacion: @@ -1812,7 +1810,7 @@ para exportar en formato step Rotation axis: - Eje de rotacion: + Eje de rotacion: @@ -1859,484 +1857,943 @@ para exportar en formato step - DialogAlign + Dialog - - Align flanges - Alinear bridas + + Dp calculator + Calculadora de Dp - - normY - Normal a Y + + calculation + calculos - - YZ - YZ + + Nr. of curves = 0 + Numero de curvas = 0 - - (S)elect face - (S)elecciona cara + + Roughness (um) + Rugozidad (um) - - XZ - XZ + + Flow-rate (m3/h) + Ritmo de flujo (m3/h) - - hotkeys: "S" to select, "X" to execute - Teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Total length = 0 + Longitud total = 0 - - XY - XY + + Scope + Alcance - - < select a target face > - < selecciona una cara como objetivo > + + <on selection> + <en seleccion> - - Set normal - Asignar normal + + Pipe material + Material de tubo - - normX - Normal a X + + fluid properties + Propiedades del fluido - - normZ - Normal a Z + + Density (kg/m3) + Densidad (kg/m3) - - Invert normal - Invertir normal + + liquid + liquido - - - DialogBeamShift - - Move - Mover + + T (°C) + - - Multiple: - Multiplicar: + + Viscosity (cP) + Viscosidad (cP) - - - 1 - 1 + + gas/vapour + gas/vapor - - - - 0 - 0 + + Name + Nombre - - Set dist. - Asignar distancia + + P abs. (bar) + Presion absoluta (bar) - - Z: - Z: + + results + resultados - - Steps: - + + Export + Exportar - - Steps: - Pasos: + + *** LIQUID *** + *** LIQUIDO *** - - Y: - Y: + + --- + - - copy - + + + Dialog + Dialogo - - X: - X: + + (M)ove origin on click + (M)over origen sobre clic - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + (R)otate WP + (R)otar plano de trabajo - - - DialogBeamStretch - - Stretch - Estirar + + (O)ffset WP + (O)Desfasar plano de trabajo - - (S)et length - (S)Asignar longitud + + + + Align WP to principal plane + Alinear plano de trabajo al plano principal - - both - ambos + + Rotate around axis + Rotar alrededor del eje - - head - cabecera + + Reverse + Invertir - - tail - cola + + <select one axis> + <Seleccionar un eje> - - New length - mm: - Nueva longitud - mm: + + copy items + copiar elementos - + hotkeys: "S" to select, "X" to execute teclas rapidas: "S" para seleccionar, "X" para ejecutar - - Stretched end: - Estirado final + + (S)et axis + (S)Asignar eje - - - DialogDisp - - Dialog - Dialogo + + Beams profile editor + Editor de perfiles de vigas - - Angle: - Angulo: + + t1 + - - SET - Asignar + + t2 + - - * Click on arrow to move - * Ctrl+Click to go back - * Ctrl+Alt+Click to rotate - * Cliquear en flecha para mover * Control+clic para regresar * control+alt+clic para rotar + + t3 + - - Displacement: - Desplazamiento: - + + <name> + <nombre> + + + + NW + + + + + N + + + + + NE + + + + + W + + + + + C + + + + + E + + + + + SW + + + + + S + + + + + SE + + + + + + + + + + + + ... + + + + + Full section + Seccion completa + + + + Apply +dimensions + Aplicar +dimensiones + + + + Shift +profile + Desfasar perfil + + + + Import shapes + Importar formas + + + + <shapes> + <formas> + + + + Tank + Deposito + + + + Length + Longitud + + + + X + + + + + Width: + Ancho: + + + + Y + + + + + Height: + Alto: + + + + Z + + + + + Nozzles + Boquillas + + + + Pipe type: + Tipo de tubo: + + + + + <select> + <seleccionar> + + + + Flange type: + Tipo de brida: + + + + Add nozzle + Agregar boquilla + + + + DialogAlign + + + Align flanges + Alinear bridas + + + + normY + Normal a Y + + + + YZ + YZ + + + + (S)elect face + (S)elecciona cara + + + + XZ + XZ + + + + hotkeys: "S" to select, "X" to execute + Teclas rapidas: "S" para seleccionar, "X" para ejecutar + + + + XY + XY + + + + < select a target face > + < selecciona una cara como objetivo > + + + + Set normal + Asignar normal + + + + normX + Normal a X + + + + normZ + Normal a Z + + + + Invert normal + Invertir normal + + + + DialogBeamShift + + + Move + Mover + + + + Multiple: + Multiplicar: + + + + + 1 + 1 + + + + + + 0 + 0 + + + + Set dist. + Asignar distancia. + + + + Z: + Z: + + + + Steps: + Pasos: + + + + Y: + Y: + + + + copy + copiar + + + + X: + X: + + + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar + + + + DialogBeamStretch + + + Stretch + Estirar + + + + (S)et length + (S)Asignar longitud + + + + both + ambos + + + + head + cabecera + + + + tail + cola + + + + New length - mm: + Nueva longitud - mm: + + + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar + + + + Stretched end: + Estirado final: + + + + DialogDisp + + + Dialog + Dialogo + + + + Angle: + Angulo: + + + + SET + Asignar + + + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + * Cliquear en flecha para mover + * Control+clic para regresar + * Control+alt+clic para rotar + + + + Displacement: + Desplazamiento: + + + + 100 + + + + + 90 + + + + + DialogExtend + + + Extend beams + Extender viga + + + + < select a target > + <seleccionar un objetivo> + + + + (S)elect target + (S)elecciona un objetivo + + + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar + + + + DialogFBranch + + + FrameBranch Manager + Gestor de marcos ramificados + + + + <no target selected> + <ningun objetivo seleccionado> + + + + <degrees> + <grados> + - - 100 - + + offset tail + Desfasar cola - - 90 - + + Trim/Extend + Cortar/Extender + + + + AddBeams + Agregar vigas + + + + Add single beam + Agregar viga simple + + + + ChangeProfile + Cambiar perfil + + + + <name> + <nombre> + + + + <no item selected> + <ningun elemento seleccionado> + + + + Redraw + Redibujar + + + + offset head + Desfasar cabezera + + + + RemoveBeams + Eliminar vigas + + + + Get targets + Obtener objetivos + + + + <length> + <longitud> + + + + hotkeys: "S" to select, "X" to trim + teclas rapidas: "S" para seleccionar, "X" para ejecutar - DialogDp + DialogFillFrame - - Dp calculator - Calculadora de Dp + + Fill frame + Llenar marco - - calculation - calculo + + move + mover - - Nr. of curves = 0 - Numero de curvas = 0 + + (S)elect + (S)eleccionar - - Roughness (um) - Rugozidad (um) + + < select a beam > + < selecciona una viga > - - 100 - + + copy + copiar - - - 20 - + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar + + + DialogJoinPypes - - Flow-rate (m3/h) - Ritmo de flujo (m3/h) + + Join pypes + Unir tubos - - Total length = 0 - Longitud total = 0 + + Reset + Reiniciar - - Scope - Alcance + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar + + + + DialogProtoPipeForm + + + Dialog + Dialogo - - <on selection> - <en seleccion> + + Rating: + Grado: - - Pipe material - Material de tubo + + Insert + Insertar + + + DialogRoute - - fluid properties - Propiedades del fluido + + Create pipe route + Crear trayectoria de tuberia - - Density (kg/m3) - Densidad (kg/m3) + + Y + - - liquid - liquido + + X + - - T (°C) - T (°C) + + Z + - - Viscosity (cP) - Viscosidad (cP) + + global Z + Z global - - + + Normal to sketch: + Normal al croquis: + + + + Offset (mm): + Desfasar (mm): + + + 0 - + - - gas/vapour - gas/vapor + + <select an edge> + <seleccionar un borde> - - 1 - + + Get edge + Obtener borde - - Name - Nombre + + (S)et normal + (S)Asignar normal - - P abs. (bar) - Presion absoluta. (bar) + + hotkeys: +"S" to select normal from geometry +"X" to execute + teclas rapidas: "S" para seleccionar la normal de la geometria + "X" para ejecutar + + + DialogValves - - results - resultados + + Insert valves + Insertar valvulas - - Export - Exportar + + Apply + Aplicar - - *** LIQUID *** - *** LIQUIDO *** + + Reverse + Invertir - - --- - + + Type: + Tipo: - DialogExtend - - - Extend beams - Extender viga - + DialogDp - - < select a target > - <seleccionar un objetivo> + + Dp calculator + Calculadora de Dp - - (S)elect target - (S)elecciona un objetivo + + calculation + calculo - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Nr. of curves = 0 + Numero de curvas = 0 - - - DialogFBranch - - FrameBranch Manager - Gestor de marcos ramificados + + Roughness (um) + Rugozidad (um) - - <no target selected> - <ningun objetivo seleccionado> + + 100 + - - <degrees> - <grados> + + + 20 + - - offset tail - Desfasar cola + + Flow-rate (m3/h) + Ritmo de flujo (m3/h) - - Trim/Extend - Cortar/Extender + + Total length = 0 + Longitud total = 0 - - AddBeams - Agregar vigas + + Scope + Alcance - - Add single beam - Agregar viga simple + + <on selection> + <en seleccion> - - ChangeProfile - Cambiar perfil + + Pipe material + Material de tubo - - <name> - <nombre> + + fluid properties + Propiedades del fluido - - <no item selected> - <ningun elemento seleccionado> + + Density (kg/m3) + Densidad (kg/m3) - - Redraw - Redibujar + + liquid + liquido - - offset head - Desfasar cabezera + + T (°C) + T (°C) - - RemoveBeams - Eliminar vigas + + Viscosity (cP) + Viscosidad (cP) - - Get targets - Obtener objetivos + + + 0 + - - <length> - <longitud> + + gas/vapour + gas/vapor - - hotkeys: "S" to select, "X" to trim - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + 1 + - - - DialogFillFrame - - Fill frame - Llenar marco + + Name + Nombre - - move - mover + + P abs. (bar) + Presion absoluta. (bar) - - (S)elect - (S)eleccionar + + results + resultados - - < select a beam > - < selecciona una viga > + + Export + Exportar - - copy - copiar + + *** LIQUID *** + *** LIQUIDO *** - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + --- + @@ -2371,53 +2828,17 @@ para exportar en formato step XY - + XZ - + YZ - - - - - DialogJoinPypes - - - Join pypes - Unir tubos - - - - Reset - Reiniciar - - - - hotkeys: "S" to select, "X" to execute - - - - - DialogProtoPipeForm - - - Dialog - Dialogo - - - - Rating: - - - - - Insert - Insertar + @@ -2430,17 +2851,17 @@ para exportar en formato step Z - + 90 - + Y - + @@ -2450,7 +2871,7 @@ para exportar en formato step X - + @@ -2465,7 +2886,7 @@ para exportar en formato step hotkeys: "S" to select, "X" to execute - + teclas rapidas: "S" para seleccionar, "X" para ejecutar @@ -2473,175 +2894,110 @@ para exportar en formato step (S)Asignar eje - - DialogRoute - - - Create pipe route - Crear trayectoria de tuberia - - - - Y - - - - - X - - - - - Z - - - - - global Z - - - - - Normal to sketch: - Normal al croquis - - - - Offset (mm): - Desfasar (mm): - - - - 0 - - - - - <select an edge> - - - - - Get edge - - - - - (S)et normal - - - - - hotkeys: -"S" to select normal from geometry -"X" to execute - - - DialogSections Beams profile editor - + Editor de perfiles de vigas 45 - + D - + 80 - + H - + B - + t1 - + 5 - + t2 - + t3 - + <name> - + <nombre> NW - + Nor Oeste N - + Norte NE - + Nor Este W - + Oeste C - + Centro E - + Este SW - + Sur Oeste S - + Sur SE - + Sur Este @@ -2653,24 +3009,38 @@ para exportar en formato step ... - + Full section - + Seccion completa Apply dimensions - + Aplicar dimensiones + + + + Apply + dimensions + Aplicar + dimensiones Shift profile - + Desfazar perfil + + + + Shift + profile + Orientar + perfil @@ -2678,17 +3048,17 @@ profile Import shapes - + Importar formas <shapes> - + <formas> - - + @@ -2696,96 +3066,73 @@ profile Dialog - + Dialogo Tank - + Deposito Length - + Longitud X - + Width: - + Ancho: Y - + Height: - + Alto: Z - + Nozzles - + Boquillas Pipe type: - + Tipo de tubo: <select> - + <seleccionar> Flange type: - + Tipo de brida: 200 - + Add nozzle - - - - - DialogValves - - - Insert valves - - - - - Apply - - - - - Reverse - - - - - Type: - + Agregar boquilla diff --git a/uForms.py b/uForms.py index 6214044..ba764e4 100644 --- a/uForms.py +++ b/uForms.py @@ -263,8 +263,8 @@ def __init__(self): self.form.editViscosity.setEnabled(True) self.form.editDensity.setText("1000") self.form.editViscosity.setText("1") - self.form.labName.setText("*** CUSTOM FLUID ***") - self.form.comboFluid.addItems([""]) + self.form.labName.setText(translate("dpCalcDialog", "*** CUSTOM FLUID ***")) + self.form.comboFluid.addItems([translate("dpCalcDialog", "")]) self.form.comboWhat.addItems( [ o.Label @@ -387,7 +387,7 @@ def checkFluid(self): P = float(self.form.editPressure.text()) * 1e5 self.isMixture = True self.fluid = None - self.form.labName.setText("*** CUSTOM FLUID ***") + self.form.labName.setText(translate("dpCalcDialog", "*** CUSTOM FLUID ***")) self.form.editDensity.setEnabled(True) self.form.editViscosity.setEnabled(True) self.form.labResult.setText("---") @@ -406,7 +406,7 @@ def setLiquid(self): None, translate("dpCalcDialog", "No data found"), translate( - "dpCalcDialog", "It seems the fluid has not\na liquid state." + "dpCalcDialog", "It seems the fluid has not a liquid state." ), ) self.form.radioGas.setChecked(True) @@ -430,7 +430,7 @@ def setGas(self): None, translate("dpCalcDialog", "No data found"), translate( - "dpCalcDialog", "It seems the fluid has not\na gas state." + "dpCalcDialog", "It seems the fluid has not a gas state." ), ) self.form.radioLiquid.setChecked(True) From 51f2097b49f2d2a141c0be79b101c75dc78d90dd Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 22 Sep 2024 17:16:35 -0600 Subject: [PATCH 030/135] Add FreeCAD 1.1.0 support on fFeatures.py & normalize language path in pForms.py --- fFeatures.py | 56 ++++++++++++++++++++++++++++------------------ pForms.py | 4 ++-- pyrightconfig.json | 41 +++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 pyrightconfig.json diff --git a/fFeatures.py b/fFeatures.py index 66e3b41..7ba2e3a 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -7,15 +7,26 @@ import FreeCAD, FreeCADGui, Part, csv, fCmd, pCmd, ArchProfile from Arch import makeStructure +from Arch import makeProfile from Draft import makeCircle -from PySide.QtCore import * -from PySide.QtGui import * +from PySide2.QtCore import * +from PySide2.QtGui import * from os import listdir from os.path import join, dirname, abspath from math import degrees from uCmd import label3D -from PySide.QtCore import QT_TRANSLATE_NOOP -from DraftGui import translate +from PySide2.QtCore import QT_TRANSLATE_NOOP +from PySide2.QtWidgets import QDialog +from PySide2.QtWidgets import QWidget +from PySide2.QtWidgets import QListWidget +from PySide2.QtWidgets import QCheckBox +from PySide2.QtWidgets import QLabel +from PySide2.QtWidgets import QComboBox +from PySide2.QtWidgets import QHBoxLayout +from PySide2.QtWidgets import QVBoxLayout +from PySide2.QtWidgets import QPushButton +# from DraftGui import translate +from draftutils.translate import translate ################ FUNCTIONS ########################### @@ -27,18 +38,10 @@ def newProfile(prop): if prop["stype"] == "C": profile = makeCircle(float(prop["H"])) else: - profile = ArchProfile.makeProfile( - [ - 0, - "SECTION", - prop["SSize"] + "-000", - prop["stype"], - float(prop["W"]), - float(prop["H"]), - float(prop["ta"]), - float(prop["tf"]), - ] - ) + if int(FreeCAD.Version()[0]) >=1: + profile=makeProfile([0,"SECTION",prop["SSize"] + "-000",prop["stype"],float(prop["W"]),float(prop["H"]),float(prop["ta"]),float(prop["tf"]),]) + else: + profile=ArchProfile.makeProfile([0,"SECTION",prop["SSize"] + "-000",prop["stype"],float(prop["W"]),float(prop["H"]),float(prop["ta"]),float(prop["tf"]),]) return profile @@ -105,7 +108,7 @@ def __init__(self, winTitle="FrameLine Manager", icon="frameline.svg"): self.move(QPoint(100, 250)) self.setWindowFlags(Qt.WindowStaysOnTopHint) self.setWindowTitle(winTitle) - from PySide.QtGui import QIcon + from PySide2.QtGui import QIcon Icon = QIcon() iconPath = join(dirname(abspath(__file__)), "iconz", icon) @@ -536,7 +539,7 @@ def accept(self): if self.form.editName.text(): name = self.form.editName.text() else: - name = "Travatura" + name = translate("makeframenbranch","Travatura") a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", name) FrameBranch(a, bases[0], profile) ViewProviderFrameBranch(a.ViewObject) @@ -579,7 +582,7 @@ def mouseActionB1(self, CtrlAltShift): labText += ": part of " + fb.Label if self.labTail: self.labTail.removeLabel() - self.labTail = label3D(pl=obj.Placement, text="____TAIL") + self.labTail = label3D(pl=obj.Placement, text=translate("mouseActionB1","____TAIL")) else: if self.labTail: self.labTail.removeLabel() @@ -666,7 +669,10 @@ def addBeams(self): beam.addExtension("Part::AttachExtensionPython") else: beam.addExtension("Part::AttachExtensionPython", beam) - beam.Support = [(FB.Base, "Edge" + str(i + 1))] + if int(FreeCAD.Version()[0]) >= 1: + beam.AttachmentSupport = [(FB.Base, "Edge" + str(i + 1))] + else: + beam.Support = [(FB.Base, "Edge" + str(i + 1))] beam.MapMode = "NormalToEdge" beam.MapReversed = True beamsList[i] = str(beam.Name) @@ -759,7 +765,10 @@ def trim(self): for target in self.targets: for b in fCmd.beams(): if hasattr(b, "tailOffset") and hasattr(b, "headOffset"): - edge = b.Support[0][0].Shape.getElement(b.Support[0][1][0]) + if int(FreeCAD.Version()[0]) >= 1: + edge = b.AttachmentSupport[0][0].Shape.getElement(b.AttachmentSupport[0][1][0]) + else: + edge = b.Support[0][0].Shape.getElement(b.Support[0][1][0]) ax = edge.tangentAt(0).normalize() # fCmd.beamAx(b).normalize() tail = edge.valueAt(0) # b.Placement.Base head = edge.valueAt(edge.LastParameter) # tail+ax*float(b.Height) @@ -983,7 +992,10 @@ def redraw(self, obj): beam.addExtension("Part::AttachExtensionPython") else: beam.addExtension("Part::AttachExtensionPython", beam) - beam.Support = [(obj.Base, "Edge" + str(i + 1))] + if int(FreeCAD.Version()[0]) >= 1: + beam.AttachmentSupport = [(obj.Base, "Edge" + str(i + 1))] + else: + beam.Support = [(obj.Base, "Edge" + str(i + 1))] beam.MapMode = "NormalToEdge" beam.MapReversed = True beamsList.append(str(beam.Name)) diff --git a/pForms.py b/pForms.py index 9c62b2f..655d969 100644 --- a/pForms.py +++ b/pForms.py @@ -21,8 +21,8 @@ def getLanguagePath(): import os - - return os.path.join(os.path.dirname(__file__), "translationz") + notnormalized = os.path.join(os.path.dirname(__file__), "translationz") + return os.path.normpath(notnormalized) class redrawDialog(QDialog): diff --git a/pyrightconfig.json b/pyrightconfig.json new file mode 100644 index 0000000..69d4389 --- /dev/null +++ b/pyrightconfig.json @@ -0,0 +1,41 @@ +{ + "include": [ + "iconz", + "dialogz", + "shapez", + "tablez", + ], + + "exclude": [ + ], + + "ignore": [ + ], + + "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/FreeCAD-stubs", + "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/FreeCADGui-stubs", + + "defineConstant": { + "DEBUG": true + }, + + "reportMissingImports": "error", + "reportMissingTypeStubs": false, + + "pythonVersion": "3.10", + "pythonPlatform": "Linux", + + "executionEnvironments": [ + { + "root": ".", + "extraPaths": [ + "/home/edgar/.platformio/penv/lib/python3.12/site-packages", + "/usr/local/Mod/Part", + "/usr/local/Mod/Draft", + "/usr/local/Mod/BIM", + "/usr/local/lib", + "/usr/local/Ext/PySide", + ] + }, + ] +} From bc9f1fcf8296a490d4e87c049d5af26ab8a9b0fa Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 20 Oct 2024 08:18:13 -0600 Subject: [PATCH 031/135] Fix `.gitignore` --- .gitignore | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index e5b5dea..006ff65 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,2 @@ - -__pycache__/ -<<<<<<< HEAD -test_**.sh -======= ->>>>>>> 5f2f63f (Added locale update function) +__pycache__/ +test_**.sh From fce2558c5d374a339167e6d178f5de4e6d38919b Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 20 Oct 2024 08:28:24 -0600 Subject: [PATCH 032/135] Update translations script The previous way on which the files were updated is done is by creating some temporal files and then merging them to the original file. Doing this merge would let us to NOT lost the translations already done. It was done like that because we got the string from Python files and UI files because `lupdate` from Qt5 couldn't extract strings from Python files. Now the `lupdate` from Qt6 can do, so we have no need to merge different temp files, instead, we can do the update in a single command. The new advantage is that the `` tag is updated with all new occurrences. --- translationz/dodo.ts | 2861 ++++++++++++---------------- translationz/update_translation.sh | 105 +- 2 files changed, 1223 insertions(+), 1743 deletions(-) diff --git a/translationz/dodo.ts b/translationz/dodo.ts index 6faa927..d4ed1b0 100644 --- a/translationz/dodo.ts +++ b/translationz/dodo.ts @@ -4,229 +4,229 @@ App::Property - - - - - + + + + + Outside diameter - - - - - - + + + + + + Wall thickness - - - - + + + + Inside diameter - - + + Length of tube - - - - + + + + Section dim. - + Bend Angle - - + + Bend Radius - + Type of flange - + Flange diameter - + Bore diameter - + Bolts distance - + Bolts hole diameter - + Thickness of flange - + Nr. of bolts - + Thickness of raised face - + Diameter of raised face - + Length of welding neck - + Diameter of welding neck - + Outside diameter of pipe - + Major diameter - + Minor diameter - + Make the lenght variable - + Length of reduction - + Concentric or Eccentric - + the radius of bending - + The group. - + Type of pipeFeature - + Type of clamp - + Size of clamp - + Arc diameter - + Overall height - + Rod diameter - + Size of thread - + Ports position relative to the origin of Shape - + Tank's length - + Tank's width - + Tank's height - + Thikness of tank's shell - + Thikness of tank's top - + The tubes of the branch. - + The curves of the branch. - + The path. @@ -234,25 +234,25 @@ App::PropertyFloat - - + + The extension of the tail - - + + The extension of the head - - + + The rotation of the section - + Flow factor (m3/h/bar) @@ -260,118 +260,110 @@ App::PropertyLength - - - - + + + + + + Width of the beam - - - - - - - + + + + + + + + Height of the beam - + Thickness of the vertical sides - + Thickness of the horizontal sides - + Diameter of the beam - + Thickness - - - W of the beam - - - - - + + Thickness of the webs - - H of the beam - - - - - - + + + Thickness of the web - + Thickness of the flanges - + Width of the flanges - - - + + + Thickness 1 - - - + + + Thickness 2 - - - + + + Thickness 3 - - + + Width of the bottom flange - - + + Width of the top flange - + Outside diameter - + Wall thickness @@ -379,22 +371,22 @@ App::PropertyLink - + the edges - + the profile - + The path. - + The profile @@ -402,46 +394,46 @@ App::PropertyString - - + + Type of frameFeature - + Size of frame - + The group. - - - - - - - - - + + + + + + + + + Type of section - + Type of tubeFeature - + Rating of pipeFeature - + Nominal diameter @@ -449,7 +441,7 @@ App::PropertyStringList - + The beams names @@ -457,2717 +449,2232 @@ App::PropertyVectorList - + Ports position relative to the origin of Shape - DialogQM + DialogAlign - - Quick Insert + + Align flanges - - - FrameBranchManager - - FrameBranch Manager + + normY - - Open FrameBranch Manager + + YZ - - - Part::Feature - - Simple curve + + (S)elect face - - - Part::FeaturePython - - Tube + + XZ - - Elbow + + hotkeys: "S" to select, "X" to execute - - Flange + + XY - - Reduction + + < select a target face > - - U-Bolt + + Set normal - - Tank + + normX - - Cap + + normZ - - Valve + + Invert normal - Sketcher::SketchObject + DialogBeamShift - - pipeRoute + + Move - - - adjustFrameAngle - - adjustFrameAngle + + Multiple: - - Adjust the angle of frame by two edges + + + 1 - - - alignEdge - - Mate the edges + + + + 0 - - Join two edges: select two or pre-select several + + Set dist. - - - alignFlange - - alignFlange + + Z: - - Rotates the section of the beam to make the faces parallel to another face + + Steps: - - - attach2tube - - Attach to tube + + Y: - - Attach one pype to the nearest port of selected pipe + + copy + + + + + X: + + + + + hotkeys: "S" to select, "X" to execute - breakForm + DialogBeamStretch - - Break the pipes + + Stretch - - Length + + (S)et length - - <reference> + + both - - PypeLine: + + head - - <none> + + tail - - - breakPipe - - Break the pipe + + New length - mm: - - Break one pipe at point and insert gap + + hotkeys: "S" to select, "X" to execute - - - capQM - - QM for caps + + Stretched end: - dodo - - - - Utils - - + DialogDisp - - frametools + + Dialog - - pypetools + + Angle: - - Frame tools + + SET - - Pype tools + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate - - QkMenus + + Displacement: - - - dpCalc - - Pressure loss calculator + + 100 - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. + + 90 - dpCalcDialog + DialogDp - - - *** CUSTOM FLUID *** + + Dp calculator - - <custom fluid> + + calculation - - - No data found + + Nr. of curves = 0 - - It seems the fluid has not a liquid state. + + Roughness (um) - - It seems the fluid has not -a liquid state. + + Flow-rate (m3/h) - - *** LIQUID *** + + Total length = 0 - - Flow (m3/h) + + Scope - - It seems the fluid has not a gas state. + + <on selection> - - It seems the fluid has not -a gas state. + + Pipe material - - *** GAS/VAPOUR *** + + fluid properties - - Flow (kg/h) + + Density (kg/m3) - - - elbowQM - - QM for elbows + + liquid - - - extend - - extendTheBeam + + T (°C) - - Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + Viscosity (cP) - - - extend1intersection - - - Extends pipe to intersection + + gas/vapour - - - extend2intersection - - - Extends pipes to intersection + + Name - - - fObservers - - Select one beam and one edge + + P abs. (bar) - - First select the base beam, then the edges + + results - - First select the target plane, then the faces to align + + Export - - levelTheBeam - Transaction + + *** LIQUID *** - - Select the target face, then the others + + --- + + + DialogExtend - - alignFlange - Transaction + + Extend beams - - Select two edges to join. + + < select a target > - - joinTheBeamsEdges - Transaction + + (S)elect target - - Select the beam and input the length + + hotkeys: "S" to select, "X" to execute + + + DialogFBranch - - First Select the target shape, then the beams to extend. + + FrameBranch Manager - - Select 2 edges + + <no target selected> - - Adjust angle - Transaction + + <degrees> - - Select 2 edges =>[Ctrl]+select + + offset tail - - rotJoin - Transaction + + Trim/Extend - - - flangeQM - - QM for flanges + + AddBeams - - - flat - - Fit one elbow + + Add single beam - - Place the elbow between two pipes or beams + + ChangeProfile - - - frameIt - - Place one-beam over one-edge + + <name> - - Place one beam after the other over the edges + + <no item selected> - - - hackedL - - draw a DWire + + Redraw - - WP is re-positioned at each point. Possible to spin and offset it. + + offset head - - - insertAnyz - - Insert any shape + + RemoveBeams - - Insert a STEP, IGES or BREP + + Get targets - - - insertBranch - - Insert a branch + + <length> - - Insert a PypeBranch + + hotkeys: "S" to select, "X" to trim - insertBranchForm + DialogFillFrame - - Insert a branch + + Fill frame - - <name> + + move - - <bend radius> + + (S)elect - - - insertCap - - - Insert a cap + + < select a beam > - - - insertCapForm - - Insert caps + + copy - - Reverse + + hotkeys: "S" to select, "X" to execute + + + DialogHackedLine - - Apply + + Dialog - - - insertElbow - - - Insert a curve + + (M)ove origin on click - - - insertElbowForm - - Insert elbows + + (R)otate WP - - <bend angle> + + (O)ffset WP - - <bend radius> + + + + Align WP to principal plane + + + DialogJoinPypes - - Trim/Extend + + Join pypes - - Reverse + + Reset - - Apply + + hotkeys: "S" to select, "X" to execute + + + DialogProtoPipeForm - - 0 deg + + Dialog - - Wrong selection - + + Rating: - - deg + + Insert - insertFlange + DialogQM - - - Insert a flange + + Quick Insert - insertFlangeForm + DialogRotAround - - Insert flanges + + Rotate around axis - + Reverse - - Apply + + <select one axis> - - - insertPath - - insert Path + + copy items - - Creates one path along selected edges + + hotkeys: "S" to select, "X" to execute - - - insertPipe - - - Insert a tube + + (S)et axis - insertPipeForm + DialogRoute - - Insert pipes + + Create pipe route - - <length> - - - - - Reverse + + Y - - Apply + + X - - - insertPypeLine - - PypeLine Manager + + Z - - Open PypeLine Manager + + global Z - - - insertPypeLineForm - - PypeLine Manager + + Normal to sketch: - - <name> + + Offset (mm): - - Redraw + + 0 - - Part list + + <select an edge> - - Color + + Get edge - - Get Path + + (S)et normal - - Get Profile + + hotkeys: +"S" to select normal from geometry +"X" to execute + + + DialogSection - - <new> + + Beams profile editor - - - insertReduct - - - Insert a reduction + + t1 - - - insertReductForm - - Insert reductions + + t2 - - Reverse + + t3 - - Apply + + <name> - - Eccentric + + NW - - - insertRoute - - Insert a pipe route + + N - - Create a sketch attached to a circular edge + + NE - - - insertRouteForm - - <select an edge> + + W - - - insertSection - - Insert sections + + C - - Creates customized beam profiles 2D + + E - - - insertTank - - Insert a tank + + SW - - Create tank and nozzles + + S - - - insertTankForm - - doing combine + + SE - - files read + + + + + + + + + ... - - files not read + + Full section - - listNozzles: %s + + Apply +dimensions - - - insertUbolt - - - Insert a U-bolt + + Shift +profile - insertUboltForm + DialogShapes - - Insert U-bolt + + Import shapes - - - no ref. face - + + <shapes> + + + DialogTank - - Ref. face + + Dialog - - Head + + Tank - - Middle + + Length - - Tail + + X - - - insertValve - - - Insert a valve + + Width: - - - insertValveForm - - Insert valves + + Y - - Reverse + + Height: - - Apply + + Z - - Insert in pipe + + Nozzles - - - joinPype - - Join pypes + + Pipe type: - - Select the part-pype and the port + + + <select> - - - laydown - - Lay-down the pipe + + Flange type: - - Lay-down the pipe on the support plane + + Add nozzle - levelBeam + DialogValves - - Flush the surfaces + + Insert valves - - Shift the beams to line-up the faces to the first selection (faces must be //) + + Apply - - - makeHeader - - Connect to header + + Reverse - - Connect branches to one header pipe -Branches and header's axes must be ortho + + Type: - mateEdges + FrameBranchManager - - Mate pipes edges + + FrameBranch Manager - - Mate two terminations through their edges - - - - - moveHandle - - - Move objects - - - - - Move quickly objects inside viewport - - - - - moveWorkPlane - - - align Workplane - - - - - Moves and rotates the drafting workplane with points, edges and faces - - - - - offsetWorkPlane - - - Offset Work Plane - - - - - Offset: - - - - - offset Workplane - - - - - Shifts the WP alongg its normal. - - - - - pForms - - - Offset Work Plane - - - - - Offset: - - - - - pipeQM - - - QM for pipes - - - - - pivotBeam - - - pivotTheBeam - - - - - Rotates the beam around an axis (edge or center-of-curvature) - - - - - point2point - - - draw a tube point-to-point - - - - - Click on subsequent points. - - - - - point2pointPipe - - - Reset - - - - - Move WP on click - - - - - profEdit - - - Square - Profile name in the Tree View - - - - - T-profile - Profile name in the Tree View - - - - - U-profile - Profile name in the Tree View - - - - - H-profile - Profile name in the Tree View - - - - - L-profile - Profile name in the Tree View - - - - - Z-profile - Profile name in the Tree View - - - - - Omega-profile - Profile name in the Tree View - - - - - Circle-profile - Profile name in the Tree View - - - - - Insert profile - Transaction, used on undo/redo lists - - - - - Modify profile - Transaction, used on undo/redo lists - - - - - Shift profile - Transaction, used on undo/redo lists - - - - - protoPypeForm - - - - Rating: - - - - - Insert - - - - - protoTypeDialog - - - "%s" to select; "%s" to execute - - - - - "%s" to select; "%s" to execute - - - - - - No view available. - - - - - No view available. - - - - - - Actions "%s" and "%s" removed - - - - - Actions "%s" and "%s" removed - - - - - - queryModel - - - query the model - - - - - Click objects to print infos - - - - - raiseup - - - Raise-up the support - - - - - Raise the support to the pipe - - - - - reverseBeam - - - Reverse orientation - - - - - Reverse the orientation of selected objects - - - - - rotJoin - - - rotJoinEdge - - - - - Rotates and align the beam according another edge - - - - - rotWPForm - - - Angle: - - - - - Rotate working plane - - - - - rotateWorkPlane - - - rotate Workplane - - - - - Spin the Draft working plane about one of its axes - - - - - selectSolids - - - Select solids - - - - - Grab all solids or those partially selected - to export in .step format - - - - - shiftBeam - - - shiftTheBeam - - - - - Translate objects by vectors defined on existing geometry - - - - - spinSect - - - Spin beams by 45 deg. - - - - - Rotates the section of the beam by 45 degrees - - - - - stretchBeam - - - stretchTheBeam - - - - - Changes the length of the beam, either according a preselected edge or a direct input - - - - - uCmd - - - Quick move - Transaction - - - - - Offset Work Plane - - - - - Offset: - - - - - uForms - - - QueryTool - - - - - (Select a object) - - - - - (base) - - - - - Base: - - - - - (angle) - - - - - Rotation angle: - - - - - v = (x,y,z) - - - - - Rotation axis: - - - - - (Sub object property) - - - - - (Beam property) - - - - - (Profile property) - - - - - QueryObject - - - - - Exit - - - - - Angle: - - - - - Rotate WP - - - - - valveQM - - - QM for valves - - - - - Dialog - - - Dp calculator - - - - - calculation - - - - - Nr. of curves = 0 - - - - - Roughness (um) - - - - - Flow-rate (m3/h) - - - - - Total length = 0 - - - - - Scope - - - - - <on selection> - - - - - Pipe material - - - - - fluid properties - - - - - Density (kg/m3) - - - - - liquid - - - - - T (°C) - - - - - Viscosity (cP) - - - - - gas/vapour - - - - - Name + + Open FrameBranch Manager + + + Part::Feature - - P abs. (bar) + + Simple curve + + + Part::FeaturePython - - results + + Tube - - Export + + Elbow - - *** LIQUID *** + + Flange - - --- + + Reduction - - - Dialog + + U-Bolt - - (M)ove origin on click + + Tank - - (R)otate WP + + Cap - - (O)ffset WP + + Valve + + + Sketcher::SketchObject - - - - Align WP to principal plane + + pipeRoute + + + adjustFrameAngle - - Rotate around axis + + adjustFrameAngle - - Reverse + + Adjust the angle of frame by two edges + + + alignEdge - - <select one axis> + + Mate the edges - - copy items + + Join two edges: select two or pre-select several + + + alignFlange - - hotkeys: "S" to select, "X" to execute + + alignFlange - - (S)et axis + + Rotates the section of the beam to make the faces parallel to another face + + + attach2tube - - Beams profile editor + + Attach to tube - - t1 + + Attach one pype to the nearest port of selected pipe + + + breakForm - - t2 + + Break the pipes - - t3 + + Length - - <name> + + <reference> - - NW + + PypeLine: - - N + + <none> + + + breakPipe - - NE + + Break the pipe - - W + + Break one pipe at point and insert gap + + + capQM - - C + + QM for caps + + + dodo - - E + + + Utils - - SW + + frametools - - S + + pypetools - - SE + + Frame tools - - - - - - - - - ... + + Pype tools - - Full section + + QkMenus + + + dpCalc - - Apply -dimensions + + Pressure loss calculator - - Shift -profile + + Calculate pressure loss in "pypes" using ChEDL libraries. + See __doc__ of the module for futher information. + + + dpCalcDialog - - Import shapes + + + *** CUSTOM FLUID *** - - <shapes> + + <custom fluid> - - Tank + + + No data found - - Length + + It seems the fluid has not a liquid state. - - X + + *** LIQUID *** - - Width: + + Flow (m3/h) - - Y + + It seems the fluid has not a gas state. - - Height: + + *** GAS/VAPOUR *** - - Z + + Flow (kg/h) + + + elbowQM - - Nozzles + + QM for elbows + + + extend - - Pipe type: + + extendTheBeam - - - <select> + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + + extend1intersection - - Flange type: + + + Extends pipe to intersection + + + extend2intersection - - Add nozzle + + + Extends pipes to intersection - DialogAlign + fObservers - - Align flanges + + Select one beam and one edge - - normY + + First select the base beam, then the edges - - YZ + + First select the target plane, then the faces to align - - (S)elect face + + levelTheBeam + Transaction - - XZ + + Select the target face, then the others + + + + + alignFlange + Transaction - - hotkeys: "S" to select, "X" to execute + + Select two edges to join. - - XY + + joinTheBeamsEdges + Transaction - - < select a target face > + + Select the beam and input the length - - Set normal + + First Select the target shape, then the beams to extend. - - Set notmal + + Select 2 edges - - normX + + Adjust angle + Transaction - - normZ + + Select 2 edges =>[Ctrl]+select - - Invert normal + + rotJoin + Transaction - DialogBeamShift - - - Move - - + flangeQM - - Multiple: + + QM for flanges + + + flat - - - 1 + + Fit one elbow - - - - 0 + + Place the elbow between two pipes or beams + + + frameIt - - Set dist. + + Place one-beam over one-edge - - Z: + + Place one beam after the other over the edges + + + hackedL - - Z: + + draw a DWire - - Steps: + + WP is re-positioned at each point. Possible to spin and offset it. + + + insertAnyz - - Steps: + + Insert any shape - - Y: + + Insert a STEP, IGES or BREP + + + insertBranch - - Y: + + Insert a branch - - copy + + Insert a PypeBranch + + + insertBranchForm - - X: + + Insert a branch - - X: + + <name> - - hotkeys: "S" to select, "X" to execute + + <bend radius> - DialogBeamStretch + insertCap - - Stretch + + + Insert a cap + + + insertCapForm - - (S)et length + + Insert caps - - both + + Reverse - - head + + Apply + + + insertElbow - - tail + + + Insert a curve + + + insertElbowForm - - New length - mm: + + Insert elbows - - hotkeys: "S" to select, "X" to execute + + <bend angle> - - Stretched end: + + <bend radius> - - - DialogDisp - - Dialog + + Trim/Extend - - Angle: + + Reverse - - SET + + Apply - - * Click on arrow to move - * Ctrl+Click to go back - * Ctrl+Alt+Click to rotate + + 0 deg - - Displacement: + + Wrong selection + - - 100 + + deg + + + insertFlange - - 90 + + + Insert a flange - DialogExtend + insertFlangeForm - - Extend beams + + Insert flanges - - < select a target > + + Reverse - - (S)elect target + + Apply + + + insertPath - - hotkeys: "S" to select, "X" to execute + + insert Path - - - DialogFBranch - - FrameBranch Manager + + Creates one path along selected edges + + + insertPipe - - <no target selected> + + + Insert a tube + + + insertPipeForm - - <degrees> + + Insert pipes - - offset tail + + <length> - - Trim/Extend + + Reverse - - AddBeams + + Apply + + + insertPypeLine - - Add single beam + + PypeLine Manager - - Add single + + Open PypeLine Manager + + + insertPypeLineForm - - ChangeProfile + + PypeLine Manager - + <name> - - <no item selected> + + Redraw - - Redraw + + Part list - - offset head + + Color - - RemoveBeams + + Get Path - - Get targets + + Get Profile - - <length> + + <new> + + + insertReduct - - hotkeys: "S" to select, "X" to trim + + + Insert a reduction - DialogFillFrame + insertReductForm - - Fill frame + + Insert reductions - - move + + Reverse - - (S)elect + + Apply - - < select a beam > + + Eccentric + + + insertRoute - - copy + + Insert a pipe route - - hotkeys: "S" to select, "X" to execute + + Create a sketch attached to a circular edge - DialogJoinPypes + insertRouteForm - - Join pypes + + <select an edge> + + + insertSection - - Reset + + Insert sections - - hotkeys: "S" to select, "X" to execute + + Creates customized beam profiles 2D - DialogProtoPipeForm - - - Dialog - - + insertTank - - Rating: + + Insert a tank - - Insert + + Create tank and nozzles - DialogRoute + insertTankForm - - Create pipe route + + doing combine - - Y + + files read - - X + + files not read - - Z + + listNozzles: %s + + + insertUbolt - - global Z + + + Insert a U-bolt + + + insertUboltForm - - Normal to sketch: + + Insert U-bolt - - Offset (mm): + + - no ref. face - - - 0 + + Ref. face - - <select an edge> + + Head - - Get edge + + Middle - - (S)et normal + + Tail + + + insertValve - - hotkeys: -"S" to select normal from geometry -"X" to execute + + + Insert a valve - DialogValves + insertValveForm - + Insert valves - - Apply + + Reverse - - Reverse + + Apply - - Type: + + Insert in pipe - DialogDp - - - Dp calculator - - - - - calculation - - - - - Nr. of curves = 0 - - + joinPype - - Roughness (um) + + Join pypes - - 100 + + Select the part-pype and the port + + + laydown - - - 20 + + Lay-down the pipe - - Flow-rate (m3/h) + + Lay-down the pipe on the support plane + + + levelBeam - - Total length = 0 + + Flush the surfaces - - Scope + + Shift the beams to line-up the faces to the first selection (faces must be //) + + + makeHeader - - <on selection> + + Connect to header - - Pipe material + + Connect branches to one header pipe +Branches and header's axes must be ortho + + + makeframenbranch - - fluid properties + + Travatura + + + mateEdges - - Density (kg/m3) + + Mate pipes edges - - liquid + + Mate two terminations through their edges + + + mouseActionB1 - - T (°C) + + ____TAIL + + + moveHandle - - Viscosity (cP) + + Move objects - - - 0 + + Move quickly objects inside viewport + + + moveWorkPlane - - gas/vapour + + align Workplane - - 1 + + Moves and rotates the drafting workplane with points, edges and faces + + + offsetWorkPlane - - Name + + Offset Work Plane - - P abs. (bar) + + Offset: - - results + + offset Workplane - - Export + + Shifts the WP alongg its normal. + + + pForms - - *** LIQUID *** + + Offset Work Plane - - --- + + Offset: - DialogHackedLine + pipeQM - - Dialog + + QM for pipes + + + pivotBeam - - (M)ove origin on click + + pivotTheBeam - - (R)otate WP + + Rotates the beam around an axis (edge or center-of-curvature) + + + point2point - - (O)ffset WP + + draw a tube point-to-point - - - - Align WP to principal plane + + Click on subsequent points. + + + point2pointPipe - - XY + + Reset - - XZ + + Move WP on click + + + profEdit - - YZ + + Square + Profile name in the Tree View - - - DialogRotAround - - Rotate around axis + + T-profile + Profile name in the Tree View - - Z + + U-profile + Profile name in the Tree View - - 90 + + H-profile + Profile name in the Tree View - - Y + + L-profile + Profile name in the Tree View - - Reverse + + Z-profile + Profile name in the Tree View - - X + + Omega-profile + Profile name in the Tree View - - <select one axis> + + Circle-profile + Profile name in the Tree View - - copy items + + Insert profile + Transaction, used on undo/redo lists - - hotkeys: "S" to select, "X" to execute + + Modify profile + Transaction, used on undo/redo lists - - (S)et axis + + Shift profile + Transaction, used on undo/redo lists - DialogSections + protoPypeForm - - Beams profile editor + + + Rating: - - - 45 + + Insert + + + protoTypeDialog - - D + + "%s" to select; "%s" to execute - - 80 + + No view available. - - H + + Actions "%s" and "%s" removed + + + queryModel - - B + + query the model - - t1 + + Click objects to print infos + + + raiseup - - - - 5 + + Raise-up the support - - t2 + + Raise the support to the pipe + + + reverseBeam - - t3 + + Reverse orientation - - <name> + + Reverse the orientation of selected objects + + + rotJoin - - NW + + rotJoinEdge - - N + + Rotates and align the beam according another edge + + + + + rotWPForm + + + Angle: - - NE + + Rotate working plane + + + rotateWorkPlane - - W + + rotate Workplane - - C + + Spin the Draft working plane about one of its axes + + + selectSolids - - E + + Select solids - - SW + + Grab all solids or those partially selected + to export in .step format + + + shiftBeam - - S + + shiftTheBeam - - SE + + Translate objects by vectors defined on existing geometry + + + spinSect - - - - - - - - - ... + + Spin beams by 45 deg. - - Full section + + Rotates the section of the beam by 45 degrees + + + stretchBeam - - Apply -dimensions + + stretchTheBeam - - Shift -profile + + Changes the length of the beam, either according a preselected edge or a direct input - DialogShapes + uCmd - - Import shapes + + Quick move + Transaction - - <shapes> + + Offset Work Plane - - - + + Offset: - DialogTank + uForms - - Dialog + + QueryTool - - Tank + + (Select a object) - - Length + + (base) - - X + + Base: - - Width: + + (angle) - - Y + + Rotation angle: - - Height: + + v = (x,y,z) - - Z + + Rotation axis: - - Nozzles + + (Sub object property) - - Pipe type: + + (Beam property) - - - <select> + + (Profile property) - - Flange type: + + QueryObject - - 200 + + Exit - - Add nozzle + + Rotate WP + + + + + valveQM + + + QM for valves diff --git a/translationz/update_translation.sh b/translationz/update_translation.sh index 07765c8..ccca2f2 100755 --- a/translationz/update_translation.sh +++ b/translationz/update_translation.sh @@ -4,15 +4,15 @@ # # Create, update and release translation files. # -# Supported locales on FreeCAD <2024-03-13, FreeCADGui.supportedLocales(), total=43>: +# Supported locales on FreeCAD <2024-10-14, FreeCADGui.supportedLocales(), total=44>: # {'English': 'en', 'Afrikaans': 'af', 'Arabic': 'ar', 'Basque': 'eu', 'Belarusian': 'be', # 'Bulgarian': 'bg', 'Catalan': 'ca', 'Chinese Simplified': 'zh-CN', -# 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr', 'Czech': 'cs', 'Dutch': 'nl', -# 'Filipino': 'fil', 'Finnish': 'fi', 'French': 'fr', 'Galician': 'gl', 'Georgian': 'ka', -# 'German': 'de', 'Greek': 'el', 'Hungarian': 'hu', 'Indonesian': 'id', 'Italian': 'it', -# 'Japanese': 'ja', 'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', 'Norwegian': 'no', -# 'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR', 'Romanian': 'ro', -# 'Russian': 'ru', 'Serbian': 'sr', 'Serbian, Latin': 'sr-CS', 'Slovak': 'sk', +# 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr', 'Czech': 'cs', 'Danish': 'da', +# 'Dutch': 'nl', 'Filipino': 'fil', 'Finnish': 'fi', 'French': 'fr', 'Galician': 'gl', +# 'Georgian': 'ka', 'German': 'de', 'Greek': 'el', 'Hungarian': 'hu', 'Indonesian': 'id', +# 'Italian': 'it', 'Japanese': 'ja', 'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', +# 'Norwegian': 'no', 'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR', +# 'Romanian': 'ro', 'Russian': 'ru', 'Serbian': 'sr', 'Serbian, Latin': 'sr-CS', 'Slovak': 'sk', # 'Slovenian': 'sl', 'Spanish': 'es-ES', 'Spanish, Argentina': 'es-AR', 'Swedish': 'sv-SE', # 'Turkish': 'tr', 'Ukrainian': 'uk', 'Valencian': 'val-ES', 'Vietnamese': 'vi'} # @@ -24,7 +24,7 @@ # - Make the script executable # $ chmod +x update_translation.sh # - The script has to be executed within the `translationz` directory. -# Executing the script with no flags involes the help. +# Executing the script with no flags invokes the help. # $ ./update_translation.sh # # NOTE: WORKFLOW TRANSLATOR (LOCAL) @@ -39,81 +39,44 @@ # NOTE: WORKFLOW MAINTAINER (CROWDIN) # - Execute the script passing the '-U' flag # $ ./update_translation.sh -U -# - Upload the updated file to Crowdin and wait for translators do their thing ;-) # - Once done, download the translated files, copy them to `translationz` +# - Upload the updated file to CrowdIn and wait for translators do their thing ;-) # and release all the files to update the changes # $ ./update_translation.sh -R # -# The usage of `pylupdate6` is preferred over 'pylupdate5' when extracting text strings from -# Python files. Also using `lupdate` from Qt6 is possible. -# # -------------------------------------------------------------------------------------------------- supported_locales=( "en" "af" "ar" "eu" "be" "bg" "ca" "zh-CN" "zh-TW" "hr" - "cs" "nl" "fil" "fi" "fr" "gl" "ka" "de" "el" "hu" - "id" "it" "ja" "kab" "ko" "lt" "no" "pl" "pt-PT" "pt-BR" - "ro" "ru" "sr" "sr-CS" "sk" "sl" "es-ES" "es-AR" "sv-SE" "tr" - "uk" "val-ES" "vi" + "cs" "da" "nl" "fil" "fi" "fr" "gl" "ka" "de" "el" + "hu" "id" "it" "ja" "kab" "ko" "lt" "no" "pl" "pt-PT" + "pt-BR" "ro" "ru" "sr" "sr-CS" "sk" "sl" "es-ES" "es-AR" "sv-SE" + "tr" "uk" "val-ES" "vi" ) is_locale_supported() { local locale="$1" for supported_locale in "${supported_locales[@]}"; do - if [[ "$supported_locale" == "$locale" ]]; then - return 0 - fi + [ "$supported_locale" == "$locale" ] && return 0 done return 1 } -get_strings() { - # Get translatable strings from Qt Designer files - lupdate ../dialogz/*.ui -ts uifiles.ts -no-obsolete - # Get translatable strings from Python file(s) - # pylupdate5 -verbose ../*.py -ts pyfiles.ts - pylupdate6 ../*.py -ts pyfiles.ts - # Join strings from Qt Designer and Python files into a single temp file - lconvert -i pyfiles.ts uifiles.ts -o _${WB}.ts -} - update_locale() { local locale="$1" local u=${locale:+_} # Conditional underscore + FILES="../*.py ../dialogz/*.ui" - # NOTE: Execute the right commands depending on: - # - if the file already exists and + # NOTE: Execute the right command depending on: # - if it's a locale file or the main, agnostic one - if [ ! -f "${WB}${u}${locale}.ts" ]; then - echo -e "\033[1;34m\n\t<<< Creating '${WB}${u}${locale}.ts' file >>>\n\033[m" - get_strings - if [ "$locale" == "" ]; then - lconvert -i _${WB}.ts -o ${WB}.ts - else - lconvert -source-language en -target-language $locale \ - -i _${WB}.ts -o ${WB}_${locale}.ts - fi + [ ! -f "${WB}${u}${locale}.ts" ] && action="Creating" || action="Updating" + echo -e "\033[1;34m\n\t<<< ${action} '${WB}${u}${locale}.ts' file >>>\n\033[m" + if [ "$u" == "" ]; then + eval $LUPDATE "$FILES" -ts "${WB}.ts" # locale-agnostic file else - echo -e "\033[1;34m\n\t<<< Updating '${WB}${u}${locale}.ts' file >>>\n\033[m" - get_strings - if [ "$locale" == "" ]; then - lconvert -i _${WB}.ts ${WB}.ts -o ${WB}.ts - else - lconvert -source-language en -target-language $locale \ - -i _${WB}.ts ${WB}_${locale}.ts -o ${WB}_${locale}.ts - fi + eval $LUPDATE "$FILES" -source-language en -target-language "${locale//-/_}" \ + -ts "${WB}_${locale}.ts" fi - - # Delete files that are no longer needed - rm pyfiles.ts - rm uifiles.ts - rm -f _${WB}.ts -} - -release_locale() { - # Release locale (creation of *.qm file from *.ts file) - local locale="$1" - lrelease ${WB}_${locale}.ts } help() { @@ -130,15 +93,20 @@ help() { # Main function ------------------------------------------------------------------------------------ +LUPDATE=/usr/lib/qt6/bin/lupdate # from Qt6 +# LUPDATE=lupdate # from Qt5 +LRELEASE=/usr/lib/qt6/bin/lrelease # from Qt6 +# LRELEASE=lrelease # from Qt5 WB="dodo" -if [ $# -eq 0 ]; then - help -elif [ $# -eq 1 ]; then +# Enforce underscore on locales +sed -i '3s/-/_/' ${WB}*.ts + +if [ $# -eq 1 ]; then if [ "$1" == "-R" ]; then find . -type f -name '*_*.ts' | while IFS= read -r file; do # Release all locales - lrelease $file + $LRELEASE "$file" echo done elif [ "$1" == "-U" ]; then @@ -151,8 +119,8 @@ elif [ $# -eq 2 ]; then LOCALE="$2" if is_locale_supported "$LOCALE"; then if [ "$1" == "-r" ]; then - # Release locale - release_locale "$LOCALE" + # Release locale (creation of *.qm file from *.ts file) + $LRELEASE "${WB}_${LOCALE}.ts" elif [ "$1" == "-u" ]; then # Update main & locale files update_locale @@ -160,7 +128,12 @@ elif [ $# -eq 2 ]; then fi else echo "Verify your language code. Case sensitive." - echo "If it's correct ask a maintainer to add support for your language on FreeCAD." + echo "If it's correct, ask a maintainer to add support for your language on FreeCAD." + echo -e "\nSupported locales, '\033[1;34mFreeCADGui.supportedLocales()\033[m': \033[1;33m" + for locale in $(printf "%s\n" "${supported_locales[@]}" | sort); do + echo -n "$locale " + done + echo fi else help From d8524a234a141f29154833507726a9708ee781d9 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 20 Oct 2024 08:38:55 -0600 Subject: [PATCH 033/135] Add `translationz/README.md` file --- translationz/README.md | 104 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 translationz/README.md diff --git a/translationz/README.md b/translationz/README.md new file mode 100644 index 0000000..207b278 --- /dev/null +++ b/translationz/README.md @@ -0,0 +1,104 @@ +# About translating Dodo Workbench + +> [!NOTE] +> All commands **must** be run in `./translationz/` directory. + +> [!IMPORTANT] +> If you want to update/release the files you need to have installed +> `lupdate` and `lrelease` from Qt6 version. Using the versions from +> Qt5 is not advised because they're buggy. + +## Updating translations template file + +To update the template file from source files you should use this command: + +```shell +./update_translation.sh -U +``` + +Once done you can commit the changes and upload the new file to CrowdIn platform +at webpage and find the **Dodo** project. + +## Creating file for missing locale + +### Using script + +To create a file for a new language with all **Dodo** translatable strings execute +the script with `-u` flag plus your locale: + +```shell +./update_translation.sh -u es-ES +``` + +### Renaming file + +Also you can rename new `Dodo.ts` file by appending the locale code, +for example, `Dodo_es-ES.ts` for Spanish (Spain) and change + +```xml + +``` + +to + +```xml + +``` + +As of 13/09/2024 the supported locales on FreeCAD +(according to `FreeCADGui.supportedLocales()`) are 44: + +```python +{'English': 'en', 'Afrikaans': 'af', 'Arabic': 'ar', 'Basque': 'eu', +'Belarusian': 'be', 'Bulgarian': 'bg', 'Catalan': 'ca', +'Chinese Simplified': 'zh-CN', 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr', +'Czech': 'cs', 'Danish': 'da', 'Dutch': 'nl', 'Filipino': 'fil', 'Finnish': 'fi', + 'French': 'fr', 'Galician': 'gl', 'Georgian': 'ka', 'German': 'de', 'Greek': 'el', + 'Hungarian': 'hu', 'Indonesian': 'id', 'Italian': 'it', 'Japanese': 'ja', + 'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', 'Norwegian': 'no', + 'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR', + 'Romanian': 'ro', 'Russian': 'ru', 'Serbian': 'sr', 'Serbian, Latin': 'sr-CS', + 'Slovak': 'sk', 'Slovenian': 'sl', 'Spanish': 'es-ES', 'Spanish, Argentina': 'es-AR', +'Swedish': 'sv-SE', 'Turkish': 'tr', 'Ukrainian': 'uk', 'Valencian': 'val-ES', +'Vietnamese': 'vi'} +``` + +## Translating + +To edit your language file open your file in `Qt Linguist` from `qt5-tools`/`qt6-tools` +package or in a text editor like `xed`, `mousepad`, `gedit`, `nano`, `vim`/`nvim`, +`geany` etc. and translate it. + +Alternatively you can visit the **FreeCAD-addons** project on CrowdIn platform +at webpage and find your language, +once done, look for the **Dodo** project. + +## Compiling translations + +To convert all `.ts` files to `.qm` files (merge) you can use this command: + +```shell +./update_translation.sh -R +``` + +If you are a translator that wants to update only their language file +to test it on **FreeCAD** before doing a PR you can use this command: + +```shell +./update_translation.sh -r es-ES +``` + +This will update the `.qm` file for your language (Spanish (Spain) in this case). + +## Sending translations + +Now you can contribute your translated `.ts` file to **Dodo** repository, +also include the `.qm` file. + + + +## More information + +You can read more about translating external workbenches here: + + From 309795d2ad8e2c17e3ec8fcbdcd1291316bbe84f Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 20 Oct 2024 08:43:08 -0600 Subject: [PATCH 034/135] fixup! Rename classes' names --- dialogz/align.ui | 2 +- dialogz/beamshift.ui | 2 +- dialogz/beamstretch.ui | 2 +- dialogz/disp.ui | 2 +- dialogz/dp.ui | 4 ++-- dialogz/extend.ui | 2 +- dialogz/fbranch.ui | 2 +- dialogz/fillframe.ui | 2 +- dialogz/hackedline.ui | 4 ++-- dialogz/joinPypes.ui | 2 +- dialogz/protoPypeForm.ui | 2 +- dialogz/rotAround.ui | 4 ++-- dialogz/route.ui | 2 +- dialogz/sections.ui | 4 ++-- dialogz/shapes.ui | 4 ++-- dialogz/tank.ui | 4 ++-- dialogz/valves.ui | 2 +- 17 files changed, 23 insertions(+), 23 deletions(-) diff --git a/dialogz/align.ui b/dialogz/align.ui index bfb9521..e2e278a 100644 --- a/dialogz/align.ui +++ b/dialogz/align.ui @@ -1,7 +1,7 @@ DialogAlign - + 0 diff --git a/dialogz/beamshift.ui b/dialogz/beamshift.ui index d985290..571a93c 100644 --- a/dialogz/beamshift.ui +++ b/dialogz/beamshift.ui @@ -1,7 +1,7 @@ DialogBeamShift - + 0 diff --git a/dialogz/beamstretch.ui b/dialogz/beamstretch.ui index c40367d..655a912 100644 --- a/dialogz/beamstretch.ui +++ b/dialogz/beamstretch.ui @@ -1,7 +1,7 @@ DialogBeamStretch - + 0 diff --git a/dialogz/disp.ui b/dialogz/disp.ui index 6c002d7..7dd7bf2 100644 --- a/dialogz/disp.ui +++ b/dialogz/disp.ui @@ -1,7 +1,7 @@ DialogDisp - + 0 diff --git a/dialogz/dp.ui b/dialogz/dp.ui index fcefd3d..8c85e49 100644 --- a/dialogz/dp.ui +++ b/dialogz/dp.ui @@ -1,7 +1,7 @@ - Dialog - + DialogDp + 0 diff --git a/dialogz/extend.ui b/dialogz/extend.ui index 4a90efb..89f51d8 100644 --- a/dialogz/extend.ui +++ b/dialogz/extend.ui @@ -1,7 +1,7 @@ DialogExtend - + 0 diff --git a/dialogz/fbranch.ui b/dialogz/fbranch.ui index cf9796f..d2764ce 100644 --- a/dialogz/fbranch.ui +++ b/dialogz/fbranch.ui @@ -1,7 +1,7 @@ DialogFBranch - + 0 diff --git a/dialogz/fillframe.ui b/dialogz/fillframe.ui index 30478bf..97573a2 100644 --- a/dialogz/fillframe.ui +++ b/dialogz/fillframe.ui @@ -1,7 +1,7 @@ DialogFillFrame - + 0 diff --git a/dialogz/hackedline.ui b/dialogz/hackedline.ui index 7bf8629..eba00eb 100644 --- a/dialogz/hackedline.ui +++ b/dialogz/hackedline.ui @@ -1,7 +1,7 @@ - Dialog - + DialogHackedLine + 0 diff --git a/dialogz/joinPypes.ui b/dialogz/joinPypes.ui index 445c6f9..d2a9003 100644 --- a/dialogz/joinPypes.ui +++ b/dialogz/joinPypes.ui @@ -1,7 +1,7 @@ DialogJoinPypes - + 0 diff --git a/dialogz/protoPypeForm.ui b/dialogz/protoPypeForm.ui index 6d8615b..b21369c 100644 --- a/dialogz/protoPypeForm.ui +++ b/dialogz/protoPypeForm.ui @@ -1,7 +1,7 @@ DialogProtoPipeForm - + 0 diff --git a/dialogz/rotAround.ui b/dialogz/rotAround.ui index 0ab38c3..b968c81 100644 --- a/dialogz/rotAround.ui +++ b/dialogz/rotAround.ui @@ -1,7 +1,7 @@ - Dialog - + DialogRotAround + 0 diff --git a/dialogz/route.ui b/dialogz/route.ui index a6a9f48..f49b3f4 100644 --- a/dialogz/route.ui +++ b/dialogz/route.ui @@ -1,7 +1,7 @@ DialogRoute - + 0 diff --git a/dialogz/sections.ui b/dialogz/sections.ui index 367e801..753d4a6 100644 --- a/dialogz/sections.ui +++ b/dialogz/sections.ui @@ -1,7 +1,7 @@ - Dialog - + DialogSection + 0 diff --git a/dialogz/shapes.ui b/dialogz/shapes.ui index cbcd701..178e437 100644 --- a/dialogz/shapes.ui +++ b/dialogz/shapes.ui @@ -1,7 +1,7 @@ - Dialog - + DialogShapes + 0 diff --git a/dialogz/tank.ui b/dialogz/tank.ui index d948909..f05137f 100644 --- a/dialogz/tank.ui +++ b/dialogz/tank.ui @@ -1,7 +1,7 @@ - Dialog - + DialogTank + 0 diff --git a/dialogz/valves.ui b/dialogz/valves.ui index ede5356..520f63f 100644 --- a/dialogz/valves.ui +++ b/dialogz/valves.ui @@ -1,7 +1,7 @@ DialogValves - + 0 From 263e7bad65aa54e0275f9a5478869206e98a110b Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 20 Oct 2024 09:04:36 -0600 Subject: [PATCH 035/135] Update README file --- README.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3d914a5..e1f377c 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,78 @@ -## Dodo Workbench -Dodo is the port of "Flamingo tools" for Py3/Qt5 builds of FreeCAD. -While providing basically the same features of flamingo and being compatible with its feature-pythons, it is also a general review of the instruments and interface. +# Dodo Workbench + +[![Contributions welcome][ContribsW_badge]][ContribsW] +[![license][license_badge]][license] +[![FreeCAD Addon Manager][AddonMgr_badge]][AddonMgr] +[![pre-commit enabled][pre-commit_badge]][pre-commit] +[![Code style: black][black_badge]][black] +[![GitHub Tag][tag_bagde]][tag] + +Dodo is the port of "Flamingo tools" for Py3/Qt5 builds of [FreeCAD](https://freecad.org). +While providing basically the same features of flamingo and being compatible with +its feature-pythons, it is also a general review of the instruments and interface. ![screenshot1](https://www.freecadweb.org/wiki/images/8/85/FlamingoBlob.png) ## Installation +### Automatic Installation + +The recommended way to install FreeGrid is via FreeCAD's +[Addon Manager](https://wiki.freecad.org/Std_AddonMgr) under +`Tools > Addon Manager` dropdown menu. + +Search for **FreeGrid** in the workbench category. + +### Manual installation + +The install path for FreeCAD modules depends on the operating system used. + +To find where is the user's application data directory enter next command on +FreeCAD's Python console. + +```python +App.getUserAppDataDir() +``` + +Examples on different OS + +- Linux: `/home/user/.local/share/FreeCAD/Mod/` +- macOS: `/Users/user/Library/Preferences/FreeCAD/Mod/` +- Windows: `C:\Users\user\AppData\Roaming\FreeCAD\Mod\` + +Use the CLI to enter the `Mod` directory and use Git to install Dodo: + +```shell +git clone https://github.com/oddtopus/dodo Dodo +``` + +If you are updating the code, restarting FreeCAD is advised. + ## Usage +Check the documentation on the FreeCAD Wiki article: + + +Discussion in the FreeCAD Forum: + + ## Links -* [FreeCAD Site main page](https://www.freecadweb.org/) +- [FreeCAD Site main page](https://www.freecad.org/) -* [FreeCAD Wiki main page](https://www.freecadweb.org/wiki) +- [FreeCAD Wiki main page](https://www.freecad.org/wiki) -* [FreeCAD Repository](https://github.com/FreeCAD/FreeCAD) +- [FreeCAD Repository](https://github.com/FreeCAD/FreeCAD) +[ContribsW]: ./CONTRIBUTING.md +[ContribsW_badge]: +[license]: ./LICENSE +[license_badge]: +[AddonMgr]: +[AddonMgr_badge]: +[pre-commit]: +[pre-commit_badge]: +[black]: +[black_badge]: +[tag]: +[tag_bagde]: From 7b35a9b2603c517ec1adab4851b70e842c42b4f6 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 20 Oct 2024 09:12:45 -0600 Subject: [PATCH 036/135] Add ruff config file to format Python files Intended to be used in conjunction with Neovim & LazyVim. The default LazyVim's Python specification use ruff-lsp to format files, this file let you configure ruff, mainly, the line width to 100 chars. --- .ruff.toml | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .ruff.toml diff --git a/.ruff.toml b/.ruff.toml new file mode 100644 index 0000000..f4bcdfa --- /dev/null +++ b/.ruff.toml @@ -0,0 +1,46 @@ +# Enforce 100-char line width, same as FreeCAD's pre-commit hook +line-length = 100 +indent-width = 4 + +[lint] +# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. +# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or +# McCabe complexity (`C901`) by default. +select = ["E4", "E7", "E9", "F"] +ignore = [] + +# Allow fix for all enabled rules (when `--fix`) is provided. +fixable = ["ALL"] +unfixable = [] + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[format] +exclude = ["*.pyi"] + +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +# Like Black, automatically detect the appropriate line ending. +line-ending = "auto" + +# Enable auto-formatting of code examples in docstrings. Markdown, +# reStructuredText code/literal blocks and doctests are all supported. +# +# This is currently disabled by default, but it is planned for this +# to be opt-out in the future. +docstring-code-format = false + +# Set the line length limit used when formatting code snippets in +# docstrings. +# +# This only has an effect when the `docstring-code-format` setting is +# enabled. +docstring-code-line-length = "dynamic" From b9892978883e21da62c65621b6ef675b30f447dc Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 20 Oct 2024 09:20:45 -0600 Subject: [PATCH 037/135] Add pre-commit hooks Using the ones are used on main FreeCAD plus codespell --- .codespellrc | 7 +++++++ .pre-commit-config.yaml | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 .codespellrc create mode 100644 .pre-commit-config.yaml diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 0000000..f63d907 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,7 @@ +[codespell] +# Ref: https://github.com/codespell-project/codespell#using-a-config-file +skip = .git*,ADDON_DISABLED,.codespellrc,metadata.txt +check-hidden = true +# camel-cased +ignore-regex = (\b[A-Za-z][a-z]*[A-Z]\S+\b|\.edn\b|\S+…|\\nd\b) +ignore-words-list = vertexes diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..5d9f466 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,23 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files + - id: mixed-line-ending + - repo: https://github.com/psf/black + rev: 24.4.2 + hooks: + - id: black + args: ["--line-length", "100"] + - repo: https://github.com/codespell-project/codespell + rev: v2.1.0 + hooks: + - id: codespell + files: ^.*\.(py|md|sh|ui|yml|xml)$ From d654289d9c19ab079e74f7d56ee8c35c8fa7efbc Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 20 Oct 2024 09:35:31 -0600 Subject: [PATCH 038/135] Update `package.xml` file --- package.xml | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/package.xml b/package.xml index c46efe2..ba5ef54 100644 --- a/package.xml +++ b/package.xml @@ -1,13 +1,30 @@ + Dodo + A set of commands and objects that help to speed-up the drawing of frames and pipelines. Py3/Qt5 port of flamingo. + 1.0.1 - Riccardo Treu (oddtopus) + + 2024-10-20 + + Edgar J Rojas + LGPLv3 - https://github.com/oddtopus/dodo - https://github.com/oddtopus/dodo/blob/master/README.md + + https://github.com/oddtopus/dodo + https://github.com/oddtopus/dodo/issues + + https://github.com/oddtopus/dodo/blob/master/README.md + + https://wiki.freecad.org/Dodo_Workbench + + https://forum.freecad.org/viewtopic.php?t=22711 + + Riccardo Treu (oddtopus) + iconz/dodo.svg From 5c8f8cb0f477f1c1d1862a2e723496dc45ad3396 Mon Sep 17 00:00:00 2001 From: ebrahimraeyat Date: Sun, 20 Oct 2024 21:15:40 -0600 Subject: [PATCH 039/135] ChangeProfile don't remove sketch profile From https://github.com/oddtopus/dodo/pull/9 e9b4201fe18a81a107ba5baba9f8777472aea78c --- fFeatures.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fFeatures.py b/fFeatures.py index 7ba2e3a..c74f29c 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -707,7 +707,10 @@ def changeProfile(self): name = FB.Profile.Name FB.Profile = profile FB.Proxy.redraw(FB) - FreeCAD.ActiveDocument.removeObject(name) + if self.SType == "": + profile.ViewObject.Visibility = False + else: + FreeCAD.ActiveDocument.removeObject(name) FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute() else: From ffd84d562f68d7195af12da8914609a10dbe0c2a Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Sun, 20 Oct 2024 21:33:14 -0600 Subject: [PATCH 040/135] Fix touched object after recomputation From https://github.com/oddtopus/dodo/pull/19/files a6978ccda2ec993120a09d2fb9810924661acfbd --- pFeatures.py | 64 +++++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/pFeatures.py b/pFeatures.py index 95ea243..b2f3ac6 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -153,6 +153,28 @@ def onChanged(self, fp, prop): fp.thk = (fp.OD - fp.ID) / 2 def execute(self, fp): + from math import tan + + try: + parent = fp.getParentGroup() + i = parent.Tubes.index(fp.Name) + edges = parent.Base.Shape.Edges + L = edges[i].Length + R = parent.BendRadius + if i < len(parent.Curves): + v1, v2 = [e.tangentAt(0) for e in edges[i : i + 2]] + alfa = float(v1.getAngle(v2)) / 2 + L -= float(R * tan(alfa)) + if i: + v1, v2 = [e.tangentAt(0) for e in edges[i - 1 : i + 1]] + alfa = float(v1.getAngle(v2)) / 2 + tang = float(R * tan(alfa)) + L -= tang + fp.AttachmentOffset.Base = FreeCAD.Vector(0, 0, tang) + fp.Height = L + except Exception as e: + # FreeCAD.Console.PrintWarning(str(e) + "\n") + pass if fp.thk > fp.OD / 2: fp.thk = fp.OD / 2 fp.ID = fp.OD - 2 * fp.thk @@ -229,6 +251,16 @@ def onChanged(self, fp, prop): fp.thk = (fp.OD - fp.ID) / 2 def execute(self, fp): + parent = fp.getParentGroup() + if parent: + try: + edges = parent.Base.Shape.Edges + i = parent.Curves.index(fp.Name) + v1,v2=[e.tangentAt(0) for e in edges[i:i+2]] + pCmd.placeTheElbow(fp,v1,v2) + except Exception as e: + # FreeCAD.Console.PrintWarning(str(e) + "\n") + pass if fp.BendAngle < 180: if fp.thk > fp.OD / 2: fp.thk = fp.OD / 2 @@ -1146,28 +1178,6 @@ def execute(self, fp): self.purge(fp) self.redraw(fp) return - from math import tan - - for i in range(len(fp.Tubes)): - L = fp.Base.Shape.Edges[i].Length - R = fp.BendRadius - # adjust the curve - if i < len(fp.Curves): - c = FreeCAD.ActiveDocument.getObject(fp.Curves[i]) - v1, v2 = [e.tangentAt(0) for e in fp.Base.Shape.Edges[i : i + 2]] - pCmd.placeTheElbow(c, v1, v2) - alfa = float(v1.getAngle(v2)) / 2 - L -= float(R * tan(alfa)) - # adjust the pipes - if i: - v1, v2 = [e.tangentAt(0) for e in fp.Base.Shape.Edges[i - 1 : i + 1]] - alfa = float(v1.getAngle(v2)) / 2 - tang = float(R * tan(alfa)) - L -= tang - FreeCAD.ActiveDocument.getObject( - fp.Tubes[i] - ).AttachmentOffset.Base = FreeCAD.Vector(0, 0, tang) - FreeCAD.ActiveDocument.getObject(fp.Tubes[i]).Height = L def redraw(self, fp): from math import tan, degrees @@ -1220,12 +1230,10 @@ def redraw(self, fp): curves.append(c.Name) fp.Tubes = tubes fp.Curves = curves - fp.addObjects( - [ - FreeCAD.ActiveDocument.getObject(name) - for name in fp.Tubes + fp.Curves - ] - ) + objs = [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves] + fp.addObjects(objs) + for obj in objs: + obj.Proxy.execute(obj) def purge(self, fp): if hasattr(fp, "Tubes"): From 1dac1a704007241ad9d9911c4687edda556997e8 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Sun, 20 Oct 2024 21:48:11 -0600 Subject: [PATCH 041/135] Make license match SPDX ID From https://github.com/oddtopus/dodo/pull/24 7888ed2812b2d4bccd813972387d5565741ed787 --- package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.xml b/package.xml index ba5ef54..28da26b 100644 --- a/package.xml +++ b/package.xml @@ -11,7 +11,7 @@ Edgar J Rojas - LGPLv3 + LGPL-3.0-or-later https://github.com/oddtopus/dodo From bce07a6914681f178a5157894349576e8296265b Mon Sep 17 00:00:00 2001 From: FilePhil Date: Wed, 21 Feb 2024 22:18:17 +0100 Subject: [PATCH 042/135] Added Cutlist Feature Folder --- cut_list/__init__.py | 29 +++ cut_list/cut_list_commands.py | 30 +++ cut_list/cut_list_creation.py | 219 ++++++++++++++++++++++ cut_list/cut_list_ui.py | 106 +++++++++++ cut_list/resources/cut_list_dialog.ui | 257 ++++++++++++++++++++++++++ cut_list/resources/cut_list_icon.svg | 98 ++++++++++ cut_list/resultSpreadsheet.py | 176 ++++++++++++++++++ 7 files changed, 915 insertions(+) create mode 100644 cut_list/__init__.py create mode 100644 cut_list/cut_list_commands.py create mode 100644 cut_list/cut_list_creation.py create mode 100644 cut_list/cut_list_ui.py create mode 100644 cut_list/resources/cut_list_dialog.ui create mode 100644 cut_list/resources/cut_list_icon.svg create mode 100644 cut_list/resultSpreadsheet.py diff --git a/cut_list/__init__.py b/cut_list/__init__.py new file mode 100644 index 0000000..5957893 --- /dev/null +++ b/cut_list/__init__.py @@ -0,0 +1,29 @@ +#**************************************************************************** +#* * +#* Cut List Creation for Dodo Workbench * +#* * +#* Copyright (c) 2023 FilePhil LGPL * +#* * +#* This program is free software; you can redistribute it and/or modify * +#* it under the terms of the GNU Lesser General Public License (LGPL) * +#* as published by the Free Software Foundation; either version 2 of * +#* the License, or (at your option) any later version. * +#* for detail see the LICENCE text file. * +#* * +#* This program is distributed in the hope that it will be useful, * +#* but WITHOUT ANY WARRANTY; without even the implied warranty of * +#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +#* GNU Library General Public License for more details. * +#* * +#* You should have received a copy of the GNU Library General Public * +#* License along with this program; if not, write to the Free Software * +#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +#* USA * +#* * +#**************************************************************************** + + +import os + +RESOURCE_PATH = os.path.join(os.path.dirname(__file__), "resources") + diff --git a/cut_list/cut_list_commands.py b/cut_list/cut_list_commands.py new file mode 100644 index 0000000..6f73c07 --- /dev/null +++ b/cut_list/cut_list_commands.py @@ -0,0 +1,30 @@ +import FreeCAD +import FreeCADGui +import os +from . import cut_list_ui +from . import cut_list_creation +from . import RESOURCE_PATH + + +class cutListCommand: + toolbarName = 'Cut List' + commandName = 'Create Cut List' + + def GetResources(self): + Icon = os.path.join(RESOURCE_PATH, "cut_list_icon.svg") + return {'MenuText': self.commandName, + 'ToolTip': "Create a new Cut List from Dodo Beams", + 'Pixmap': Icon + } + + def Activated(self): + + cut_list_ui.openCutListDialog() + + def IsActive(self): + """If there is no active document we can't do anything.""" + return not FreeCAD.ActiveDocument is None + + + +FreeCADGui.addCommand(cutListCommand.commandName, cutListCommand()) diff --git a/cut_list/cut_list_creation.py b/cut_list/cut_list_creation.py new file mode 100644 index 0000000..4e298cd --- /dev/null +++ b/cut_list/cut_list_creation.py @@ -0,0 +1,219 @@ +import FreeCAD +import FreeCADGui + +from dataclasses import dataclass, asdict + +from . import resultSpreadsheet + + +@dataclass +class Cut: + """ Store the Infomation about the cutted Piece and provide Helper Functions + """ + label: str + profil: str + length: object + cutwidth: object + position: int = 0 + + def getKey(self): + """ Provide a Key to generate the Position Number + """ + return self.profil + "|" + str(round(self.length.getValueAs("mm"),2)) + + def totalLength(self): + return self.length + self.cutwidth + + def getRow(self): + """Provide the Information from the Cutted Piece in the form of a dict""" + return {"Label": self.label,"Profil": self.profil, "Length": self.length,"CutWidth": self.cutwidth,"Pos.":self.position} + +@dataclass +class Beam: + """ Store the Infomation about the Stock Material Beam and provide Helper Functions + """ + number: int + length: object + lengthLeft: object + cuts: list[Cut] + + def addCut(self,cut): + """ Try to fit the cutted piece on the Beam and provide a status if it fits + """ + if self.length.getValueAs("mm") > 0.1 and self.lengthLeft < cut.totalLength(): + # Cut is not Possible on this Beam + # Ignore if Beam has no lenght + return False + + self.cuts.append(cut) + self.lengthLeft -= cut.totalLength() + return True + + def getCutsAsDict(self): + """ Get a easy to work with Dict List of the Beams / Cuts""" + return [x.getRow() for x in self.cuts] + + def lengthUsed(self): + return self.length - self.lengthLeft + + +def queryStructures(profiles:list,rootObjs = None): + """ Find all Structure Elements that use one of the selected profiles + """ + + resultObjs = [] + + if rootObjs is None: + rootObjs = FreeCAD.ActiveDocument.Objects + + for obj in rootObjs: + # Follow Link Groups + if obj.TypeId == "App::LinkGroup": + resultObjs = resultObjs + queryStructures(profiles,obj.ElementList) + + # TODO: A Link to a ink Group will currently not be queried + + # Get the base Profile Used for the Stucture + base = getattr(obj, "Base", None) + computedLength = getattr(obj, "ComputedLength", None) + + # Check if the Object is a valid Strucutre + if base is None or computedLength is None: + continue + + if base.Label in profiles: + resultObjs.append(obj) + + return resultObjs + +def nestCuts(profiles:list,beamLength,cutwidth): + """ Nest a List of Cuts on a Standard Beam length to estimate the needed Beams. + """ + + allStructures = queryStructures(profiles) + + # Sort Cuts Big to Small + sortedStructures = sorted(allStructures, key=lambda x:x.ComputedLength, reverse=True) + + allCuts = [] + beams = [] # List of Lists to reference what is together in one beam [beamLength,[Cut1,Cut2...]] + beam = Beam(1, beamLength, beamLength,[]) + beams.append(beam) + + # Go through all Structure Objects and try to fit them onto the Beams + for obj in sortedStructures: + + # Create Cut Object to hold all Attributes + label = obj.Label + profile = obj.Base.Label + length = round(obj.ComputedLength,2) + cutObj = Cut(label, profile, length, cutwidth) + + cutKey = cutObj.getKey() + + # Use the Key to define the Position Number of the Cut + if cutKey not in allCuts: + allCuts.append (cutKey) + cutObj.position = len(allCuts) + else: + cutObj.position = allCuts.index(cutKey)+1 + + # Try to fit the Object on exsting Beam + nofit = True + for beam in beams: + if beam.addCut(cutObj): + nofit = False + break + + # Add new Beam and add the Cut to it + if nofit: + beam = Beam(len(beams)+1, beamLength,beamLength,[]) + beams.append(beam) + if not beam.addCut(cutObj): + raise ValueError('Cut longer than beam!') + + return beams + + +def createSpreadSheetReport(beams, name="Result_Nest_Profile"): + """ Create a Spreadsheet as the Result of the Cut list Generation. + Each Piece will be displayed as One Row + """ + result = FreeCAD.ActiveDocument.addObject("Spreadsheet::Sheet", name) + + columnLabels = ["Pos.",'Profil','Label','Length'] + result = resultSpreadsheet.ResultSpreadsheet(result, columnLabels) + + for beam in beams: + result.printHeader(f"Beam No. {beam.number}") + + # Print the Used Length if a maximum Stock Value is given + beamLength = round(beam.length,2) + if beamLength.getValueAs("mm") <= 0.1: + result.printHeader(f"Used {round(beam.lengthUsed(),2)}") + else: + result.printHeader(f"Used {round(beam.lengthUsed(),2)} of {beamLength}") + + result.printColumnLabels() + result.printRows(beam.getCutsAsDict()) + result.printEmptyLine() + + result.recompute() + +def createSpreadSheetReportGrouped(beams, name="Result_Nest_Profile"): + """ Create a Spreadsheet as the Result of the Cut list Generation. + The Pieces will be grouped by the Length and Profile. + """ + + result = FreeCAD.ActiveDocument.addObject("Spreadsheet::Sheet", name) + + columnLabels = ["Pos.","Profil","Length","Quantity"] + result = resultSpreadsheet.ResultSpreadsheet(result, columnLabels) + + for beam in beams: + result.printHeader(f"Beam No. {beam.number}") + + # Print the Used Length if a maximum Stock Value is given + beamLength = round(beam.length,2) + if beamLength.getValueAs("mm") <= 0.1: + result.printHeader(f"Used {round(beam.lengthUsed(),2)}") + else: + result.printHeader(f"Used {round(beam.lengthUsed(),2)} of {beamLength}") + + result.printColumnLabels() + + resultRows = [] + usedKeys = [] + + for cut in beam.cuts: + # Add only one Row for each Key on the Beam + currentCutKey = cut.getKey() + if currentCutKey not in usedKeys: + + roWDict = cut.getRow() + # Calculate the Number of the same pieces + roWDict["Quantity"] = len([x for x in beam.cuts if x.getKey() == currentCutKey]) + + resultRows.append(roWDict) + usedKeys.append(cut.getKey()) + + result.printRows(resultRows) + result.printEmptyLine() + + result.recompute() + + +def createCutlist(profiles,maxBeamLength,cutWidth,GroupByLength=False): + """ Nest the Cuts to the Beams and create the Report Spreadsheet + """ + + profilesLabel = "_".join(profiles) + tableName = f"Cut_List_{profilesLabel}" + + beams = nestCuts(profiles,maxBeamLength,cutWidth) + + if GroupByLength: + createSpreadSheetReportGrouped(beams,tableName) + else: + createSpreadSheetReport(beams,tableName) + \ No newline at end of file diff --git a/cut_list/cut_list_ui.py b/cut_list/cut_list_ui.py new file mode 100644 index 0000000..7b6838f --- /dev/null +++ b/cut_list/cut_list_ui.py @@ -0,0 +1,106 @@ +import FreeCAD,FreeCADGui,Part +import os + +from FreeCAD import Units +from PySide import QtCore + +from . import RESOURCE_PATH +from . import cut_list_creation + + +class cutListUI: + def __init__(self): + uiPath = os.path.join(RESOURCE_PATH, "cut_list_dialog.ui") + # this will create a Qt widget from our ui file + self.form = FreeCADGui.PySideUic.loadUi(uiPath) + + # Set the Default Values and allow only Positiv Values + maxStockDefault = Units.parseQuantity("6m") + cutWidthDefault = Units.parseQuantity("5mm") + + self.form.max_stock_length.setProperty("value",maxStockDefault) + self.form.max_stock_length.setProperty("minimum",0.0) + + self.form.cut_width.setProperty("value",cutWidthDefault) + self.form.cut_width.setProperty("minimum",0.0) + + # Set Default Options + self.form.use_nesting.stateChanged.connect(self.useNestingToggle) + + self.form.use_nesting.setChecked(False) + + self.form.use_group_by_size.setChecked(True) + + # Update the UI + self.useNestingToggle() + self.UpdateProfileList() + self.selectProfilefromSelection() + + + def selectProfilefromSelection(self): + """ Select the selected Profile if some is used + """ + for selected in FreeCADGui.Selection.getSelection(): + selLabel = selected.Label + found = self.form.profile_list.findItems(selLabel,QtCore.Qt.MatchExactly) + if len(found)>0: + item = found[0] + item.setSelected(True) + + + + def useNestingToggle(self): + """ Toggle the Nesting Options depending on the Need + """ + state = self.form.use_nesting.checkState() + self.form.max_stock_length.setProperty("enabled",state) + self.form.cut_width.setProperty("enabled",state) + + def UpdateProfileList(self): + """ Add all Sketches/Profiles/Sections that can be used for the Beam Creation + """ + + sketches = [s.Label for s in FreeCAD.ActiveDocument.Objects if s.TypeId=="Sketcher::SketchObject"] + obj2D = [s.Label for s in FreeCAD.ActiveDocument.Objects if hasattr (s,"Shape") and s.Shape.Faces and not s.Shape.Solids] + + self.form.profile_list.clear() + self.form.profile_list.addItems(sketches) + + self.form.profile_list.addItems(obj2D) + + + def accept(self): + """ Start the Creation of the Cut List + """ + # Get all selected Profiles + sel = self.form.profile_list.currentItem() + profils = [] + for item in self.form.profile_list.selectedItems(): + profils.append(item.text()) + + if profils == []: + # Do not try to create a cut list with an empty selection + # TODO: Add Message Box + return + # Get teh Nesting Information or set the default + if self.form.use_nesting.checkState() == False: + maxStockLength = Units.parseQuantity("0mm") + cutWidth = Units.parseQuantity("0mm") + else: + maxStockLength = self.form.max_stock_length.property('value') + cutWidth = self.form.cut_width.property('value') + + # Generate the Cut List + cut_list_creation.createCutlist(profils, + maxStockLength, + cutWidth, + self.form.use_group_by_size.checkState()) + + FreeCADGui.Control.closeDialog() + + def reject(self): + FreeCADGui.Control.closeDialog() + +def openCutListDialog(): + panel = cutListUI() + FreeCADGui.Control.showDialog(panel) \ No newline at end of file diff --git a/cut_list/resources/cut_list_dialog.ui b/cut_list/resources/cut_list_dialog.ui new file mode 100644 index 0000000..854a84f --- /dev/null +++ b/cut_list/resources/cut_list_dialog.ui @@ -0,0 +1,257 @@ + + + Dialog + + + + 0 + 0 + 450 + 643 + + + + + 0 + 0 + + + + Create Cut List + + + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + true + false + + + + Select Profile + + + 10 + + + + + + + + 0 + 10 + + + + + 0 + 150 + + + + + 0 + 0 + + + + QAbstractScrollArea::AdjustIgnored + + + QAbstractItemView::NoEditTriggers + + + false + + + true + + + QAbstractItemView::MultiSelection + + + QListView::Fixed + + + QListView::SinglePass + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + true + false + + + + Cut List Options + + + 10 + + + + + + + + 0 + 0 + + + + Qt::LeftToRight + + + Group Parts by Size + + + + + + + + + + true + + + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + true + false + + + + Nesting Options + + + 10 + + + + + + + + + Maxmium Stock Length + + + 10 + + + + + + + Cut Width + + + 10 + + + + + + + + + + + + + + 0 + 0 + + + + Qt::LeftToRight + + + Use Nesting + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Gui::QuantitySpinBox + QDoubleSpinBox +
quantityspinbox.h
+
+
+ + +
diff --git a/cut_list/resources/cut_list_icon.svg b/cut_list/resources/cut_list_icon.svg new file mode 100644 index 0000000..a144344 --- /dev/null +++ b/cut_list/resources/cut_list_icon.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cut_list/resultSpreadsheet.py b/cut_list/resultSpreadsheet.py new file mode 100644 index 0000000..d6b5e97 --- /dev/null +++ b/cut_list/resultSpreadsheet.py @@ -0,0 +1,176 @@ +# Heavily Inspired Code from +# https://github.com/furti/FreeCAD-Reporting/blob/master/report.py + +import FreeCAD +import FreeCADGui +import string + + +COLUMN_NAMES = list(string.ascii_uppercase) + +def literalText(text): + return "'%s" % (text) + +def lineRange(startColumn, endColumn, lineNumber): + return cellRange(startColumn, lineNumber, endColumn, lineNumber) + + +def cellRange(startColumn, startLine, endColumn, endLine): + return '%s%s:%s%s' % (startColumn, startLine, endColumn, endLine) + +def nextColumnName(actualColumnName): + if actualColumnName is None: + return COLUMN_NAMES[0] + + nextIndex = COLUMN_NAMES.index(actualColumnName) + 1 + + if nextIndex >= len(COLUMN_NAMES): + nextIndex -= len(COLUMN_NAMES) + + return COLUMN_NAMES[nextIndex] + + +class ResultSpreadsheet(object): + + def __init__(self, spreadsheet, columnLabels): + + self.spreadsheet = spreadsheet + self.lineNumber = 1 + self.maxColumn = None + self.columnLabels = columnLabels + + def getColumnName(self, label): + if label is None: + return COLUMN_NAMES[0] + + nextIndex = self.columnLabels.index(label) + + if nextIndex >= len(COLUMN_NAMES): + nextIndex -= len(COLUMN_NAMES) + + return COLUMN_NAMES[nextIndex] + + + def clearAll(self): + self.spreadsheet.clearAll() + + def printEmptyLine(self): + self.lineNumber += 1 + + def printHeader(self, header='HAEADER'): + spreadsheet = self.spreadsheet + + if header is None or header == '': + return + + headerCell = 'A%s' % (self.lineNumber) + + self.setCellValue(headerCell, header) + spreadsheet.setStyle(headerCell, 'bold|underline', 'add') + + spreadsheet.mergeCells(lineRange('A', COLUMN_NAMES[len(self.columnLabels)-1], self.lineNumber)) + + self.lineNumber += 1 + self.updateMaxColumn('A') + + self.clearLine(self.lineNumber) + + def printColumnLabels(self): + spreadsheet = self.spreadsheet + + columnName = None + + for columnLabel in self.columnLabels: + columnName = self.getColumnName(columnLabel) + cellName = f"{columnName}{self.lineNumber}" + + self.setCellValue(cellName, columnLabel) + + spreadsheet.setStyle( + lineRange('A', columnName, self.lineNumber), 'bold', 'add') + + self.lineNumber += 1 + self.updateMaxColumn(columnName) + + self.clearLine(self.lineNumber) + + def printRows(self, rows): + lineNumberBefore = self.lineNumber + + columnName = 'A' + for row in rows: + columnName = None + + for columnlabel, value in row.items(): + if columnlabel in self.columnLabels: + columnName = self.getColumnName(columnlabel) + cellName = f"{columnName}{self.lineNumber}" + + self.setCellValue(cellName, value) + + self.lineNumber += 1 + + #if printResultInBold: + # self.spreadsheet.setStyle( + # cellRange('A', lineNumberBefore, columnName, self.lineNumber), 'bold', 'add') + + self.clearLine(self.lineNumber) + + + self.updateMaxColumn(columnName) + + def setCellValue(self, cell, value): + if value is None: + convertedValue = '' + elif isinstance(value, FreeCAD.Units.Quantity): + convertedValue = value.UserString + else: + convertedValue = str(value) + + convertedValue = literalText(convertedValue) + + self.spreadsheet.set(cell, convertedValue) + + def recompute(self): + self.spreadsheet.recompute() + + def updateMaxColumn(self, columnName): + if self.maxColumn is None: + self.maxColumn = columnName + else: + actualIndex = COLUMN_NAMES.index(self.maxColumn) + columnIndex = COLUMN_NAMES.index(columnName) + + if actualIndex < columnIndex: + self.maxColumn = columnName + + def clearUnusedCells(self, column, line): + if line is not None and line > self.lineNumber: + for lineNumberToDelete in range(line, self.lineNumber, -1): + self.clearLine(lineNumberToDelete) + + if column is not None: + columnIndex = COLUMN_NAMES.index(column) + maxColumnIndex = COLUMN_NAMES.index(self.maxColumn) + + if columnIndex > maxColumnIndex: + for columnIndexToDelete in range(columnIndex, maxColumnIndex, -1): + self.clearColumn(COLUMN_NAMES[columnIndexToDelete], line) + + def clearLine(self, lineNumberToDelete): + + column = None + + while column is None or column != self.maxColumn: + column = nextColumnName(column) + cellName = f"{column}{lineNumberToDelete}" + + + self.spreadsheet.clear(cellName) + + def clearColumn(self, columnToDelete, maxLineNumber): + + for lineNumber in range(1, maxLineNumber): + cellName = f"{columnToDelete}{lineNumber + 1}" + + self.spreadsheet.clear(cellName) From 016e8b0712df552345db1166df10721fa72806d8 Mon Sep 17 00:00:00 2001 From: FilePhil Date: Wed, 21 Feb 2024 22:19:44 +0100 Subject: [PATCH 043/135] Added Cut List Creation to Frame Tools --- InitGui.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/InitGui.py b/InitGui.py index f0b147e..8912863 100644 --- a/InitGui.py +++ b/InitGui.py @@ -145,7 +145,32 @@ class dodo ( Workbench ): def Initialize(self): import pForms import CUtils + self.utilsList=["selectSolids","queryModel","moveWorkPlane","offsetWorkPlane","rotateWorkPlane","hackedL","moveHandle","dpCalc"] + self.appendToolbar("Utils",self.utilsList) + Log ('Loading Utils: done\n') import CFrame + from cut_list.cut_list_commands import cutListCommand + + self.frameList=["frameIt", + "FrameBranchManager", + "insertSection", + "spinSect", + "reverseBeam", + "shiftBeam", + "pivotBeam", + "levelBeam", + "alignEdge", + "rotJoin", + "alignFlange", + "stretchBeam", + "extend", + "adjustFrameAngle", + "insertPath", + "Create Cut List"] + + self.appendToolbar("frameTools",self.frameList) + + Log ('Loading Frame tools: done\n') import CPipe self.pypeList=["insertPipe","insertElbow","insertReduct","insertCap","insertValve","insertFlange","insertUbolt","insertPypeLine","insertBranch","insertTank","insertRoute","breakPipe","mateEdges","flat","extend2intersection","extend1intersection","makeHeader","laydown","raiseup","attach2tube","point2point","insertAnyz"]#,"joinPype"] from PySide.QtCore import QT_TRANSLATE_NOOP From 0352e3904e3c7e956808e002b7b08ec5b8d9c145 Mon Sep 17 00:00:00 2001 From: FilePhil Date: Wed, 21 Feb 2024 22:20:58 +0100 Subject: [PATCH 044/135] changed Command Name to fit in with the workbench naming Schema --- InitGui.py | 2 +- cut_list/cut_list_commands.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/InitGui.py b/InitGui.py index 8912863..995c38b 100644 --- a/InitGui.py +++ b/InitGui.py @@ -166,7 +166,7 @@ def Initialize(self): "extend", "adjustFrameAngle", "insertPath", - "Create Cut List"] + "createCutList"] self.appendToolbar("frameTools",self.frameList) diff --git a/cut_list/cut_list_commands.py b/cut_list/cut_list_commands.py index 6f73c07..01d9902 100644 --- a/cut_list/cut_list_commands.py +++ b/cut_list/cut_list_commands.py @@ -8,7 +8,7 @@ class cutListCommand: toolbarName = 'Cut List' - commandName = 'Create Cut List' + commandName = 'createCutList' def GetResources(self): Icon = os.path.join(RESOURCE_PATH, "cut_list_icon.svg") From d1f89c7d520996b17b40b57e5871edb26c8ac122 Mon Sep 17 00:00:00 2001 From: FilePhil Date: Wed, 21 Feb 2024 22:28:36 +0100 Subject: [PATCH 045/135] Added GitIgnore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 006ff65..11df72b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -__pycache__/ test_**.sh +__pycache__/ +cut_list/__pycache__/ From 5008cd18d5fd270d4e43c7bc77ecb5bcfb77dd8b Mon Sep 17 00:00:00 2001 From: FilePhil Date: Tue, 5 Mar 2024 22:59:47 +0100 Subject: [PATCH 046/135] Added Readme to Cutlist Module --- cut_list/README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 cut_list/README.md diff --git a/cut_list/README.md b/cut_list/README.md new file mode 100644 index 0000000..8eb5344 --- /dev/null +++ b/cut_list/README.md @@ -0,0 +1,64 @@ +# Cut List Creation Command for Freecad Dodo Workbench (Macro Version) + +This macro can be used to create a cut list of beams created by the DODO-Workbench.\ +The cut list can use one or more profiles (sections/sketches).\ +A position number will be generated for each profile & length combination (rounded to 0.01mm).\ +The script will create a new speadsheet object with each cut list. + +# How to use it +[Cut_List.webm](https://github.com/FilePhil/dodo_Cutlist_Macro_Version/assets/16101101/e992a925-0a02-4560-8e7c-a22eef86234d) + +# Options +## Group Parts by Size +The Option "Group Parts by Size" will count all Pieces with the same profile and Length (rounded to 0.01mm). + +### Example: Group Party by Size + +| Beam No. 1 | | | | +|-----------------------------|--|--|--| +| Used 2855.0 mm | | | | +| Pos. | Profil | Length | Quantity | +| 1 | 10X10 | 610,00 mm | 2 | +| 2 | 10X10 | 600,00 mm | 2 | +| 3 | 10X10 | 410,00 mm | 1 | + +### Exampl: Without Group Party by Size + + | Beam No. 1 | | | | + |-----------------------------|--|--|--| + | Used 2410.0 mm | | | | + | Pos. | Profil | Label | Length + | 1 | 10X10 | Structure006 | 610,00 mm | + | 1 | 10X10 | Structure017 | 610,00 mm | + | 2 | 10X10 | Structure012 | 600,00 mm | + | 2 | 10X10 | Structure018 | 600,00 mm | + + +## Use Nesting +The Option "Use Nesting" allows to specify the maximum length of the Stock Material and allows for optimizing of the available material.\ +The cut Width will be added to each piece to account for the saw thickness.\ +The list will be seperated into Sections and shows the Used Length and the Parts that can be cut from the Stock Material.\ +The position number of a piece will be the same on every stock material beam. + +### Example with Nesting & Group Party by Size + +| Beam No. 1 | | | | +|-----------------------------|--|--|--| +| Used 2855.0 mm of 3000.0 mm | | | | +| Pos. | Profil | Length | Quantity | +| 1 | 10X10 | 610,00 mm | 2 | +| 2 | 10X10 | 600,00 mm | 2 | +| 3 | 10X10 | 410,00 mm | 1 | +| | | | | +| Beam No. 2 | +| Used 3000.0 mm of 3000.0 mm | +| Pos. | Profil | Length | Quantity| +| 3 | 10X10 | 410,00 mm | 1| +| 4 | 10X10 | 390,00 mm | 2| +| 5 | 10X10 | 210,00 mm | 2| +| 6 | 10X10 | 190,00 mm | 7| +| | | | | +| Beam No. 3 | +| Used 1365.0 mm of 3000.0 mm | +| Pos. | Profil | Length | Quantity| +| 6 | 10X10 | 190,00 mm | 7| From 6de2f607d9de4057c7f0f2b2e5a21966fbefeb83 Mon Sep 17 00:00:00 2001 From: FilePhil Date: Tue, 5 Mar 2024 23:01:34 +0100 Subject: [PATCH 047/135] Changed Readme from Macro Version to integrated Version --- cut_list/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cut_list/README.md b/cut_list/README.md index 8eb5344..ad63af2 100644 --- a/cut_list/README.md +++ b/cut_list/README.md @@ -1,6 +1,6 @@ -# Cut List Creation Command for Freecad Dodo Workbench (Macro Version) +# Cut List Creation Command for Dodo Workbench -This macro can be used to create a cut list of beams created by the DODO-Workbench.\ +This Module can be used to create a cut list of beams created by the DODO-Workbench.\ The cut list can use one or more profiles (sections/sketches).\ A position number will be generated for each profile & length combination (rounded to 0.01mm).\ The script will create a new speadsheet object with each cut list. From 01fba486e03a58ff5ecc5f4f2c6eb6c469d2f023 Mon Sep 17 00:00:00 2001 From: FilePhil Date: Sun, 30 Jun 2024 21:20:27 +0200 Subject: [PATCH 048/135] fixed Dataclass List for Python Version <3.9 --- cut_list/cut_list_creation.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cut_list/cut_list_creation.py b/cut_list/cut_list_creation.py index 4e298cd..4161264 100644 --- a/cut_list/cut_list_creation.py +++ b/cut_list/cut_list_creation.py @@ -2,6 +2,7 @@ import FreeCADGui from dataclasses import dataclass, asdict +from typing import List from . import resultSpreadsheet @@ -35,7 +36,7 @@ class Beam: number: int length: object lengthLeft: object - cuts: list[Cut] + cuts: List[Cut] def addCut(self,cut): """ Try to fit the cutted piece on the Beam and provide a status if it fits From 4ec3c997e42a95a80925940cf13efa2033c4c07a Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Mon, 21 Oct 2024 21:23:46 -0600 Subject: [PATCH 049/135] CutList integration, translation & new mitermethod -Fixed duplicated utils toolbar -Cut list dialog incluyed into bash script translation & translated to spanish -Incluye parcial method to generate bisect planes in sketckes vertexes --- InitGui.py | 26 +- cut_list/cut_list_commands.py | 6 +- cut_list/resources/cut_list_dialog.ui | 9 +- dialogz/fbranch.ui | 106 +- dialogz/sections.ui | 10 +- fFeatures.py | 82 + translationz/dodo.ts | 368 +-- translationz/dodo_es-ES.qm | Bin 50817 -> 45434 bytes translationz/dodo_es-ES.ts | 3562 +++++++++++-------------- translationz/update_translation.sh | 128 +- 10 files changed, 2030 insertions(+), 2267 deletions(-) diff --git a/InitGui.py b/InitGui.py index 995c38b..4e664ba 100644 --- a/InitGui.py +++ b/InitGui.py @@ -145,30 +145,8 @@ class dodo ( Workbench ): def Initialize(self): import pForms import CUtils - self.utilsList=["selectSolids","queryModel","moveWorkPlane","offsetWorkPlane","rotateWorkPlane","hackedL","moveHandle","dpCalc"] - self.appendToolbar("Utils",self.utilsList) - Log ('Loading Utils: done\n') import CFrame - from cut_list.cut_list_commands import cutListCommand - - self.frameList=["frameIt", - "FrameBranchManager", - "insertSection", - "spinSect", - "reverseBeam", - "shiftBeam", - "pivotBeam", - "levelBeam", - "alignEdge", - "rotJoin", - "alignFlange", - "stretchBeam", - "extend", - "adjustFrameAngle", - "insertPath", - "createCutList"] - - self.appendToolbar("frameTools",self.frameList) + from cut_list.cut_list_commands import cutListCommand Log ('Loading Frame tools: done\n') import CPipe @@ -183,7 +161,7 @@ def Initialize(self): self.appendToolbar(translate("dodo","Utils"),self.utilsList) Log ('Loading Utils: done\n') - self.frameList=["frameIt","FrameBranchManager","insertSection","spinSect","reverseBeam","shiftBeam","pivotBeam","levelBeam","alignEdge","rotJoin","alignFlange","stretchBeam","extend","adjustFrameAngle","insertPath"] + self.frameList=["frameIt","FrameBranchManager","insertSection","spinSect","reverseBeam","shiftBeam","pivotBeam","levelBeam","alignEdge","rotJoin","alignFlange","stretchBeam","extend","adjustFrameAngle","insertPath","createCutList"] self.appendToolbar(translate("dodo","frametools"),self.frameList) Log ('Loading Frame tools: done\n') diff --git a/cut_list/cut_list_commands.py b/cut_list/cut_list_commands.py index 01d9902..88c40f8 100644 --- a/cut_list/cut_list_commands.py +++ b/cut_list/cut_list_commands.py @@ -4,7 +4,7 @@ from . import cut_list_ui from . import cut_list_creation from . import RESOURCE_PATH - +from PySide.QtCore import QT_TRANSLATE_NOOP class cutListCommand: toolbarName = 'Cut List' @@ -12,8 +12,8 @@ class cutListCommand: def GetResources(self): Icon = os.path.join(RESOURCE_PATH, "cut_list_icon.svg") - return {'MenuText': self.commandName, - 'ToolTip': "Create a new Cut List from Dodo Beams", + return {'MenuText': QT_TRANSLATE_NOOP("cutListCommand","createCutList"), + 'ToolTip': QT_TRANSLATE_NOOP("cutListCommand","Create a new Cut List from Dodo Beams"), 'Pixmap': Icon } diff --git a/cut_list/resources/cut_list_dialog.ui b/cut_list/resources/cut_list_dialog.ui index 854a84f..79f4d33 100644 --- a/cut_list/resources/cut_list_dialog.ui +++ b/cut_list/resources/cut_list_dialog.ui @@ -1,7 +1,7 @@ - Dialog - + DialogCutList + 0 @@ -39,6 +39,7 @@ + 75 true false @@ -110,6 +111,7 @@ + 75 true false @@ -169,6 +171,7 @@ + 75 true false @@ -186,7 +189,7 @@ - Maxmium Stock Length + Maximum Stock Length 10 diff --git a/dialogz/fbranch.ui b/dialogz/fbranch.ui index d2764ce..96dd951 100644 --- a/dialogz/fbranch.ui +++ b/dialogz/fbranch.ui @@ -7,7 +7,7 @@ 0 0 290 - 395 + 504 @@ -20,16 +20,6 @@ FrameBranch Manager - - - - <no target selected> - - - Qt::AlignCenter - - - @@ -70,13 +60,6 @@ - - - - Add single beam - - - @@ -159,31 +142,6 @@ - - - - 359 - - - Qt::Horizontal - - - false - - - false - - - true - - - 15.000000000000000 - - - true - - - @@ -218,6 +176,68 @@ + + + + <no target selected> + + + Qt::AlignCenter + + + + + + + Slice Intersections + + + + + + + 359 + + + Qt::Horizontal + + + false + + + false + + + true + + + 15.000000000000000 + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Add single + + + diff --git a/dialogz/sections.ui b/dialogz/sections.ui index 753d4a6..36b75d0 100644 --- a/dialogz/sections.ui +++ b/dialogz/sections.ui @@ -135,7 +135,7 @@ - t1 + t1 Qt::AlignCenter @@ -155,7 +155,7 @@ - t2 + t2 Qt::AlignCenter @@ -175,7 +175,7 @@ - t3 + t3 Qt::AlignCenter @@ -771,8 +771,6 @@ profile tbZ tbOmega - - - + diff --git a/fFeatures.py b/fFeatures.py index c74f29c..5657aaf 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -461,6 +461,7 @@ def __init__(self): self.form.comboRatings.currentIndexChanged.connect(self.fillSizes) self.form.btnRemove.clicked.connect(self.removeBeams) self.form.btnAdd.clicked.connect(self.addBeams) + self.form.slicebtn.clicked.connect(self.makeMiter) self.form.btnProfile.clicked.connect(self.changeProfile) self.form.btnRefresh.clicked.connect(self.refresh) self.form.btnTargets.clicked.connect(self.selectAction) @@ -520,6 +521,87 @@ def makeSingle(self): beam.Height = float(self.form.editLength.text()) FreeCAD.ActiveDocument.recompute() + def cutcorners(self): + import ArchCutPlane + sel=FreeCADGui.Selection.getSelection() + seldoc=FreeCADGui.ActiveDocument + if sel[0].FType=='FrameBranch': + pass + # for beam in sel[0].Beams: + # if seldoc.: + # pass + # ArchCutPlane.cutComponentwithPlane(beam,) + + def makeMiter(self): + """Get intersection between lines, generate a plane between lines & do a boolean diferente""" + sel = FreeCADGui.Selection.getSelection() + # FreeCAD.Console.PrintMessage('posicion de boceto:'+ str(sel[0].Placement.Rotation)+'\r\n') + i=0 + intersectlines=[] + for element in sel[0].Geometry: + j=0 + for subelement in sel[0].Geometry: + if (element.EndPoint != subelement.EndPoint) and (element.StartPoint != subelement.StartPoint): + if element.intersectCC(subelement): + # intersectlines.append(element) + # intersectlines.append(subelement) + interpoint=element.intersectCC(subelement)[0] + # intersectpoint=FreeCAD.Vector(interpoint.X,interpoint.Y,interpoint.Z) + FreeCAD.Console.PrintMessage('Segmento '+str(element)+' intersecta con segmento '+str(subelement)+' aqui:'+ str(interpoint)+'\r\n') + resultv1=FreeCAD.Vector(element.EndPoint-element.StartPoint) + resultv2=FreeCAD.Vector(subelement.EndPoint-subelement.StartPoint) + bisectvector=fCmd.bisect(resultv1,resultv2) + plane=FreeCAD.activeDocument().addObject("Part::Plane","myplane") + plane.AttachmentSupport = sel[0].AttachmentSupport + plane.MapMode = 'FlatFace' + self.rotvector = element.StartPoint-FreeCAD.Vector(0,plane.Length/2,-plane.Length/2) + plane.recompute() + # self.CenterOfMass = plane.Shape.CenterOfMass + self.placementrotplan = FreeCAD.Placement(self.rotvector,FreeCAD.Rotation(FreeCAD.Vector(0,1,0),90)) + plane.AttachmentOffset = self.placementrotplan + # FreeCAD.Console.PrintMessage('Antes Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') + self.placementrelative = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)),element.StartPoint).multiply(self.placementrotplan) + self.placementfinal = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),90),element.StartPoint).multiply(self.placementrelative) + plane.AttachmentOffset = self.placementfinal + j=j+1 + if False: + vend1=FreeCAD.Vector(sel[0].Geometry[i-1].EndPoint) + vstart1=FreeCAD.Vector(sel[0].Geometry[i-1].StartPoint) + resultv1=vend1-vstart1 + vend2=FreeCAD.Vector(sel[0].Geometry[i].EndPoint) + vstart2=FreeCAD.Vector(sel[0].Geometry[i].StartPoint) + resultv2=vend2-vstart2 + crossvector=resultv1.cross(resultv2) + # FreeCAD.Console.PrintMessage(crossvector.Length) + bisectvector=fCmd.bisect(resultv1,resultv2) + # FreeCAD.Console.PrintMessage(intersectpoint) + # FreeCAD.Console.PrintMessage(crossvector) + # linseg=Part.LineSegment(intersectpoint,crossvector) + # linseg=Part.LineSegment(intersectpoint,bisectvector) + # obj=FreeCAD.ActiveDocument.addObject("Part::Feature", "Line") + # obj.Shape = linseg.toShape() + # obj.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(1,0,0),90)) + plane=FreeCAD.activeDocument().addObject("Part::Plane","myplane") + plane.AttachmentSupport = sel[0].AttachmentSupport + plane.MapMode = 'FlatFace' + self.rotvector = element.StartPoint-FreeCAD.Vector(0,plane.Length/2,-plane.Length/2) + plane.recompute() + # self.CenterOfMass = plane.Shape.CenterOfMass + self.placementrotplan = FreeCAD.Placement(self.rotvector,FreeCAD.Rotation(FreeCAD.Vector(0,1,0),90)) + plane.AttachmentOffset = self.placementrotplan + # FreeCAD.Console.PrintMessage('Antes Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') + self.placementrelative = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)),element.StartPoint).multiply(self.placementrotplan) + self.placementfinal = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),90),element.StartPoint).multiply(self.placementrelative) + plane.AttachmentOffset = self.placementfinal + # if i==0: + # FreeCADGui.ActiveDocument.myplane.PointSize = 10 + # FreeCADGui.ActiveDocument.myplane.PointColor = 100,50,20 + # elif i>=1: + # obj=FreeCADGui.ActiveDocument.getObject('myplane00'+str(i)) + # obj.PointSize = 10 + # obj.PointColor = 100,50,20 + i=i+1 + def accept(self): if FreeCAD.ActiveDocument: # GET BASE diff --git a/translationz/dodo.ts b/translationz/dodo.ts index d4ed1b0..20de142 100644 --- a/translationz/dodo.ts +++ b/translationz/dodo.ts @@ -5,228 +5,228 @@ App::Property - - - - + + + + Outside diameter - - - - - + + + + + Wall thickness - - - + + + Inside diameter - + Length of tube - - - + + + Section dim. - + Bend Angle - - + + Bend Radius - + Type of flange - + Flange diameter - + Bore diameter - + Bolts distance - + Bolts hole diameter - + Thickness of flange - + Nr. of bolts - + Thickness of raised face - + Diameter of raised face - + Length of welding neck - + Diameter of welding neck - + Outside diameter of pipe - + Major diameter - + Minor diameter - + Make the lenght variable - + Length of reduction - + Concentric or Eccentric - + the radius of bending - + The group. - + Type of pipeFeature - + Type of clamp - + Size of clamp - + Arc diameter - + Overall height - + Rod diameter - + Size of thread - + Ports position relative to the origin of Shape - + Tank's length - + Tank's width - + Tank's height - + Thikness of tank's shell - + Thikness of tank's top - + The tubes of the branch. - + The curves of the branch. - + The path. @@ -234,20 +234,20 @@ App::PropertyFloat - - + + The extension of the tail - - + + The extension of the head - - + + The rotation of the section @@ -260,110 +260,110 @@ App::PropertyLength - - - - - - + + + + + + Width of the beam - - - - - - - - + + + + + + + + Height of the beam - + Thickness of the vertical sides - + Thickness of the horizontal sides - + Diameter of the beam - + Thickness - - + + Thickness of the webs - - - + + + Thickness of the web - + Thickness of the flanges - + Width of the flanges - - - + + + Thickness 1 - - - + + + Thickness 2 - - - + + + Thickness 3 - - + + Width of the bottom flange - - + + Width of the top flange - + Outside diameter - + Wall thickness @@ -371,22 +371,22 @@ App::PropertyLink - + the edges - + the profile - + The path. - + The profile @@ -394,31 +394,31 @@ App::PropertyString - - + + Type of frameFeature - + Size of frame - + The group. - - - - - - - - - + + + + + + + + + Type of section @@ -441,7 +441,7 @@ App::PropertyStringList - + The beams names @@ -621,6 +621,49 @@ + + DialogCutList + + + Create Cut List + + + + + Select Profile + + + + + Cut List Options + + + + + Group Parts by Size + + + + + Nesting Options + + + + + Maximum Stock Length + + + + + Cut Width + + + + + Use Nesting + + + DialogDisp @@ -800,80 +843,85 @@ - + <no target selected> - + <degrees> - + offset tail - + Trim/Extend - + AddBeams - - Add single beam - - - - + ChangeProfile - + <name> - + <no item selected> - + Redraw - + offset head - + RemoveBeams - + Get targets - + <length> - + hotkeys: "S" to select, "X" to trim + + + Slice Intersections + + + + + Add single + + DialogFillFrame @@ -1087,21 +1135,6 @@ Beams profile editor - - - t1 - - - - - t2 - - - - - t3 - - <name> @@ -1460,36 +1493,49 @@ profile + + cutListCommand + + + createCutList + + + + + Create a new Cut List from Dodo Beams + + + dodo - - + + Utils - + frametools - + pypetools - + Frame tools - + Pype tools - + QkMenus @@ -2211,7 +2257,7 @@ Branches and header's axes must be ortho makeframenbranch - + Travatura @@ -2232,7 +2278,7 @@ Branches and header's axes must be ortho mouseActionB1 - + ____TAIL diff --git a/translationz/dodo_es-ES.qm b/translationz/dodo_es-ES.qm index 87892a9447d086e09b9159afa98bbb8f1f265e65..36dcad3a428520435897cd9da58ce00498732a69 100644 GIT binary patch delta 5343 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 I#}NbbALgsQ@c;k- delta 7129 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 App::Property - + + + + + Outside diameter Diametro exterior - + + + + + + Wall thickness Espesor de muro - + + + + Inside diameter Diametro interno - + + Length of tube Longitud del tubo - + + + + Section dim. Dimension de seccion. - + Bend Angle Angulo de dobles - + + Bend Radius Radio de dobles - + Type of flange Tipo de brida - Type of tubeFeature - Tipo caracteristica de tubo + Tipo caracteristica de tubo - Rating of pipeFeature - Relacion de caracteristicas de tubo + Relacion de caracteristicas de tubo - Nominal diameter - Diametro nominal + Diametro nominal - Flow factor (m3/h/bar) - Factor de flujo (m3/h/bar) + Factor de flujo (m3/h/bar) - + Flange diameter Diametro de brida - + Bore diameter Diametro de orificio - + Bolts distance Distancia de tornillos - + Bolts hole diameter Diametro de orificio para tornillo - + Thickness of flange Espesor de brida - + Nr. of bolts Numero de tornillos - + Thickness of raised face Espesor de cara elevada - + Diameter of raised face Diametro de cara elevada - + Length of welding neck Longitud de cuello para soldadura - + Diameter of welding neck Diametro de cuello para soldadura - + Outside diameter of pipe Diametro exterior de tuberia - + Major diameter Diametro mayor - + Minor diameter Diametro menor - + Make the lenght variable Hace la longitud variable - + Length of reduction Longitud de reducción - + Concentric or Eccentric Concentrico o excentrico - + the radius of bending El radio de dobles - + The group. El grupo. - + Type of pipeFeature Tipo de caracteristica de tubo - + Type of clamp Tipo de sujeccion - + Size of clamp Tamaño de sujeccion - + Arc diameter Diametro de arco - + Overall height Altura total - + Rod diameter Diametro de vastago - + Size of thread Tamaño de rosca - + Ports position relative to the origin of Shape Posicion de los puertos relativos al origen de la forma - + Tank's length Longitud de deposito - + Tank's width Ancho de deposito - + Tank's height Altura de deposito - + Thikness of tank's shell Espesor de carcaza del deposito - + Thikness of tank's top Espesor superior del deposito - + The tubes of the branch. Tubos de la derivación. - + The curves of the branch. Las curvas de la derivacion. - + The path. La ruta. @@ -237,25 +250,25 @@ App::PropertyFloat - - + + The extension of the tail La extension de la cola - - + + The extension of the head La extension de la cabezera - - + + The rotation of the section La rotacion de la seccion - + Flow factor (m3/h/bar) Factor de flujo (m3/h/bar) @@ -263,107 +276,110 @@ App::PropertyLength - - - - + + + + + + Width of the beam Ancho de la viga - - - - - - - + + + + + + + + Height of the beam Alto de la viga - + Thickness of the vertical sides Espesor de los lados verticales - + Thickness of the horizontal sides Espesor de los lados horizontales - + Diameter of the beam Diametro de la viga - + Thickness Espesor - - + + Thickness of the webs Espesor de la redes - - - + + + Thickness of the web Espesor de la red - + Thickness of the flanges Espesor de las bridas - + Width of the flanges Ancho de las bridas - - - + + + Thickness 1 Espesor 1 - - - + + + Thickness 2 Espesor 2 - - - + + + Thickness 3 Espesor 3 - - + + Width of the bottom flange Ancho inferior de la brida - - + + Width of the top flange Ancho superior de la brida - + Outside diameter Diametro exterior - + Wall thickness Espesor de pared @@ -371,22 +387,22 @@ App::PropertyLink - + the edges Los bordes - + the profile El perfil - + The path. La trayectoria. - + The profile El perfil @@ -394,46 +410,46 @@ App::PropertyString - - + + Type of frameFeature Tipo de caracteristica de marco - + Size of frame Tamaño de marco - + The group. El grupo. - - - - - - - - - + + + + + + + + + Type of section Tipo de seccion - + Type of tubeFeature Tipo de caracteristica de tubo - + Rating of pipeFeature Grado de caracteristica de tuberia - + Nominal diameter Diametro nominal @@ -441,7 +457,7 @@ App::PropertyStringList - + The beams names Los nombres de las vigas @@ -449,2690 +465,2310 @@ App::PropertyVectorList - + Ports position relative to the origin of Shape Posiciones de los puertos relativos al origen de la forma - DialogQM + DialogAlign - - Quick Insert - Insercion rapida + + Align flanges + Alinear bridas - - - FrameBranchManager - - FrameBranch Manager - Derivacion de gestor de marcos + + normY + Normal a Y - - Open FrameBranch Manager - Abre gestor de marcos + + YZ + YZ - - - Part::Feature - - CurvaSemplice - Curva simple + + (S)elect face + (S)elecciona cara - - Simple curve - Curva simple + + XZ + XZ - - Tube - Tubo + + hotkeys: "S" to select, "X" to execute + Teclas rapidas: "S" para seleccionar, "X" para ejecutar - - - Part::FeaturePython - - Tube - Tubo + + XY + XY - - Elbow - Codo + + < select a target face > + < selecciona una cara como objetivo > - - Flange - Brida + + Set normal + Asignar normal - - Reduction - Reduccion + + normX + Normal a X - - U-Bolt - Tornillo U + + normZ + Normal a Z - - Tank - Deposito + + Invert normal + Invertir normal + + + DialogBeamShift - - Cap - Tapon + + Move + Mover - - Valve - Valvula + + Multiple: + Multiplicar: - - - Sketcher::SketchObject - - pipeRoute - Rutatuberia + + + 1 + 1 - - - adjustFrameAngle - - adjustFrameAngle - Adjuste de angulo de marcos + + + + 0 + 0 - - Adjust the angle of frame by two edges - Ajusta del angulo del marco por medio de dos aristas + + Set dist. + Asignar distancia. - - - alignEdge - - Mate the edges - Coindicir las aristas + + Z: + Z: - - Join two edges: select two or pre-select several - Une dos aristas:selecciona dos o pre selecciona varias + + Steps: + Pasos: - - - alignFlange - - alignFlange - Alinear superficies + + Y: + Y: - - Rotates the section of the beam to make the faces parallel to another face - Rota la seccion de la viga para hacer las caras paralelas a otra cara + + copy + copiar - - - attach2tube - - Attach to tube - Ligado al tubo + + X: + X: - - Attach one pype to the nearest port of selected pipe - Liga un tipo de tuberia al puerto mas cercano de la tuberia seleccionada + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar - breakForm + DialogBeamStretch - - Break the pipes - Romper las tuberias + + Stretch + Estirar - - Length - Longituf + + (S)et length + (S)Asignar longitud - - <reference> - <referencia> + + both + ambos - - PypeLine: - Linea de tubo: + + head + cabecera - - <none> - <ninguno> + + tail + cola - - - breakPipe - - Break the pipe - Rompe la tuberia + + New length - mm: + Nueva longitud - mm: - - Break one pipe at point and insert gap - Dividir un tubo al punto e insertar un espacio + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar - - - capQM - - QM for caps - QM para tapones + + Stretched end: + Estirado final: - dodo + DialogCutList - - Utils - Utilerias + + Create Cut List + Crear lista de corte - - frametools - Herramientas estructurales + + Select Profile + Seleccionar perfil - - pypetools - Herramientas de tuberia + + Cut List Options + Opciones de lista de corte - - Frame tools - Herramientas para estructuras + + Group Parts by Size + Agrupar piezas por tamano - - Pype tools - Herramientas para tuberias + + Nesting Options + Opciones de anidado - - QkMenus - Menus QK + + Maximum Stock Length + Longitud maxima de surtido - - - dpCalc - - Pressure loss calculator - Calculadora de Perdida de presion + + Cut Width + Ancho de corte - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. - Calcular perdida de presión en tuberias utilizando biblioteca ChEDL. - Revisar __doc__ del modulo para mayor información. + + Use Nesting + Usar anidado - dpCalcDialog - - - - *** CUSTOM FLUID *** - *** FLUIDO PERSONALIZADO *** - + DialogDisp - - <custom fluid> - <Fluido personalizado> + + Dialog + Dialogo - - - No data found - Datos no encontrados + + Angle: + Angulo: - - It seems the fluid has not a liquid state. - Parece que el fluido no tiene un estado liquido. - - - - *** LIQUID *** - *** LIQUIDO *** + + SET + Asignar - - Flow (m3/h) - Flujo (m3/h) + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + * Cliquear en flecha para mover + * Control+clic para regresar + * Control+alt+clic para rotar - - It seems the fluid has not a gas state. - Parece que el fluido no tiene un estado gaseoso. + + Displacement: + Desplazamiento: - - *** GAS/VAPOUR *** - *** GAS/VAPOR *** + + 100 + - - Flow (kg/h) - Flujo (kg/h) + + 90 + - elbowQM + DialogDp - - QM for elbows - QM para codos + + Dp calculator + Calculadora de Dp - - - extend - - extendTheBeam - Extender la viga + + calculation + calculo - - Extend the beam either to a face, a vertex or the c.o.m. of the selected object - Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado + + Nr. of curves = 0 + Numero de curvas = 0 - - - extend1intersection - - Extends pipe to intersection - Extender tubo a la interseccion + + Roughness (um) + Rugozidad (um) - - - extend2intersection - - Extends pipes to intersection - Extender tubos a la interseccion + + Flow-rate (m3/h) + Ritmo de flujo (m3/h) - - - fObservers - - Select one beam and one edge - Seleccionar una viga y un borde + + Total length = 0 + Longitud total = 0 - - First select the base beam, then the edges - Primero seleccionar la base, luego los bordes + + Scope + Alcance - - First select the target plane, then the faces to align - Primero seleccionar el plano objetivo, luego las caras a alinear + + <on selection> + <en seleccion> - - levelTheBeam - Transaction - Nivelar la viga + + Pipe material + Material de tubo - - Select the target face, then the others - Seleccionar la cara objetivo, luego las otras + + fluid properties + Propiedades del fluido - - alignFlange - Transaction - Alinear brida + + Density (kg/m3) + Densidad (kg/m3) - - Select two edges to join. - Seleccionar dos bordes para unir. + + liquid + liquido - - joinTheBeamsEdges - Transaction - Unir los bordes de las vigas + + T (°C) + T (°C) - - Select the beam and input the length - Selecciona la viga y la entrada de la longitud + + Viscosity (cP) + Viscosidad (cP) - - First Select the target shape, then the beams to extend. - Primero selecciona la forma objetivo, luego la viga a extender. + + gas/vapour + gas/vapor - - Select 2 edges - Seleccionar 2 bordes + + Name + Nombre - - Adjust angle - Transaction - Ajustar angulo + + P abs. (bar) + Presion absoluta. (bar) - - Select 2 edges =>[Ctrl]+select - Seleccionar 2 bordes =>[Ctrl]+seleccionar + + results + resultados - - rotJoin - Transaction - Rotar union + + Export + Exportar - - - flangeQM - - QM for flanges - QM para bridas + + *** LIQUID *** + *** LIQUIDO *** + + + + --- + - flat + DialogExtend - - Fit one elbow - Colocar un codo + + Extend beams + Extender viga - - Place the elbow between two pipes or beams - Colocar un codo entre 2 tuberias o vigas + + < select a target > + <seleccionar un objetivo> - - - frameIt - - Place one-beam over one-edge - Coloca una viga sobre una arista + + (S)elect target + (S)elecciona un objetivo - - Place one beam after the other over the edges - Coloca una viga despues de las otras aristas + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar - hackedL + DialogFBranch - - draw a DWire - Dibuja un Dwire + + FrameBranch Manager + Gestor de marcos ramificados - - WP is re-positioned at each point. Possible to spin and offset it. - Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. + + <no target selected> + <ningun objetivo seleccionado> - - - insertAnyz - - Insert any shape - Insertar cualquier forma + + <degrees> + <grados> - - Insert a STEP, IGES or BREP - Insertar un solido STEP, IGES, BREP + + offset tail + Desfasar cola - - - insertBranch - - Insert a branch - Insertar una derivación + + Trim/Extend + Cortar/Extender - - Insert a PypeBranch - Insertar una derivacion de tuberia + + AddBeams + Agregar vigas - - - insertBranchForm - - Insert a branch - Insertar una ramificacion + Add single beam + Agregar viga simple - + + ChangeProfile + Cambiar perfil + + + <name> <nombre> - - <bend radius> - <radio de dobles> + + <no item selected> + <ningun elemento seleccionado> - - - insertCap - - Insert a cap - Insertar un tapon + + Redraw + Redibujar - - - insertCapForm - - Insert caps - Insertar tapones + + offset head + Desfasar cabezera - - Reverse - Invertir + + RemoveBeams + Eliminar vigas - - Apply - Aplicar + + Get targets + Obtener objetivos - - - insertElbow - - Insert a curve - Insertar una curva + + <length> + <longitud> - - - insertElbowForm - - Insert elbows - Insertar codos + + hotkeys: "S" to select, "X" to trim + teclas rapidas: "S" para seleccionar, "X" para ejecutar - - <bend angle> - <angulo de dobles> + + Slice Intersections + Cortar ingletes - - <bend radius> - <radio de dobles> + + Add single + Agregar viga sencilla + + + DialogFillFrame - - Trim/Extend - Cortar/Extender + + Fill frame + Llenar marco - - Reverse - Invertir + + move + mover - - Apply - Aplicar + + (S)elect + (S)eleccionar - - 0 deg - 0 grados + + < select a beam > + < selecciona una viga > - - Wrong selection - - Seleccion equivocada - + + copy + copiar - - deg - grados + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar - insertFlange + DialogHackedLine - - Insert a flange - Insertar una brida + + Dialog + Dialogo - - - insertFlangeForm - - Insert flanges - Insertar bridas + + (M)ove origin on click + (M)over origen en clic - - Reverse - Invertir + + (R)otate WP + (R)otar plano de trabajo - - Apply - Aplicar + + (O)ffset WP + (O)Desface de plano de trabajo + + + + + + Align WP to principal plane + Alinear plano de trabajo al plano principal - insertPath + DialogJoinPypes - - insert Path - Insertar trayectoria + + Join pypes + Unir tubos - - Creates one path along selected edges - Crea una trayectoria a lo largo de la arista seleccionada + + Reset + Reiniciar - - - insertPipe - - Insert a tube - Insertar un tubo + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar - insertPipeForm + DialogProtoPipeForm - - Insert pipes - Insertar tuberia + + Dialog + Dialogo - - <length> - <Longitud> + + Rating: + Grado: - - Reverse - Invertir + + Insert + Insertar + + + DialogQM - - Apply - Aplicar + + Quick Insert + Insercion rapida - insertPypeLine + DialogRotAround - - PypeLine Manager - Gestor de tuberia de linea + + Rotate around axis + Rotar alrededor del eje - - Open PypeLine Manager - Abre gestor de tuberia de linea + + Reverse + Invertir - - - insertPypeLineForm - - PypeLine Manager - Gestor de linea de tubo + + <select one axis> + <selecciona un eje> - - <name> - <nombre> + + copy items + copiar elementos - - Redraw - Redibujar + + hotkeys: "S" to select, "X" to execute + teclas rapidas: "S" para seleccionar, "X" para ejecutar - - Part list - Lista de parte + + (S)et axis + (S)Asignar eje + + + DialogRoute - - Color - Color + + Create pipe route + Crear trayectoria de tuberia - - Get Path - Obtener trayectoria + + Y + - - Get Profile - Obtener perfil + + X + - - <new> - <nuevo> + + Z + - - - insertReduct - - Insert a reduction - Insertar una reducción + + global Z + Z global - - - insertReductForm - - Insert reductions - Insertar reducciones + + Normal to sketch: + Normal al croquis: - - Reverse - Invertir + + Offset (mm): + Desfasar (mm): - - Apply - Aplicar + + 0 + - - Eccentric - Excentrico - - - - insertRoute - - - Insert a pipe route - Insertar una ruta de tuberia - - - - Create a sketch attached to a circular edge - Crea un boceto adjunta a una aristar circular - - - - insertRouteForm - - + <select an edge> <seleccionar un borde> - - - insertSection - - - Insert sections - Inserta secciones - - - - Creates customized beam profiles 2D - Crea un perfil de viga 2D personalizado - - - - insertTank - - - Insert a tank - Inserta un deposito - - - - Create tank and nozzles - Crea un deposito y boquillas - - - - insertTankForm - - - doing combine - Haciendo combinado - - - - files read - leer archivos - - - files not read - no leer archivos + + Get edge + Obtener borde - - listNozzles: %s - Lista de boquillas: %s + + (S)et normal + (S)Asignar normal - - - insertUbolt - - Insert a U-bolt - Insertar un tornillo U + + hotkeys: +"S" to select normal from geometry +"X" to execute + teclas rapidas: "S" para seleccionar la normal de la geometria + "X" para ejecutar - insertUboltForm - - - Insert U-bolt - Insertar tornillo U - - - - - no ref. face - - Sin cara de referencia - + DialogSection - - Ref. face - Cara de referencia + + Beams profile editor + Editor de perfiles de vigas - - Head - Cabecera + + <name> + <nombre> - - Middle - Medio + + NW + Nor Oeste - - Tail - Cola + + N + Norte - - - insertValve - - Insert a valve - Insertar una valvula + + NE + Nor Este - - - insertValveForm - - Insert valves - Insertar valvulas + + W + Oeste - - Reverse - Invertir + + C + Centro - - Apply - Aplicar + + E + Este - - Insert in pipe - Insertar en tubo + + SW + Sur Oeste - - - joinPype - - Join pypes - Unir tuberias + + S + Sur - - Select the part-pype and the port - Selecciona la pieza de tuberia y el puerto + + SE + Sur Este - - - laydown - - Lay-down the pipe - Empotra la tuberia + + + + + + + + + ... + ... - - Lay-down the pipe on the support plane - Empotra la tuberia sobre el plano de soporte + + Full section + Seccion completa - - - levelBeam - - Flush the surfaces - Empotrar las superficies + + Apply +dimensions + Aplicar dimensiones - - Shift the beams to line-up the faces to the first selection (faces must be //) - Desplaza la viga para alinearla a la cara de la primera seleccion (caras deben ser paralelas) + + Shift +profile + Rotar Perfil - makeHeader - - - Connect to header - Conectar a la cabezera - - - - Connect branches to one header pipe Branches and header's axes must be ortho - Conectar rama a una de las cabezeras de tubo; Ejes de ramificaciones y cabezeras deben ser ortogonales - + DialogShapes - - Connect branches to one header pipe -Branches and header's axes must be ortho - Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + + Import shapes + Importar formas - - Connect branches to one header pipe - Branches and header's axes must be ortho - Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + + <shapes> + <formas> - mateEdges + DialogTank - - Mate pipes edges - Coincidir las aristas de las tuberias + + Dialog + Dialogo - - Mate two terminations through their edges - Coincidir dos terminaciones a traves de sus aristas + + Tank + Deposito - - - moveHandle - - Move objects - Mover objetos + + Length + Longitud - - Move quickly objects inside viewport - Mover objetos rapidamente dentro de la vista + + X + - - - moveWorkPlane - - align Workplane - Alinear plano de trabajo + + Width: + Ancho: - - Moves and rotates the drafting workplane with points, edges and faces - Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras - - - - offsetWorkPlane - - - Offset Work Plane - Desplazar plano de trabajo - - - - Offset: - Desplazamiento: - - - - offset Workplane - Desfazar plano de trabajo - - - - Shifts the WP alongg its normal. - Desplaza el plano de trabajo a lo largo de su normal. - - - - pForms - - - Offset Work Plane - Desface de plano de trabajo - - - - Offset: - Desface: - - - - pipeQM - - - QM for pipes - QM para tuberias - - - - pivotBeam - - - pivotTheBeam - Pivotea la viga - - - - Rotates the beam around an axis (edge or center-of-curvature) - Rota la viga alrededor de un eje (arista o centro de curvatura) - - - - point2point - - - draw a tube point-to-point - Dibuja un tubo de punto a punto - - - - Click on subsequent points. - Da clic en puntos subsecuentes. - - - - point2pointPipe - - - Reset - Reiniciar - - - - Move WP on click - Mover plano de trabajo al click - - - - profEdit - - - Square - Profile name in the Tree View - Rectangular - - - - T-profile - Profile name in the Tree View - Perfil T - - - - U-profile - Profile name in the Tree View - Perfil U - - - - H-profile - Profile name in the Tree View - Perfil H - - - - L-profile - Profile name in the Tree View - Perfil L - - - - Z-profile - Profile name in the Tree View - Perfil Z - - - - Omega-profile - Profile name in the Tree View - Perfil Omega - - - - Circle-profile - Profile name in the Tree View - Perfil circular - - - - Insert profile - Transaction, used on undo/redo lists - Insertar perfil - - - - Modify profile - Transaction, used on undo/redo lists - Modificar perfil - - - - Shift profile - Transaction, used on undo/redo lists - Gira perfil - - - - protoPypeForm - - - - Rating: - Grado: - - - - Insert - Insertar - - - - protoTypeDialog - - - "%s" to select; "%s" to execute - "%s" para seleccionar; "%s" para ejecutar - - - - No view available. - Vista no disponible. - - - - Actions "%s" and "%s" removed - Acciones "%s" y "%s" eliminado - - - - queryModel - - - query the model - Consultar el modelo - - - - Click objects to print infos - Cliquear objetos para imprimir información - - - - raiseup - - - Raise-up the support - Eleva el soporte - - - - Raise the support to the pipe - Eleva el soporte hacia la tuberia - - - - reverseBeam - - - Reverse orientation - Invertir orientacion - - - - Reverse the orientation of selected objects - Invertir orientacion a los objetos seleccionados - - - - rotJoin - - - rotJoinEdge - Rotar arista de union - - - - Rotates and align the beam according another edge - Rota y alinea la viga acorde a otra arista - - - - rotWPForm - - - Angle: - Angulo: - - - - Rotate working plane - Rotar plano de trabajo - - - - rotateWorkPlane - - - rotate Workplane - Rotar plano de trabajo - - - - Spin the Draft working plane about one of its axes - Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes - - - - selectSolids - - - Select solids - Seleccionar solidos - - - - Grab all solids or those partially selected - to export in .step format - Sujeta todos los solidos parcialmente seleccionados -para exportar en formato step - - - - shiftBeam - - - shiftTheBeam - Desplaza la viga - - - - Translate objects by vectors defined on existing geometry - Traslada el objeto por vectores definidos sobre la geometria existente - - - - spinSect - - - Spin beams by 45 deg. - Gira viga a 45 grados. - - - - Rotates the section of the beam by 45 degrees - Rota la seccion de la viga a 45 grados - - - - stretchBeam - - - stretchTheBeam - Estira la viga - - - - Changes the length of the beam, either according a preselected edge or a direct input - Cambia la longituf de la viga, ya sea acorde a la arista preseleccionada o una entrada directa - - - - uCmd - - - Quick move - Transaction - Movimiento rapido - - - - Offset Work Plane - Desfasar plano de trabajo - - - - Offset: - Desface: - - - - uForms - - - QueryTool - Herramienta de consulta - - - - (Select a object) - (Seleccionar un objeto) - - - - (base) - (base) - - - - Base: - Base: - - - - (angle) - (angulo) - - - - Rotation angle: - Angulo de rotacion: - - - - v = (x,y,z) - v = (x,y,z) - - - - Rotation axis: - Eje de rotacion: - - - - (Sub object property) - (Propiedad de sub objeto) + + Y + - - (Beam property) - (Propiedad de viga) + + Height: + Alto: - - (Profile property) - (Propiedad de perfil) + + Z + - - QueryObject - Consulta de objeto + + Nozzles + Boquillas - - Exit - Salir + + Pipe type: + Tipo de tubo: - - Angle: - Angulo: + + + <select> + <seleccionar> - - Rotate WP - Rotar plano de trabajo + + Flange type: + Tipo de brida: - - - valveQM - - QM for valves - QM para valvulas + + Add nozzle + Agregar boquilla - Dialog - - - Dp calculator - Calculadora de Dp - + DialogValves - - calculation - calculos + + Insert valves + Insertar valvulas - - Nr. of curves = 0 - Numero de curvas = 0 + + Apply + Aplicar - - Roughness (um) - Rugozidad (um) + + Reverse + Invertir - - Flow-rate (m3/h) - Ritmo de flujo (m3/h) + + Type: + Tipo: + + + FrameBranchManager - - Total length = 0 - Longitud total = 0 + + FrameBranch Manager + Derivacion de gestor de marcos - - Scope - Alcance + + Open FrameBranch Manager + Abre gestor de marcos + + + Part::Feature - - <on selection> - <en seleccion> + CurvaSemplice + Curva simple - - Pipe material - Material de tubo + + Simple curve + Curva simple - - fluid properties - Propiedades del fluido + Tube + Tubo + + + Part::FeaturePython - - Density (kg/m3) - Densidad (kg/m3) + + Tube + Tubo - - liquid - liquido + + Elbow + Codo - - T (°C) - + + Flange + Brida - - Viscosity (cP) - Viscosidad (cP) + + Reduction + Reduccion - - gas/vapour - gas/vapor + + U-Bolt + Tornillo U - - Name - Nombre + + Tank + Deposito - - P abs. (bar) - Presion absoluta (bar) + + Cap + Tapon - - results - resultados + + Valve + Valvula + + + Sketcher::SketchObject - - Export - Exportar + + pipeRoute + Rutatuberia + + + adjustFrameAngle - - *** LIQUID *** - *** LIQUIDO *** + + adjustFrameAngle + Adjuste de angulo de marcos - - --- - + + Adjust the angle of frame by two edges + Ajusta del angulo del marco por medio de dos aristas + + + alignEdge - - - Dialog - Dialogo + + Mate the edges + Coindicir las aristas - - (M)ove origin on click - (M)over origen sobre clic + + Join two edges: select two or pre-select several + Une dos aristas:selecciona dos o pre selecciona varias + + + alignFlange - - (R)otate WP - (R)otar plano de trabajo + + alignFlange + Alinear superficies - - (O)ffset WP - (O)Desfasar plano de trabajo + + Rotates the section of the beam to make the faces parallel to another face + Rota la seccion de la viga para hacer las caras paralelas a otra cara + + + attach2tube - - - - Align WP to principal plane - Alinear plano de trabajo al plano principal + + Attach to tube + Ligado al tubo - - Rotate around axis - Rotar alrededor del eje + + Attach one pype to the nearest port of selected pipe + Liga un tipo de tuberia al puerto mas cercano de la tuberia seleccionada + + + breakForm - - Reverse - Invertir + + Break the pipes + Romper las tuberias - - <select one axis> - <Seleccionar un eje> + + Length + Longituf - - copy items - copiar elementos + + <reference> + <referencia> - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + PypeLine: + Linea de tubo: - - (S)et axis - (S)Asignar eje + + <none> + <ninguno> + + + breakPipe - - Beams profile editor - Editor de perfiles de vigas + + Break the pipe + Rompe la tuberia - - t1 - + + Break one pipe at point and insert gap + Dividir un tubo al punto e insertar un espacio + + + capQM - - t2 - + + QM for caps + QM para tapones + + + cutListCommand - - t3 - + + createCutList + Crear lista de corte - - <name> - <nombre> + + Create a new Cut List from Dodo Beams + Crear una lista nueva de corte desde vigas dodo + + + dodo - - NW - + + + Utils + Utilerias - - N - + + frametools + Herramientas estructurales - - NE - + + pypetools + Herramientas de tuberia - - W - + + Frame tools + Herramientas para estructuras - - C - + + Pype tools + Herramientas para tuberias - - E - + + QkMenus + Menus QK + + + dpCalc - - SW - + + Pressure loss calculator + Calculadora de Perdida de presion - - S - + + Calculate pressure loss in "pypes" using ChEDL libraries. + See __doc__ of the module for futher information. + Calcular perdida de presión en tuberias utilizando biblioteca ChEDL. + Revisar __doc__ del modulo para mayor información. + + + dpCalcDialog - - SE - + + + *** CUSTOM FLUID *** + *** FLUIDO PERSONALIZADO *** - - - - - - - - - ... - + + <custom fluid> + <Fluido personalizado> - - Full section - Seccion completa + + + No data found + Datos no encontrados - - Apply -dimensions - Aplicar -dimensiones + + It seems the fluid has not a liquid state. + Parece que el fluido no tiene un estado liquido. - - Shift -profile - Desfasar perfil + + *** LIQUID *** + *** LIQUIDO *** - - Import shapes - Importar formas + + Flow (m3/h) + Flujo (m3/h) - - <shapes> - <formas> + + It seems the fluid has not a gas state. + Parece que el fluido no tiene un estado gaseoso. - - Tank - Deposito + + *** GAS/VAPOUR *** + *** GAS/VAPOR *** - - Length - Longitud + + Flow (kg/h) + Flujo (kg/h) + + + elbowQM - - X - + + QM for elbows + QM para codos + + + extend - - Width: - Ancho: + + extendTheBeam + Extender la viga - - Y - + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado + + + extend1intersection - - Height: - Alto: + + + Extends pipe to intersection + Extender tubo a la interseccion + + + extend2intersection - - Z - + + + Extends pipes to intersection + Extender tubos a la interseccion + + + fObservers - - Nozzles - Boquillas + + Select one beam and one edge + Seleccionar una viga y un borde - - Pipe type: - Tipo de tubo: + + First select the base beam, then the edges + Primero seleccionar la base, luego los bordes - - - <select> - <seleccionar> + + First select the target plane, then the faces to align + Primero seleccionar el plano objetivo, luego las caras a alinear - - Flange type: - Tipo de brida: + + levelTheBeam + Transaction + Nivelar la viga - - Add nozzle - Agregar boquilla + + Select the target face, then the others + Seleccionar la cara objetivo, luego las otras - - - DialogAlign - - Align flanges - Alinear bridas + + alignFlange + Transaction + Alinear brida - - normY - Normal a Y + + Select two edges to join. + Seleccionar dos bordes para unir. - - YZ - YZ + + joinTheBeamsEdges + Transaction + Unir los bordes de las vigas - - (S)elect face - (S)elecciona cara + + Select the beam and input the length + Selecciona la viga y la entrada de la longitud - - XZ - XZ + + First Select the target shape, then the beams to extend. + Primero selecciona la forma objetivo, luego la viga a extender. - - hotkeys: "S" to select, "X" to execute - Teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Select 2 edges + Seleccionar 2 bordes - - XY - XY + + Adjust angle + Transaction + Ajustar angulo - - < select a target face > - < selecciona una cara como objetivo > + + Select 2 edges =>[Ctrl]+select + Seleccionar 2 bordes =>[Ctrl]+seleccionar - - Set normal - Asignar normal + + rotJoin + Transaction + Rotar union + + + flangeQM - - normX - Normal a X + + QM for flanges + QM para bridas + + + flat - - normZ - Normal a Z + + Fit one elbow + Colocar un codo - - Invert normal - Invertir normal + + Place the elbow between two pipes or beams + Colocar un codo entre 2 tuberias o vigas - DialogBeamShift + frameIt - - Move - Mover + + Place one-beam over one-edge + Coloca una viga sobre una arista - - Multiple: - Multiplicar: + + Place one beam after the other over the edges + Coloca una viga despues de las otras aristas + + + hackedL - - - 1 - 1 + + draw a DWire + Dibuja un Dwire - - - - 0 - 0 + + WP is re-positioned at each point. Possible to spin and offset it. + Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. + + + insertAnyz - - Set dist. - Asignar distancia. + + Insert any shape + Insertar cualquier forma - - Z: - Z: + + Insert a STEP, IGES or BREP + Insertar un solido STEP, IGES, BREP + + + insertBranch - - Steps: - Pasos: + + Insert a branch + Insertar una derivación - - Y: - Y: + + Insert a PypeBranch + Insertar una derivacion de tuberia + + + insertBranchForm - - copy - copiar + + Insert a branch + Insertar una ramificacion - - X: - X: + + <name> + <nombre> - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + <bend radius> + <radio de dobles> - DialogBeamStretch + insertCap - - Stretch - Estirar + + + Insert a cap + Insertar un tapon + + + insertCapForm - - (S)et length - (S)Asignar longitud + + Insert caps + Insertar tapones - - both - ambos + + Reverse + Invertir - - head - cabecera + + Apply + Aplicar + + + insertElbow - - tail - cola + + + Insert a curve + Insertar una curva + + + insertElbowForm - - New length - mm: - Nueva longitud - mm: + + Insert elbows + Insertar codos - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + <bend angle> + <angulo de dobles> - - Stretched end: - Estirado final: + + <bend radius> + <radio de dobles> - - - DialogDisp - - Dialog - Dialogo + + Trim/Extend + Cortar/Extender - - Angle: - Angulo: + + Reverse + Invertir - - SET - Asignar + + Apply + Aplicar - - * Click on arrow to move - * Ctrl+Click to go back - * Ctrl+Alt+Click to rotate - * Cliquear en flecha para mover - * Control+clic para regresar - * Control+alt+clic para rotar + + 0 deg + 0 grados - - Displacement: - Desplazamiento: + + Wrong selection + + Seleccion equivocada + - - 100 - + + deg + grados + + + insertFlange - - 90 - + + + Insert a flange + Insertar una brida - DialogExtend + insertFlangeForm - - Extend beams - Extender viga + + Insert flanges + Insertar bridas - - < select a target > - <seleccionar un objetivo> + + Reverse + Invertir - - (S)elect target - (S)elecciona un objetivo + + Apply + Aplicar + + + insertPath - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + insert Path + Insertar trayectoria + + + + Creates one path along selected edges + Crea una trayectoria a lo largo de la arista seleccionada - DialogFBranch + insertPipe - - FrameBranch Manager - Gestor de marcos ramificados + + + Insert a tube + Insertar un tubo + + + insertPipeForm - - <no target selected> - <ningun objetivo seleccionado> + + Insert pipes + Insertar tuberia - - <degrees> - <grados> + + <length> + <Longitud> - - offset tail - Desfasar cola + + Reverse + Invertir - - Trim/Extend - Cortar/Extender + + Apply + Aplicar + + + insertPypeLine - - AddBeams - Agregar vigas + + PypeLine Manager + Gestor de tuberia de linea - - Add single beam - Agregar viga simple + + Open PypeLine Manager + Abre gestor de tuberia de linea + + + insertPypeLineForm - - ChangeProfile - Cambiar perfil + + PypeLine Manager + Gestor de linea de tubo - + <name> <nombre> - - <no item selected> - <ningun elemento seleccionado> - - - + Redraw Redibujar - - offset head - Desfasar cabezera + + Part list + Lista de parte - - RemoveBeams - Eliminar vigas + + Color + Color - - Get targets - Obtener objetivos + + Get Path + Obtener trayectoria - - <length> - <longitud> + + Get Profile + Obtener perfil - - hotkeys: "S" to select, "X" to trim - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + <new> + <nuevo> - DialogFillFrame - - - Fill frame - Llenar marco - + insertReduct - - move - mover + + + Insert a reduction + Insertar una reducción + + + insertReductForm - - (S)elect - (S)eleccionar + + Insert reductions + Insertar reducciones - - < select a beam > - < selecciona una viga > + + Reverse + Invertir - - copy - copiar + + Apply + Aplicar - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Eccentric + Excentrico - DialogJoinPypes + insertRoute - - Join pypes - Unir tubos + + Insert a pipe route + Insertar una ruta de tuberia - - Reset - Reiniciar + + Create a sketch attached to a circular edge + Crea un boceto adjunta a una aristar circular + + + insertRouteForm - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + <select an edge> + <seleccionar un borde> - DialogProtoPipeForm + insertSection - - Dialog - Dialogo + + Insert sections + Inserta secciones - - Rating: - Grado: + + Creates customized beam profiles 2D + Crea un perfil de viga 2D personalizado + + + + insertTank + + + Insert a tank + Inserta un deposito - - Insert - Insertar + + Create tank and nozzles + Crea un deposito y boquillas - DialogRoute + insertTankForm - - Create pipe route - Crear trayectoria de tuberia + + doing combine + Haciendo combinado - - Y - + + files read + leer archivos - - X - + + files not read + no leer archivos - - Z - + + listNozzles: %s + Lista de boquillas: %s + + + insertUbolt - - global Z - Z global + + + Insert a U-bolt + Insertar un tornillo U + + + insertUboltForm - - Normal to sketch: - Normal al croquis: + + Insert U-bolt + Insertar tornillo U - - Offset (mm): - Desfasar (mm): + + - no ref. face - + Sin cara de referencia - - 0 - + + Ref. face + Cara de referencia - - <select an edge> - <seleccionar un borde> + + Head + Cabecera - - Get edge - Obtener borde + + Middle + Medio - - (S)et normal - (S)Asignar normal + + Tail + Cola + + + insertValve - - hotkeys: -"S" to select normal from geometry -"X" to execute - teclas rapidas: "S" para seleccionar la normal de la geometria - "X" para ejecutar + + + Insert a valve + Insertar una valvula - DialogValves + insertValveForm - + Insert valves Insertar valvulas - - Apply - Aplicar - - - + Reverse Invertir - - Type: - Tipo: + + Apply + Aplicar + + + + Insert in pipe + Insertar en tubo - DialogDp + joinPype - - Dp calculator - Calculadora de Dp + + Join pypes + Unir tuberias - - calculation - calculo + + Select the part-pype and the port + Selecciona la pieza de tuberia y el puerto + + + laydown - - Nr. of curves = 0 - Numero de curvas = 0 + + Lay-down the pipe + Empotra la tuberia - - Roughness (um) - Rugozidad (um) + + Lay-down the pipe on the support plane + Empotra la tuberia sobre el plano de soporte + + + levelBeam - - 100 - + + Flush the surfaces + Empotrar las superficies - - - 20 - + + Shift the beams to line-up the faces to the first selection (faces must be //) + Desplaza la viga para alinearla a la cara de la primera seleccion (caras deben ser paralelas) + + + makeHeader - - Flow-rate (m3/h) - Ritmo de flujo (m3/h) + + Connect to header + Conectar a la cabezera - - Total length = 0 - Longitud total = 0 + Connect branches to one header pipe Branches and header's axes must be ortho + Conectar rama a una de las cabezeras de tubo; Ejes de ramificaciones y cabezeras deben ser ortogonales - - Scope - Alcance + + Connect branches to one header pipe +Branches and header's axes must be ortho + Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales - - <on selection> - <en seleccion> + Connect branches to one header pipe + Branches and header's axes must be ortho + Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + + + makeframenbranch - - Pipe material - Material de tubo + + Travatura + Estructura + + + mateEdges - - fluid properties - Propiedades del fluido + + Mate pipes edges + Coincidir las aristas de las tuberias - - Density (kg/m3) - Densidad (kg/m3) + + Mate two terminations through their edges + Coincidir dos terminaciones a traves de sus aristas + + + mouseActionB1 - - liquid - liquido + + ____TAIL + ____COLA + + + moveHandle - - T (°C) - T (°C) + + Move objects + Mover objetos - - Viscosity (cP) - Viscosidad (cP) + + Move quickly objects inside viewport + Mover objetos rapidamente dentro de la vista + + + moveWorkPlane - - - 0 - + + align Workplane + Alinear plano de trabajo - - gas/vapour - gas/vapor + + Moves and rotates the drafting workplane with points, edges and faces + Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras + + + offsetWorkPlane - - 1 - + + Offset Work Plane + Desplazar plano de trabajo - - Name - Nombre + + Offset: + Desplazamiento: - - P abs. (bar) - Presion absoluta. (bar) + + offset Workplane + Desfazar plano de trabajo - - results - resultados + + Shifts the WP alongg its normal. + Desplaza el plano de trabajo a lo largo de su normal. + + + pForms - - Export - Exportar + + Offset Work Plane + Desface de plano de trabajo - - *** LIQUID *** - *** LIQUIDO *** + + Offset: + Desface: + + + pipeQM - - --- - + + QM for pipes + QM para tuberias - DialogHackedLine + pivotBeam - - Dialog - Dialogo + + pivotTheBeam + Pivotea la viga - - (M)ove origin on click - (M)over origen en clic + + Rotates the beam around an axis (edge or center-of-curvature) + Rota la viga alrededor de un eje (arista o centro de curvatura) + + + point2point - - (R)otate WP - (R)otar plano de trabajo + + draw a tube point-to-point + Dibuja un tubo de punto a punto - - (O)ffset WP - (O)Desface de plano de trabajo + + Click on subsequent points. + Da clic en puntos subsecuentes. + + + point2pointPipe - - - - Align WP to principal plane - Alinear plano de trabajo al plano principal + + Reset + Reiniciar - - XY - + + Move WP on click + Mover plano de trabajo al click + + + profEdit - - XZ - + + Square + Profile name in the Tree View + Rectangular - - YZ - + + T-profile + Profile name in the Tree View + Perfil T - - - DialogRotAround - - Rotate around axis - Rotar alrededor del eje + + U-profile + Profile name in the Tree View + Perfil U - - Z - + + H-profile + Profile name in the Tree View + Perfil H - - 90 - + + L-profile + Profile name in the Tree View + Perfil L - - Y - + + Z-profile + Profile name in the Tree View + Perfil Z - - Reverse - Invertir + + Omega-profile + Profile name in the Tree View + Perfil Omega - - X - + + Circle-profile + Profile name in the Tree View + Perfil circular - - <select one axis> - <selecciona un eje> + + Insert profile + Transaction, used on undo/redo lists + Insertar perfil - - copy items - copiar elementos + + Modify profile + Transaction, used on undo/redo lists + Modificar perfil - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Shift profile + Transaction, used on undo/redo lists + Gira perfil + + + protoPypeForm - - (S)et axis - (S)Asignar eje + + + Rating: + Grado: + + + + Insert + Insertar - DialogSections + protoTypeDialog - - Beams profile editor - Editor de perfiles de vigas + + "%s" to select; "%s" to execute + "%s" para seleccionar; "%s" para ejecutar - - - 45 - + + No view available. + Vista no disponible. - - D - + + Actions "%s" and "%s" removed + Acciones "%s" y "%s" eliminado + + + queryModel - - 80 - + + query the model + Consultar el modelo - - H - + + Click objects to print infos + Cliquear objetos para imprimir información + + + raiseup - - B - + + Raise-up the support + Eleva el soporte - - t1 - + + Raise the support to the pipe + Eleva el soporte hacia la tuberia + + + reverseBeam - - - - 5 - + + Reverse orientation + Invertir orientacion - - t2 - + + Reverse the orientation of selected objects + Invertir orientacion a los objetos seleccionados + + + rotJoin - - t3 - + + rotJoinEdge + Rotar arista de union - - <name> - <nombre> + + Rotates and align the beam according another edge + Rota y alinea la viga acorde a otra arista + + + rotWPForm - - NW - Nor Oeste + + Angle: + Angulo: - - N - Norte + + Rotate working plane + Rotar plano de trabajo + + + rotateWorkPlane - - NE - Nor Este + + rotate Workplane + Rotar plano de trabajo - - W - Oeste + + Spin the Draft working plane about one of its axes + Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes + + + selectSolids - - C - Centro + + Select solids + Seleccionar solidos - - E - Este + + Grab all solids or those partially selected + to export in .step format + Sujeta todos los solidos parcialmente seleccionados +para exportar en formato step + + + shiftBeam - - SW - Sur Oeste + + shiftTheBeam + Desplaza la viga - - S - Sur + + Translate objects by vectors defined on existing geometry + Traslada el objeto por vectores definidos sobre la geometria existente + + + spinSect - - SE - Sur Este + + Spin beams by 45 deg. + Gira viga a 45 grados. - - - - - - - - - ... - + + Rotates the section of the beam by 45 degrees + Rota la seccion de la viga a 45 grados + + + stretchBeam - - Full section - Seccion completa + + stretchTheBeam + Estira la viga - - Apply -dimensions - Aplicar dimensiones + + Changes the length of the beam, either according a preselected edge or a direct input + Cambia la longituf de la viga, ya sea acorde a la arista preseleccionada o una entrada directa + + + uCmd - - Apply - dimensions - Aplicar - dimensiones + + Quick move + Transaction + Movimiento rapido - - Shift -profile - Desfazar perfil + + Offset Work Plane + Desfasar plano de trabajo - - Shift - profile - Orientar - perfil + + Offset: + Desface: - DialogShapes - - - Import shapes - Importar formas - + uForms - - <shapes> - <formas> + + QueryTool + Herramienta de consulta - - - - + + (Select a object) + (Seleccionar un objeto) - - - DialogTank - - Dialog - Dialogo + + (base) + (base) - - Tank - Deposito + + Base: + Base: - - Length - Longitud + + (angle) + (angulo) - - X - + + Rotation angle: + Angulo de rotacion: - - Width: - Ancho: + + v = (x,y,z) + v = (x,y,z) - - Y - + + Rotation axis: + Eje de rotacion: - - Height: - Alto: + + (Sub object property) + (Propiedad de sub objeto) - - Z - + + (Beam property) + (Propiedad de viga) - - Nozzles - Boquillas + + (Profile property) + (Propiedad de perfil) - - Pipe type: - Tipo de tubo: + + QueryObject + Consulta de objeto - - - <select> - <seleccionar> + + Exit + Salir - - Flange type: - Tipo de brida: + Angle: + Angulo: - - 200 - + + Rotate WP + Rotar plano de trabajo + + + valveQM - - Add nozzle - Agregar boquilla + + QM for valves + QM para valvulas
diff --git a/translationz/update_translation.sh b/translationz/update_translation.sh index ccca2f2..5873aec 100755 --- a/translationz/update_translation.sh +++ b/translationz/update_translation.sh @@ -47,48 +47,48 @@ # -------------------------------------------------------------------------------------------------- supported_locales=( - "en" "af" "ar" "eu" "be" "bg" "ca" "zh-CN" "zh-TW" "hr" - "cs" "da" "nl" "fil" "fi" "fr" "gl" "ka" "de" "el" - "hu" "id" "it" "ja" "kab" "ko" "lt" "no" "pl" "pt-PT" - "pt-BR" "ro" "ru" "sr" "sr-CS" "sk" "sl" "es-ES" "es-AR" "sv-SE" - "tr" "uk" "val-ES" "vi" + "en" "af" "ar" "eu" "be" "bg" "ca" "zh-CN" "zh-TW" "hr" + "cs" "da" "nl" "fil" "fi" "fr" "gl" "ka" "de" "el" + "hu" "id" "it" "ja" "kab" "ko" "lt" "no" "pl" "pt-PT" + "pt-BR" "ro" "ru" "sr" "sr-CS" "sk" "sl" "es-ES" "es-AR" "sv-SE" + "tr" "uk" "val-ES" "vi" ) is_locale_supported() { - local locale="$1" - for supported_locale in "${supported_locales[@]}"; do - [ "$supported_locale" == "$locale" ] && return 0 - done - return 1 + local locale="$1" + for supported_locale in "${supported_locales[@]}"; do + [ "$supported_locale" == "$locale" ] && return 0 + done + return 1 } update_locale() { - local locale="$1" - local u=${locale:+_} # Conditional underscore - FILES="../*.py ../dialogz/*.ui" + local locale="$1" + local u=${locale:+_} # Conditional underscore + FILES="../*.py ../cut_list/*.py ../dialogz/*.ui ../cut_list/resources/*.ui" - # NOTE: Execute the right command depending on: - # - if it's a locale file or the main, agnostic one - [ ! -f "${WB}${u}${locale}.ts" ] && action="Creating" || action="Updating" - echo -e "\033[1;34m\n\t<<< ${action} '${WB}${u}${locale}.ts' file >>>\n\033[m" - if [ "$u" == "" ]; then - eval $LUPDATE "$FILES" -ts "${WB}.ts" # locale-agnostic file - else - eval $LUPDATE "$FILES" -source-language en -target-language "${locale//-/_}" \ - -ts "${WB}_${locale}.ts" - fi + # NOTE: Execute the right command depending on: + # - if it's a locale file or the main, agnostic one + [ ! -f "${WB}${u}${locale}.ts" ] && action="Creating" || action="Updating" + echo -e "\033[1;34m\n\t<<< ${action} '${WB}${u}${locale}.ts' file >>>\n\033[m" + if [ "$u" == "" ]; then + eval $LUPDATE "$FILES" -ts "${WB}.ts" # locale-agnostic file + else + eval $LUPDATE "$FILES" -source-language en -target-language "${locale//-/_}" \ + -ts "${WB}_${locale}.ts" + fi } help() { - echo -e "\nDescription:" - echo -e "\tCreate, update and release translation files." - echo -e "\nUsage:" - echo -e "\t./update_translation.sh [-R] [-U] [-r ] [-u ]" - echo -e "\nFlags:" - echo -e " -R\n\tRelease all locales" - echo -e " -U\n\tUpdate main translation file (locale agnostic)" - echo -e " -r \n\tRelease the specified locale" - echo -e " -u \n\tUpdate strings for the specified locale" + echo -e "\nDescription:" + echo -e "\tCreate, update and release translation files." + echo -e "\nUsage:" + echo -e "\t./update_translation.sh [-R] [-U] [-r ] [-u ]" + echo -e "\nFlags:" + echo -e " -R\n\tRelease all locales" + echo -e " -U\n\tUpdate main translation file (locale agnostic)" + echo -e " -r \n\tRelease the specified locale" + echo -e " -u \n\tUpdate strings for the specified locale" } # Main function ------------------------------------------------------------------------------------ @@ -103,38 +103,38 @@ WB="dodo" sed -i '3s/-/_/' ${WB}*.ts if [ $# -eq 1 ]; then - if [ "$1" == "-R" ]; then - find . -type f -name '*_*.ts' | while IFS= read -r file; do - # Release all locales - $LRELEASE "$file" - echo - done - elif [ "$1" == "-U" ]; then - # Update main file (agnostic) - update_locale - else - help - fi + if [ "$1" == "-R" ]; then + find . -type f -name '*_*.ts' | while IFS= read -r file; do + # Release all locales + $LRELEASE "$file" + echo + done + elif [ "$1" == "-U" ]; then + # Update main file (agnostic) + update_locale + else + help + fi elif [ $# -eq 2 ]; then - LOCALE="$2" - if is_locale_supported "$LOCALE"; then - if [ "$1" == "-r" ]; then - # Release locale (creation of *.qm file from *.ts file) - $LRELEASE "${WB}_${LOCALE}.ts" - elif [ "$1" == "-u" ]; then - # Update main & locale files - update_locale - update_locale "$LOCALE" - fi - else - echo "Verify your language code. Case sensitive." - echo "If it's correct, ask a maintainer to add support for your language on FreeCAD." - echo -e "\nSupported locales, '\033[1;34mFreeCADGui.supportedLocales()\033[m': \033[1;33m" - for locale in $(printf "%s\n" "${supported_locales[@]}" | sort); do - echo -n "$locale " - done - echo - fi + LOCALE="$2" + if is_locale_supported "$LOCALE"; then + if [ "$1" == "-r" ]; then + # Release locale (creation of *.qm file from *.ts file) + $LRELEASE "${WB}_${LOCALE}.ts" + elif [ "$1" == "-u" ]; then + # Update main & locale files + update_locale + update_locale "$LOCALE" + fi + else + echo "Verify your language code. Case sensitive." + echo "If it's correct, ask a maintainer to add support for your language on FreeCAD." + echo -e "\nSupported locales, '\033[1;34mFreeCADGui.supportedLocales()\033[m': \033[1;33m" + for locale in $(printf "%s\n" "${supported_locales[@]}" | sort); do + echo -n "$locale " + done + echo + fi else - help + help fi From ee8d72a2e4913072d8200bbd29b806f0d6112edc Mon Sep 17 00:00:00 2001 From: hasecilu Date: Mon, 21 Oct 2024 23:50:10 -0600 Subject: [PATCH 050/135] Fix last name --- package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.xml b/package.xml index 28da26b..40a2c15 100644 --- a/package.xml +++ b/package.xml @@ -9,7 +9,7 @@ 2024-10-20 - Edgar J Rojas + Edgar J Robles LGPL-3.0-or-later From cd92b62fd5de89dd4d1910b20f5403701411ce96 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Tue, 22 Oct 2024 10:39:18 -0600 Subject: [PATCH 051/135] Rename commands to have WB prefix Needed to properly create Wiki articles for documentation and make translations work properly. - Fix contexts on commands' MenuText and ToolTip strings In order to have the translation working using the QT_TRANSLATE_NOOP() function on the commands the context must match the command name and not the name of the class that is executed. Example: $ sed -i 's/\"cutListCommand/\"Dodo_CreateCutList/g' cut_list/*.py --- CFrame.py | 96 ++++++------- CPipe.py | 144 ++++++++++--------- CUtils.py | 54 ++++---- InitGui.py | 252 +++++++++++++++++++++------------- cut_list/cut_list_commands.py | 30 ++-- dodoPM.py | 2 +- 6 files changed, 313 insertions(+), 265 deletions(-) diff --git a/CFrame.py b/CFrame.py index 2fcb172..d51bc40 100644 --- a/CFrame.py +++ b/CFrame.py @@ -42,8 +42,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamFit.svg"), - 'MenuText':QT_TRANSLATE_NOOP("frameIt",'Place one-beam over one-edge'), - 'ToolTip':QT_TRANSLATE_NOOP("frameIt",'Place one beam after the other over the edges')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_FrameIt",'Place one-beam over one-edge'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_FrameIt",'Place one beam after the other over the edges')} class spinSect: ''' @@ -61,8 +61,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamRot.svg"), - 'MenuText':QT_TRANSLATE_NOOP("spinSect",'Spin beams by 45 deg.'), - 'ToolTip':QT_TRANSLATE_NOOP("spinSect",'Rotates the section of the beam by 45 degrees')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_SpinSect",'Spin beams by 45 deg.'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_SpinSect",'Rotates the section of the beam by 45 degrees')} class reverseBeam: ''' @@ -81,8 +81,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","reverse.svg"), - 'MenuText':QT_TRANSLATE_NOOP("reverseBeam",'Reverse orientation'), - 'ToolTip':QT_TRANSLATE_NOOP("reverseBeam",'Reverse the orientation of selected objects')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_ReverseBeam",'Reverse orientation'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_ReverseBeam",'Reverse the orientation of selected objects')} # class fillFrame: # ''' @@ -113,8 +113,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","flangeAlign.svg"), - 'MenuText':QT_TRANSLATE_NOOP("alignFlange",'alignFlange'), - 'ToolTip':QT_TRANSLATE_NOOP("alignFlange",'Rotates the section of the beam to make the faces parallel to another face')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_AlignFlange",'alignFlange'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_AlignFlange",'Rotates the section of the beam to make the faces parallel to another face')} class shiftBeam: ''' @@ -141,8 +141,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamShift.svg"), - 'MenuText':QT_TRANSLATE_NOOP("shiftBeam",'shiftTheBeam'), - 'ToolTip':QT_TRANSLATE_NOOP("shiftBeam",'Translate objects by vectors defined on existing geometry')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_ShiftBeam",'shiftTheBeam'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_ShiftBeam",'Translate objects by vectors defined on existing geometry')} class levelBeam: ''' @@ -174,8 +174,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamLevel.svg"), - 'MenuText':QT_TRANSLATE_NOOP("levelBeam",'Flush the surfaces'), - 'ToolTip':QT_TRANSLATE_NOOP("levelBeam",'Shift the beams to line-up the faces to the first selection (faces must be //)')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_LevelBeam",'Flush the surfaces'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_LevelBeam",'Shift the beams to line-up the faces to the first selection (faces must be //)')} class alignEdge: ''' @@ -207,8 +207,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","edgeAlign.svg"), - 'MenuText':QT_TRANSLATE_NOOP("alignEdge",'Mate the edges'), - 'ToolTip':QT_TRANSLATE_NOOP("alignEdge",'Join two edges: select two or pre-select several')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_AlignEdge",'Mate the edges'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_AlignEdge",'Join two edges: select two or pre-select several')} class pivotBeam: ''' @@ -225,8 +225,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","around.svg"), - 'MenuText':QT_TRANSLATE_NOOP("pivotBeam",'pivotTheBeam'), - 'ToolTip':QT_TRANSLATE_NOOP("pivotBeam",'Rotates the beam around an axis (edge or center-of-curvature)')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_PivotBeam",'pivotTheBeam'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_PivotBeam",'Rotates the beam around an axis (edge or center-of-curvature)')} class stretchBeam: ''' @@ -247,8 +247,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamStretch.svg"), - 'MenuText':QT_TRANSLATE_NOOP("stretchBeam",'stretchTheBeam'), - 'ToolTip':QT_TRANSLATE_NOOP("stretchBeam",'Changes the length of the beam, either according a preselected edge or a direct input')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_StretchBeam",'stretchTheBeam'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_StretchBeam",'Changes the length of the beam, either according a preselected edge or a direct input')} class extend: ''' @@ -264,8 +264,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","extend.svg"), - 'MenuText':QT_TRANSLATE_NOOP("extend",'extendTheBeam'), - 'ToolTip':QT_TRANSLATE_NOOP("extend",'Extend the beam either to a face, a vertex or the c.o.m. of the selected object')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_Extend",'extendTheBeam'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_Extend",'Extend the beam either to a face, a vertex or the c.o.m. of the selected object')} class adjustFrameAngle: ''' @@ -279,8 +279,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","adjustAngle.svg"), - 'MenuText':QT_TRANSLATE_NOOP("adjustFrameAngle",'adjustFrameAngle'), - 'ToolTip':QT_TRANSLATE_NOOP("adjustFrameAngle",'Adjust the angle of frame by two edges')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_AdjustFrameAngle",'adjustFrameAngle'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_AdjustFrameAngle",'Adjust the angle of frame by two edges')} class rotJoin: ''' @@ -298,8 +298,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","rotjoin.svg"), - 'MenuText':QT_TRANSLATE_NOOP("rotJoin",'rotJoinEdge'), - 'ToolTip':QT_TRANSLATE_NOOP("rotJoin",'Rotates and align the beam according another edge')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_RotJoin",'rotJoinEdge'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_RotJoin",'Rotates and align the beam according another edge')} class insertPath: ''' @@ -316,8 +316,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","path.svg"), - 'MenuText':QT_TRANSLATE_NOOP("insertPath",'insert Path'), - 'ToolTip':QT_TRANSLATE_NOOP("insertPath",'Creates one path along selected edges')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_InsertPath",'insert Path'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_InsertPath",'Creates one path along selected edges')} # class FrameLineManager: # ''' @@ -372,8 +372,8 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","framebranch.svg"), - 'MenuText':QT_TRANSLATE_NOOP("FrameBranchManager",'FrameBranch Manager'), - 'ToolTip':QT_TRANSLATE_NOOP("FrameBranchManager",'Open FrameBranch Manager')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager",'FrameBranch Manager'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager",'Open FrameBranch Manager')} class insertSection: ''' @@ -386,26 +386,26 @@ def Activated(self): def GetResources(self): return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","sect.svg"), - 'MenuText':QT_TRANSLATE_NOOP("insertSection",'Insert sections'), - 'ToolTip':QT_TRANSLATE_NOOP("insertSection",'Creates customized beam profiles 2D')} + 'MenuText':QT_TRANSLATE_NOOP("Quetzal_InsertSection",'Insert sections'), + 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_InsertSection",'Creates customized beam profiles 2D')} #--------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager -#--------------------------------------------------------------------------- -addCommand('frameIt',frameIt()) -addCommand('spinSect',spinSect()) -addCommand('reverseBeam',reverseBeam()) -#addCommand('fillFrame',fillFrame()) -addCommand('alignFlange',alignFlange()) -addCommand('shiftBeam',shiftBeam()) -addCommand('levelBeam',levelBeam()) -addCommand('alignEdge',alignEdge()) -addCommand('pivotBeam',pivotBeam()) -addCommand('stretchBeam',stretchBeam()) -addCommand('extend',extend()) -addCommand('adjustFrameAngle',adjustFrameAngle()) -addCommand('rotJoin',rotJoin()) -addCommand('insertPath',insertPath()) -#addCommand('FrameLineManager',FrameLineManager()) -addCommand('insertSection',insertSection()) -addCommand('FrameBranchManager',FrameBranchManager()) +# --------------------------------------------------------------------------- +addCommand("Quetzal_FrameIt", frameIt()) +addCommand("Quetzal_SpinSect", spinSect()) +addCommand("Quetzal_ReverseBeam", reverseBeam()) +# addCommand('fillFrame',fillFrame()) +addCommand("Quetzal_AlignFlange", alignFlange()) +addCommand("Quetzal_ShiftBeam", shiftBeam()) +addCommand("Quetzal_LevelBeam", levelBeam()) +addCommand("Quetzal_AlignEdge", alignEdge()) +addCommand("Quetzal_PivotBeam", pivotBeam()) +addCommand("Quetzal_StretchBeam", stretchBeam()) +addCommand("Quetzal_Extend", extend()) +addCommand("Quetzal_AdjustFrameAngle", adjustFrameAngle()) +addCommand("Quetzal_RotJoin", rotJoin()) +addCommand("Quetzal_InsertPath", insertPath()) +# addCommand('FrameLineManager',FrameLineManager()) +addCommand("Quetzal_InsertSection", insertSection()) +addCommand("Quetzal_FrameBranchManager", FrameBranchManager()) diff --git a/CPipe.py b/CPipe.py index 95e51fd..e822ce7 100644 --- a/CPipe.py +++ b/CPipe.py @@ -57,8 +57,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "pipe.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertPipe", "Insert a tube"), - "ToolTip": QT_TRANSLATE_NOOP("insertPipe", "Insert a tube"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", "Insert a tube"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", "Insert a tube"), } @@ -73,8 +73,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "elbow.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertElbow", "Insert a curve"), - "ToolTip": QT_TRANSLATE_NOOP("insertElbow", "Insert a curve"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a curve"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a curve"), } @@ -89,8 +89,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "reduct.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertReduct", "Insert a reduction"), - "ToolTip": QT_TRANSLATE_NOOP("insertReduct", "Insert a reduction"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertReduct", "Insert a reduction"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertReduct", "Insert a reduction"), } @@ -105,8 +105,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "cap.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertCap", "Insert a cap"), - "ToolTip": QT_TRANSLATE_NOOP("insertCap", "Insert a cap"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertCap", "Insert a cap"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertCap", "Insert a cap"), } @@ -121,8 +121,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "flange.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertFlange", "Insert a flange"), - "ToolTip": QT_TRANSLATE_NOOP("insertFlange", "Insert a flange"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertFlange", "Insert a flange"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertFlange", "Insert a flange"), } @@ -137,8 +137,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "clamp.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertUbolt", "Insert a U-bolt"), - "ToolTip": QT_TRANSLATE_NOOP("insertUbolt", "Insert a U-bolt"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertUbolt", "Insert a U-bolt"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertUbolt", "Insert a U-bolt"), } @@ -153,8 +153,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "pypeline.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertPypeLine", "PypeLine Manager"), - "ToolTip": QT_TRANSLATE_NOOP("insertPypeLine", "Open PypeLine Manager"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPypeLine", "PypeLine Manager"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertPypeLine", "Open PypeLine Manager"), } @@ -170,8 +170,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "branch.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertBranch", "Insert a branch"), - "ToolTip": QT_TRANSLATE_NOOP("insertBranch", "Insert a PypeBranch"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertBranch", "Insert a branch"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertBranch", "Insert a PypeBranch"), } @@ -186,9 +186,9 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "break.svg" ), - "MenuText": QT_TRANSLATE_NOOP("breakPipe", "Break the pipe"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_BreakPipe", "Break the pipe"), "ToolTip": QT_TRANSLATE_NOOP( - "breakPipe", "Break one pipe at point and insert gap" + "Quetzal_BreakPipe", "Break one pipe at point and insert gap" ), } @@ -208,9 +208,9 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "mate.svg" ), "Accel": "M,E", - "MenuText": QT_TRANSLATE_NOOP("mateEdges", "Mate pipes edges"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_MateEdges", "Mate pipes edges"), "ToolTip": QT_TRANSLATE_NOOP( - "mateEdges", "Mate two terminations through their edges" + "Quetzal_MateEdges", "Mate two terminations through their edges" ), } @@ -226,10 +226,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "flat.svg" ), - "MenuText": QT_TRANSLATE_NOOP("flat", "Fit one elbow"), - "ToolTip": QT_TRANSLATE_NOOP( - "flat", "Place the elbow between two pipes or beams" - ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Flat", "Fit one elbow"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Flat", "Place the elbow between two pipes or beams"), } @@ -248,10 +246,10 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "intersect.svg" ), "MenuText": QT_TRANSLATE_NOOP( - "extend2intersection", "Extends pipes to intersection" + "Quetzal_Extend2intersection", "Extends pipes to intersection" ), "ToolTip": QT_TRANSLATE_NOOP( - "extend2intersection", "Extends pipes to intersection" + "Quetzal_Extend2intersection", "Extends pipes to intersection" ), } @@ -271,10 +269,10 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "intersect1.svg" ), "MenuText": QT_TRANSLATE_NOOP( - "extend1intersection", "Extends pipe to intersection" + "Quetzal_Extend1intersection", "Extends pipe to intersection" ), "ToolTip": QT_TRANSLATE_NOOP( - "extend1intersection", "Extends pipe to intersection" + "Quetzal_Extend1intersection", "Extends pipe to intersection" ), } @@ -297,10 +295,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "laydown.svg" ), - "MenuText": QT_TRANSLATE_NOOP("laydown", "Lay-down the pipe"), - "ToolTip": QT_TRANSLATE_NOOP( - "laydown", "Lay-down the pipe on the support plane" - ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Laydown", "Lay-down the pipe"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Laydown", "Lay-down the pipe on the support plane"), } @@ -328,8 +324,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "raiseup.svg" ), - "MenuText": QT_TRANSLATE_NOOP("raiseup", "Raise-up the support"), - "ToolTip": QT_TRANSLATE_NOOP("raiseup", "Raise the support to the pipe"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Raiseup", "Raise-up the support"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Raiseup", "Raise the support to the pipe"), } @@ -347,10 +343,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "join.svg" ), - "MenuText": QT_TRANSLATE_NOOP("joinPype", "Join pypes"), - "ToolTip": QT_TRANSLATE_NOOP( - "joinPype", "Select the part-pype and the port" - ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Join pypes"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Select the part-pype and the port"), } @@ -367,8 +361,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "valve.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertValve", "Insert a valve"), - "ToolTip": QT_TRANSLATE_NOOP("insertValve", "Insert a valve"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertValve", "Insert a valve"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertValve", "Insert a valve"), } @@ -386,9 +380,9 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "attach.svg" ), - "MenuText": QT_TRANSLATE_NOOP("attach2tube", "Attach to tube"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Attach2tube", "Attach to tube"), "ToolTip": QT_TRANSLATE_NOOP( - "attach2tube", "Attach one pype to the nearest port of selected pipe" + "Quetzal_Attach2tube", "Attach one pype to the nearest port of selected pipe" ), } @@ -404,8 +398,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "point2point.svg" ), - "MenuText": QT_TRANSLATE_NOOP("point2point", "draw a tube point-to-point"), - "ToolTip": QT_TRANSLATE_NOOP("point2point", "Click on subsequent points."), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Point2point", "draw a tube point-to-point"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Point2point", "Click on subsequent points."), } @@ -421,8 +415,8 @@ def Activated(self): def GetResources(self): return { - "MenuText": QT_TRANSLATE_NOOP("insertAnyz", "Insert any shape"), - "ToolTip": QT_TRANSLATE_NOOP("insertAnyz", "Insert a STEP, IGES or BREP"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertAnyz", "Insert any shape"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertAnyz", "Insert a STEP, IGES or BREP"), } @@ -437,8 +431,8 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "tank.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertTank", "Insert a tank"), - "ToolTip": QT_TRANSLATE_NOOP("insertTank", "Create tank and nozzles"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertTank", "Insert a tank"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertTank", "Create tank and nozzles"), } @@ -453,9 +447,9 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "route.svg" ), - "MenuText": QT_TRANSLATE_NOOP("insertRoute", "Insert a pipe route"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertRoute", "Insert a pipe route"), "ToolTip": QT_TRANSLATE_NOOP( - "insertRoute", "Create a sketch attached to a circular edge" + "Quetzal_InsertRoute", "Create a sketch attached to a circular edge" ), } @@ -474,9 +468,9 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "header.svg" ), - "MenuText": QT_TRANSLATE_NOOP("makeHeader", "Connect to header"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_MakeHeader", "Connect to header"), "ToolTip": QT_TRANSLATE_NOOP( - "makeHeader", + "Quetzal_MakeHeader", "Connect branches to one header pipe\nBranches and header's axes must be ortho", ), } @@ -485,29 +479,29 @@ def GetResources(self): # --------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager # --------------------------------------------------------------------------- -addCommand("insertPipe", insertPipe()) -addCommand("insertElbow", insertElbow()) -addCommand("insertReduct", insertReduct()) -addCommand("insertCap", insertCap()) -addCommand("insertValve", insertValve()) -addCommand("insertFlange", insertFlange()) -addCommand("insertUbolt", insertUbolt()) -addCommand("insertPypeLine", insertPypeLine()) -addCommand("insertBranch", insertBranch()) -addCommand("insertTank", insertTank()) -addCommand("insertRoute", insertRoute()) -addCommand("breakPipe", breakPipe()) -addCommand("mateEdges", mateEdges()) -addCommand("joinPype", joinPype()) -addCommand("attach2tube", attach2tube()) -addCommand("flat", flat()) -addCommand("extend2intersection", extend2intersection()) -addCommand("extend1intersection", extend1intersection()) -addCommand("laydown", laydown()) -addCommand("raiseup", raiseup()) -addCommand("point2point", point2point()) -addCommand("insertAnyz", insertAnyz()) -addCommand("makeHeader", makeHeader()) +addCommand("Quetzal_InsertPipe", insertPipe()) +addCommand("Quetzal_InsertElbow", insertElbow()) +addCommand("Quetzal_InsertReduct", insertReduct()) +addCommand("Quetzal_InsertCap", insertCap()) +addCommand("Quetzal_InsertValve", insertValve()) +addCommand("Quetzal_InsertFlange", insertFlange()) +addCommand("Quetzal_InsertUbolt", insertUbolt()) +addCommand("Quetzal_InsertPypeLine", insertPypeLine()) +addCommand("Quetzal_InsertBranch", insertBranch()) +addCommand("Quetzal_InsertTank", insertTank()) +addCommand("Quetzal_InsertRoute", insertRoute()) +addCommand("Quetzal_BreakPipe", breakPipe()) +addCommand("Quetzal_MateEdges", mateEdges()) +addCommand("Quetzal_JoinPype", joinPype()) +addCommand("Quetzal_Attach2tube", attach2tube()) +addCommand("Quetzal_Flat", flat()) +addCommand("Quetzal_Extend2intersection", extend2intersection()) +addCommand("Quetzal_Extend1intersection", extend1intersection()) +addCommand("Quetzal_Laydown", laydown()) +addCommand("Quetzal_Raiseup", raiseup()) +addCommand("Quetzal_Point2point", point2point()) +addCommand("Quetzal_InsertAnyz", insertAnyz()) +addCommand("Quetzal_MakeHeader", makeHeader()) ### QkMenus ### diff --git a/CUtils.py b/CUtils.py index c3d20bc..e6e7e27 100644 --- a/CUtils.py +++ b/CUtils.py @@ -40,8 +40,8 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "query.svg" ), "Accel": "Q,M", - "MenuText": QT_TRANSLATE_NOOP("queryModel", "query the model"), - "ToolTip": QT_TRANSLATE_NOOP("queryModel", "Click objects to print infos"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "query the model"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "Click objects to print infos"), } @@ -70,9 +70,9 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "grid.svg" ), "Accel": "A,W", - "MenuText": QT_TRANSLATE_NOOP("moveWorkPlane", "align Workplane"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveWorkPlane", "align Workplane"), "ToolTip": QT_TRANSLATE_NOOP( - "moveWorkPlane", + "Quetzal_MoveWorkPlane", "Moves and rotates the drafting workplane with points, edges and faces", ), } @@ -90,9 +90,9 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "rotWP.svg" ), "Accel": "R,W", - "MenuText": QT_TRANSLATE_NOOP("rotateWorkPlane", "rotate Workplane"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotateWorkPlane", "rotate Workplane"), "ToolTip": QT_TRANSLATE_NOOP( - "rotateWorkPlane", "Spin the Draft working plane about one of its axes" + "Quetzal_RotateWorkPlane", "Spin the Draft working plane about one of its axes" ), } @@ -114,8 +114,8 @@ def Activated(self): offset = qid.getInt( None, - translate("offsetWorkPlane", "Offset Work Plane"), - translate("offsetWorkPlane", "Offset: "), + translate("Quetzal_OffsetWorkPlane", "Offset Work Plane"), + translate("Quetzal_OffsetWorkPlane", "Offset: "), ) if offset[1] > 0: uCmd.offsetWP(offset[0]) @@ -128,9 +128,9 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "offsetWP.svg" ), "Accel": "O,W", - "MenuText": QT_TRANSLATE_NOOP("offsetWorkPlane", "offset Workplane"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_OffsetWorkPlane", "offset Workplane"), "ToolTip": QT_TRANSLATE_NOOP( - "offsetWorkPlane", "Shifts the WP alongg its normal." + "Quetzal_OffsetWorkPlane", "Shifts the WP alongg its normal." ), } @@ -147,9 +147,9 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "hackedL.svg" ), "Accel": "H,L", - "MenuText": QT_TRANSLATE_NOOP("hackedL", "draw a DWire"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_HackedL", "draw a DWire"), "ToolTip": QT_TRANSLATE_NOOP( - "hackedL", + "Quetzal_HackedL", "WP is re-positioned at each point. Possible to spin and offset it.", ), } @@ -168,10 +168,8 @@ def GetResources(self): os.path.dirname(os.path.abspath(__file__)), "iconz", "moveHandle.svg" ), "Accel": "M,H", - "MenuText": QT_TRANSLATE_NOOP("moveHandle", "Move objects"), - "ToolTip": QT_TRANSLATE_NOOP( - "moveHandle", "Move quickly objects inside viewport" - ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveHandle", "Move objects"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_MoveHandle", "Move quickly objects inside viewport"), } @@ -186,9 +184,9 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "delta.svg" ), - "MenuText": QT_TRANSLATE_NOOP("dpCalc", "Pressure loss calculator"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_DpCalc", "Pressure loss calculator"), "ToolTip": QT_TRANSLATE_NOOP( - "dpCalc", + "Quetzal_DpCalc", 'Calculate pressure loss in "pypes" using ChEDL libraries.\n See __doc__ of the module for futher information.', ), } @@ -209,9 +207,9 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "solids.svg" ), - "MenuText": QT_TRANSLATE_NOOP("selectSolids", "Select solids"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_SelectSolids", "Select solids"), "ToolTip": QT_TRANSLATE_NOOP( - "selectSolids", + "Quetzal_SelectSolids", "Grab all solids or those partially selected\n to export in .step format", ), } @@ -220,11 +218,11 @@ def GetResources(self): # --------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager # --------------------------------------------------------------------------- -addCommand("queryModel", queryModel()) -addCommand("moveWorkPlane", moveWorkPlane()) -addCommand("rotateWorkPlane", rotateWorkPlane()) -addCommand("offsetWorkPlane", offsetWorkPlane()) -addCommand("hackedL", hackedL()) -addCommand("moveHandle", moveHandle()) -addCommand("dpCalc", dpCalc()) -addCommand("selectSolids", selectSolids()) +addCommand("Quetzal_QueryModel", queryModel()) +addCommand("Quetzal_MoveWorkPlane", moveWorkPlane()) +addCommand("Quetzal_RotateWorkPlane", rotateWorkPlane()) +addCommand("Quetzal_OffsetWorkPlane", offsetWorkPlane()) +addCommand("Quetzal_HackedL", hackedL()) +addCommand("Quetzal_MoveHandle", moveHandle()) +addCommand("Quetzal_DpCalc", dpCalc()) +addCommand("Quetzal_SelectSolids", selectSolids()) diff --git a/InitGui.py b/InitGui.py index 4e664ba..f8dcc3d 100644 --- a/InitGui.py +++ b/InitGui.py @@ -1,41 +1,49 @@ -#**************************************************************************** -#* * -#* Dodo Workbench: * -#* substitute of flamingo for Py3 / Qt5 * -#* Copyright (c) 2019 Riccardo Treu LGPL * -#* * -#* This program is free software; you can redistribute it and/or modify * -#* it under the terms of the GNU Lesser General Public License (LGPL) * -#* as published by the Free Software Foundation; either version 2 of * -#* the License, or (at your option) any later version. * -#* for detail see the LICENCE text file. * -#* * -#* This program is distributed in the hope that it will be useful, * -#* but WITHOUT ANY WARRANTY; without even the implied warranty of * -#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -#* GNU Library General Public License for more details. * -#* * -#* You should have received a copy of the GNU Library General Public * -#* License along with this program; if not, write to the Free Software * -#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * -#* USA * -#* * -#**************************************************************************** +# **************************************************************************** +# * * +# * Dodo Workbench: * +# * substitute of flamingo for Py3 / Qt5 * +# * Copyright (c) 2019 Riccardo Treu LGPL * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# **************************************************************************** -class dodo ( Workbench ): - try: - import DraftSnap - except Exception: - import draftguitools.gui_snapper as DraftSnap - print('flag') # patch - if not hasattr(FreeCADGui, "Snapper"): - FreeCADGui.Snapper = DraftSnap.Snapper() - print('flag2') # patch +import FreeCAD +import FreeCADGui +from FreeCADGui import Workbench - import sys, FreeCAD - v=sys.version_info[0] - if v<3: FreeCAD.Console.PrintWarning('Dodo is written for Py3 and Qt5\n You may experience mis-behaviuors\n') - Icon = ''' + +class dodo(Workbench): + try: + import DraftSnap + except Exception: + import draftguitools.gui_snapper as DraftSnap + + print("flag") # patch + if not hasattr(FreeCADGui, "Snapper"): + FreeCADGui.Snapper = DraftSnap.Snapper() + print("flag2") # patch + + v = sys.version_info[0] + if v < 3: + FreeCAD.Console.PrintWarning( + "Dodo is written for Py3 and Qt5\n You may experience mis-behaviuors\n" + ) + Icon = """ /* XPM */ static char * dodo1_xpm[] = { "98 98 2 1", @@ -139,74 +147,120 @@ class dodo ( Workbench ): " ", " ", " "}; -''' - MenuText = "Dodo WB" - ToolTip = "Dodo workbench \n(substitute of flamingo for Py3/Qt5)" - def Initialize(self): - import pForms - import CUtils - import CFrame - from cut_list.cut_list_commands import cutListCommand - - Log ('Loading Frame tools: done\n') - import CPipe - self.pypeList=["insertPipe","insertElbow","insertReduct","insertCap","insertValve","insertFlange","insertUbolt","insertPypeLine","insertBranch","insertTank","insertRoute","breakPipe","mateEdges","flat","extend2intersection","extend1intersection","makeHeader","laydown","raiseup","attach2tube","point2point","insertAnyz"]#,"joinPype"] - from PySide.QtCore import QT_TRANSLATE_NOOP - from DraftGui import translate - from dodoPM import toolList - FreeCADGui.addLanguagePath(pForms.getLanguagePath()) - FreeCADGui.updateLocale() +""" + MenuText = "Dodo WB" + ToolTip = "Dodo workbench \n(substitute of flamingo for Py3/Qt5)" - self.utilsList=["selectSolids","queryModel","moveWorkPlane","offsetWorkPlane","rotateWorkPlane","hackedL","moveHandle","dpCalc"] - self.appendToolbar(translate("dodo","Utils"),self.utilsList) - Log ('Loading Utils: done\n') + def Initialize(self): + import CUtils - self.frameList=["frameIt","FrameBranchManager","insertSection","spinSect","reverseBeam","shiftBeam","pivotBeam","levelBeam","alignEdge","rotJoin","alignFlange","stretchBeam","extend","adjustFrameAngle","insertPath","createCutList"] - self.appendToolbar(translate("dodo","frametools"),self.frameList) - Log ('Loading Frame tools: done\n') + self.utilsList = [ + "Quetzal_SelectSolids", + "Quetzal_QueryModel", + "Quetzal_MoveWorkPlane", + "Quetzal_OffsetWorkPlane", + "Quetzal_RotateWorkPlane", + "Quetzal_HackedL", + "Quetzal_MoveHandle", + "Quetzal_DpCalc", + ] + self.appendToolbar("Utils", self.utilsList) + Log("Loading Utils: done\n") + import CFrame - self.pypeList=["insertPipe","insertElbow","insertReduct","insertCap","insertValve","insertFlange","insertUbolt","insertPypeLine","insertBranch","insertTank","insertRoute","breakPipe","mateEdges","flat","extend2intersection","extend1intersection","laydown","raiseup","attach2tube","point2point","insertAnyz"]#,"joinPype"] + self.frameList = [ + "Quetzal_FrameIt", + "Quetzal_FrameBranchManager", + "Quetzal_InsertSection", + "Quetzal_SpinSect", + "Quetzal_ReverseBeam", + "Quetzal_ShiftBeam", + "Quetzal_PivotBeam", + "Quetzal_LevelBeam", + "Quetzal_AlignEdge", + "Quetzal_RotJoin", + "Quetzal_AlignFlange", + "Quetzal_StretchBeam", + "Quetzal_Extend", + "Quetzal_AdjustFrameAngle", + "Quetzal_InsertPath", + ] + self.appendToolbar("frameTools", self.frameList) + Log("Loading Frame tools: done\n") + import CPipe - self.qm=toolList # ["pipeQM","elbowQM","reductQM"] - self.appendToolbar(translate("dodo","pypetools"),self.pypeList) - Log ('Loading Pipe tools: done\n') - self.appendMenu(translate("dodo","Frame tools"),self.frameList) - self.appendMenu(translate("dodo","Pype tools"),self.pypeList) - self.appendMenu(translate("dodo","Utils"),self.utilsList) - self.appendMenu(translate("dodo","QkMenus"),self.qm) + self.pypeList = [ + "Quetzal_InsertPipe", + "Quetzal_InsertElbow", + "Quetzal_InsertReduct", + "Quetzal_InsertCap", + "Quetzal_InsertValve", + "Quetzal_InsertFlange", + "Quetzal_InsertUbolt", + "Quetzal_InsertPypeLine", + "Quetzal_InsertBranch", + "Quetzal_InsertTank", + "Quetzal_InsertRoute", + "Quetzal_BreakPipe", + "Quetzal_MateEdges", + "Quetzal_Flat", + "Quetzal_Extend2intersection", + "Quetzal_Extend1intersection", + "Quetzal_MakeHeader", + "Quetzal_Laydown", + "Quetzal_Raiseup", + "Quetzal_Attach2tube", + "Quetzal_Point2point", + "Quetzal_InsertAnyz", + ] # ,"joinPype"] + from dodoPM import toolList - def ContextMenu(self, recipient): - self.appendContextMenu('Frames', self.frameList) - self.appendContextMenu('Pypes', self.pypeList) - self.appendContextMenu('Utils', self.utilsList) + self.qm = toolList # ["pipeQM","elbowQM","reductQM"] + self.appendToolbar(QT_TRANSLATE_NOOP("Workbench", "pypetools"), self.pypeList) + Log("Loading Pipe tools: done\n") + self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "Frame tools"), self.frameList) + self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "Pype tools"), self.pypeList) + self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "Utils"), self.utilsList) + self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "QkMenus"), self.qm) - def Activated(self): - # if hasattr(FreeCADGui,"draftToolBar"): #patch - # FreeCADGui.draftToolBar.Activated() #patch - # if hasattr(FreeCADGui,"Snapper"): #patch - # FreeCADGui.Snapper.show() #patchm - FreeCAD.__activePypeLine__=None - FreeCAD.__activeFrameLine__=None - Msg("Created variables in FreeCAD module:\n") - Msg("__activePypeLine__\n") - Msg("__activeFrameLine__\n") - try: - import dodoPM - Msg("__dodoPMact__ \n") - FreeCAD.Console.PrintMessage(FreeCAD.__dodoPMact__.objectName()+' \'s shortcut = '+FreeCAD.__dodoPMact__.shortcuts()[0].toString()+'\n\t****\n') - except: - FreeCAD.Console.PrintError('dodoPM not loaded \n') + def ContextMenu(self, recipient): + QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP + self.appendContextMenu(QT_TRANSLATE_NOOP("Workbench", "Frames"), self.frameList) + self.appendContextMenu(QT_TRANSLATE_NOOP("Workbench", "Pypes"), self.pypeList) + self.appendContextMenu(QT_TRANSLATE_NOOP("Workbench", "Utils"), self.utilsList) + + def Activated(self): + # if hasattr(FreeCADGui,"draftToolBar"): #patch + # FreeCADGui.draftToolBar.Activated() #patch + # if hasattr(FreeCADGui,"Snapper"): #patch + # FreeCADGui.Snapper.show() #patchm + FreeCAD.__activePypeLine__ = None + FreeCAD.__activeFrameLine__ = None + Msg("Created variables in FreeCAD module:\n") + Msg("__activePypeLine__\n") + Msg("__activeFrameLine__\n") + try: + Msg("__dodoPMact__ \n") + FreeCAD.Console.PrintMessage( + FreeCAD.__dodoPMact__.objectName() + + " 's shortcut = " + + FreeCAD.__dodoPMact__.shortcuts()[0].toString() + + "\n\t****\n" + ) + except: + FreeCAD.Console.PrintError("dodoPM not loaded \n") + + def Deactivated(self): + del FreeCAD.__activePypeLine__ + Msg("__activePypeLine__ variable deleted\n") + del FreeCAD.__activeFrameLine__ + Msg("__activeFrameLine__ variable deleted\n") + # mw=FreeCADGui.getMainWindow() + # mw.removeAction(FreeCAD.__dodoPMact__) + # Msg("dodoPM shortcut removed\n") + # del FreeCAD.__dodoPMact__ + # Msg("__dodoPMact__ variable deleted\n") + # Msg("dodo deactivated()\n") - def Deactivated(self): - del FreeCAD.__activePypeLine__ - Msg("__activePypeLine__ variable deleted\n") - del FreeCAD.__activeFrameLine__ - Msg("__activeFrameLine__ variable deleted\n") - # mw=FreeCADGui.getMainWindow() - # mw.removeAction(FreeCAD.__dodoPMact__) - # Msg("dodoPM shortcut removed\n") - # del FreeCAD.__dodoPMact__ - # Msg("__dodoPMact__ variable deleted\n") - # Msg("dodo deactivated()\n") -Gui.addWorkbench(dodo) +FreeCADGui.addWorkbench(dodo) diff --git a/cut_list/cut_list_commands.py b/cut_list/cut_list_commands.py index 88c40f8..0551826 100644 --- a/cut_list/cut_list_commands.py +++ b/cut_list/cut_list_commands.py @@ -1,30 +1,32 @@ +import os + import FreeCAD import FreeCADGui -import os -from . import cut_list_ui -from . import cut_list_creation -from . import RESOURCE_PATH from PySide.QtCore import QT_TRANSLATE_NOOP +from . import RESOURCE_PATH, cut_list_ui + + class cutListCommand: - toolbarName = 'Cut List' - commandName = 'createCutList' + toolbarName = "Cut List" + commandName = "createCutList" def GetResources(self): Icon = os.path.join(RESOURCE_PATH, "cut_list_icon.svg") - return {'MenuText': QT_TRANSLATE_NOOP("cutListCommand","createCutList"), - 'ToolTip': QT_TRANSLATE_NOOP("cutListCommand","Create a new Cut List from Dodo Beams"), - 'Pixmap': Icon - } + return { + "MenuText": QT_TRANSLATE_NOOP("Quetzal_CreateCutList", "createCutList"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_CreateCutList", "Create a new Cut List from Dodo Beams" + ), + "Pixmap": Icon, + } def Activated(self): - cut_list_ui.openCutListDialog() def IsActive(self): """If there is no active document we can't do anything.""" - return not FreeCAD.ActiveDocument is None - + return FreeCAD.ActiveDocument is not None -FreeCADGui.addCommand(cutListCommand.commandName, cutListCommand()) +FreeCADGui.addCommand("Quetzal_CreateCutList", cutListCommand()) diff --git a/dodoPM.py b/dodoPM.py index a304584..9396016 100644 --- a/dodoPM.py +++ b/dodoPM.py @@ -532,7 +532,7 @@ def go(self): "flangeQM", "valveQM", "capQM", -] # ["insertPipe","insertElbow","insertReduct","insertCap","insertValve","insertFlange","insertUbolt"] +] # ["Quetzal_InsertPipe","Quetzal_InsertElbow","Quetzal_InsertReduct","Quetzal_InsertCap","Quetzal_InsertValve","Quetzal_InsertFlange","Quetzal_InsertUbolt"] compositingManager = True if QtCore.qVersion() < "5": windowShadow = False From 0374b92ed3b64e44aed54bc88c1c0827aeb13bd6 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Tue, 22 Oct 2024 14:36:29 -0600 Subject: [PATCH 052/135] Fix typos --- CUtils.py | 2 +- pFeatures.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CUtils.py b/CUtils.py index e6e7e27..cd0a71b 100644 --- a/CUtils.py +++ b/CUtils.py @@ -130,7 +130,7 @@ def GetResources(self): "Accel": "O,W", "MenuText": QT_TRANSLATE_NOOP("Quetzal_OffsetWorkPlane", "offset Workplane"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_OffsetWorkPlane", "Shifts the WP alongg its normal." + "Quetzal_OffsetWorkPlane", "Shifts the WP along its normal." ), } diff --git a/pFeatures.py b/pFeatures.py index b2f3ac6..e62fa41 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -526,7 +526,7 @@ def __init__( "App::PropertyBool", "calcH", "Reduct", - QT_TRANSLATE_NOOP("App::Property", "Make the lenght variable"), + QT_TRANSLATE_NOOP("App::Property", "Make the length variable"), ) obj.addProperty( "App::PropertyLength", From 2a7f9374114c409698ec9407c18db41abc7792cb Mon Sep 17 00:00:00 2001 From: hasecilu Date: Tue, 22 Oct 2024 14:12:01 -0600 Subject: [PATCH 053/135] Update translations file --- translationz/{dodo.ts => Quetzal.ts} | 1475 +++++++------ translationz/Quetzal_es-ES.qm | Bin 0 -> 45622 bytes .../{dodo_es-ES.ts => Quetzal_es-ES.ts} | 1863 ++++++++--------- translationz/dodo_es-ES.qm | Bin 45434 -> 0 bytes translationz/update_translation.sh | 2 +- 5 files changed, 1635 insertions(+), 1705 deletions(-) rename translationz/{dodo.ts => Quetzal.ts} (87%) create mode 100644 translationz/Quetzal_es-ES.qm rename translationz/{dodo_es-ES.ts => Quetzal_es-ES.ts} (74%) delete mode 100644 translationz/dodo_es-ES.qm diff --git a/translationz/dodo.ts b/translationz/Quetzal.ts similarity index 87% rename from translationz/dodo.ts rename to translationz/Quetzal.ts index 20de142..4866cae 100644 --- a/translationz/dodo.ts +++ b/translationz/Quetzal.ts @@ -8,7 +8,8 @@ - + + Outside diameter @@ -19,6 +20,7 @@ + Wall thickness @@ -26,13 +28,13 @@ - + Inside diameter - + Length of tube @@ -51,7 +53,7 @@ - + Bend Radius @@ -127,7 +129,7 @@ - Make the lenght variable + Make the length variable @@ -146,311 +148,278 @@ - - The group. - - - - - Type of pipeFeature - - - - - Type of clamp - - - - - Size of clamp - - - - - Arc diameter + + + The extension of the tail - - Overall height + + + The extension of the head - - Rod diameter + + + The rotation of the section - - Size of thread + + + Type of frameFeature - - Ports position relative to the origin of Shape + + Size of frame - - Tank's length + + The group. - - Tank's width + + the edges - - Tank's height + + the profile - - Thikness of tank's shell + + The beams names - - Thikness of tank's top + + The profile - - The tubes of the branch. + + + + + + + + + + Type of section - - The curves of the branch. + + + + + + + Width of the beam - - The path. + + + + + + + + + Height of the beam -
- - App::PropertyFloat - - - The extension of the tail + + Thickness of the vertical sides - - - The extension of the head + + Thickness of the horizontal sides - - - The rotation of the section + + Diameter of the beam - - Flow factor (m3/h/bar) + + Thickness - - - App::PropertyLength - - - - - - - Width of the beam + + + Thickness of the webs - - - - - - - - - Height of the beam + + + + Thickness of the web - - Thickness of the vertical sides + + Thickness of the flanges - - Thickness of the horizontal sides + + Width of the flanges - - Diameter of the beam + + + + Thickness 1 - - Thickness + + + + Thickness 2 - - - Thickness of the webs + + + + Thickness 3 - - - - Thickness of the web + + + Width of the bottom flange - - Thickness of the flanges + + + Width of the top flange - - Width of the flanges + + Type of pipeFeature - - - - Thickness 1 + + Type of clamp - - - - Thickness 2 + + Size of clamp - - - - Thickness 3 + + Arc diameter - - - Width of the bottom flange + + Overall height - - - Width of the top flange + + Rod diameter - - Outside diameter + + Size of thread - - Wall thickness + + + Ports position relative to the origin of Shape - - - App::PropertyLink - - the edges + + Type of tubeFeature - - the profile + + Rating of pipeFeature - - The path. + + Nominal diameter - - The profile + + Flow factor (m3/h/bar) - - - App::PropertyString - - - Type of frameFeature + + Tank's length - - Size of frame + + Tank's width - - The group. + + Tank's height - - - - - - - - - - Type of section + + Thikness of tank's shell - - Type of tubeFeature + + Thikness of tank's top - - Rating of pipeFeature + + The tubes of the branch. - - Nominal diameter + + The curves of the branch. - - - App::PropertyStringList - - The beams names + + + The path. - App::PropertyVectorList + App::PropertyString - - Ports position relative to the origin of Shape + + The group. @@ -842,11 +811,6 @@ FrameBranch Manager - - - <no target selected> - - <degrees> @@ -912,6 +876,11 @@ hotkeys: "S" to select, "X" to trim + + + <no target selected> + + Slice Intersections @@ -1320,19 +1289,6 @@ profile
- - FrameBranchManager - - - FrameBranch Manager - - - - - Open FrameBranch Manager - - - Part::Feature @@ -1385,15 +1341,7 @@ profile - Sketcher::SketchObject - - - pipeRoute - - - - - adjustFrameAngle + Quetzal_AdjustFrameAngle adjustFrameAngle @@ -1406,7 +1354,7 @@ profile - alignEdge + Quetzal_AlignEdge Mate the edges @@ -1419,7 +1367,7 @@ profile - alignFlange + Quetzal_AlignFlange alignFlange @@ -1432,915 +1380,1096 @@ profile - attach2tube + Quetzal_Attach2tube - + Attach to tube - + Attach one pype to the nearest port of selected pipe - breakForm - - - Break the pipes - - + Quetzal_BreakPipe - - Length + + Break the pipe - - <reference> + + Break one pipe at point and insert gap + + + Quetzal_CreateCutList - - PypeLine: + + createCutList - - <none> + + Create a new Cut List from Dodo Beams - breakPipe + Quetzal_DpCalc - - Break the pipe + + Pressure loss calculator - - Break one pipe at point and insert gap + + Calculate pressure loss in "pypes" using ChEDL libraries. + See __doc__ of the module for futher information. - capQM + Quetzal_Extend - - QM for caps + + extendTheBeam + + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object - cutListCommand + Quetzal_Extend1intersection - - createCutList + + + Extends pipe to intersection + + + Quetzal_Extend2intersection - - Create a new Cut List from Dodo Beams + + + Extends pipes to intersection - dodo + Quetzal_Flat - - - Utils + + Fit one elbow - - frametools + + Place the elbow between two pipes or beams + + + Quetzal_FrameBranchManager - - pypetools + + FrameBranch Manager - - Frame tools + + Open FrameBranch Manager + + + Quetzal_FrameIt - - Pype tools + + Place one-beam over one-edge - - QkMenus + + Place one beam after the other over the edges - dpCalc + Quetzal_HackedL - - Pressure loss calculator + + draw a DWire - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. + + WP is re-positioned at each point. Possible to spin and offset it. - dpCalcDialog + Quetzal_InsertAnyz - - - *** CUSTOM FLUID *** + + Insert any shape - - <custom fluid> + + Insert a STEP, IGES or BREP + + + Quetzal_InsertBranch - - - No data found + + Insert a branch - - It seems the fluid has not a liquid state. + + Insert a PypeBranch + + + Quetzal_InsertCap - - *** LIQUID *** + + + Insert a cap + + + Quetzal_InsertElbow - - Flow (m3/h) + + + Insert a curve + + + Quetzal_InsertFlange - - It seems the fluid has not a gas state. + + + Insert a flange + + + Quetzal_InsertPath - - *** GAS/VAPOUR *** + + insert Path - - Flow (kg/h) + + Creates one path along selected edges - elbowQM + Quetzal_InsertPipe - - QM for elbows + + + Insert a tube - extend + Quetzal_InsertPypeLine - - extendTheBeam + + PypeLine Manager - - Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + Open PypeLine Manager - extend1intersection + Quetzal_InsertReduct - - - Extends pipe to intersection + + + Insert a reduction - extend2intersection + Quetzal_InsertRoute - - - Extends pipes to intersection + + Insert a pipe route + + + + + Create a sketch attached to a circular edge - fObservers + Quetzal_InsertSection - - Select one beam and one edge + + Insert sections - - First select the base beam, then the edges + + Creates customized beam profiles 2D + + + Quetzal_InsertTank - - First select the target plane, then the faces to align + + Insert a tank - - levelTheBeam - Transaction + + Create tank and nozzles + + + Quetzal_InsertUbolt - - Select the target face, then the others + + + Insert a U-bolt + + + Quetzal_InsertValve - - alignFlange - Transaction + + + Insert a valve + + + Quetzal_JoinPype - - Select two edges to join. + + Join pypes - - joinTheBeamsEdges - Transaction + + Select the part-pype and the port + + + Quetzal_Laydown - - Select the beam and input the length + + Lay-down the pipe - - First Select the target shape, then the beams to extend. + + Lay-down the pipe on the support plane + + + Quetzal_LevelBeam - - Select 2 edges + + Flush the surfaces - - Adjust angle - Transaction + + Shift the beams to line-up the faces to the first selection (faces must be //) + + + Quetzal_MakeHeader - - Select 2 edges =>[Ctrl]+select + + Connect to header - - rotJoin - Transaction + + Connect branches to one header pipe +Branches and header's axes must be ortho - flangeQM + Quetzal_MateEdges - - QM for flanges + + Mate pipes edges + + + + + Mate two terminations through their edges - flat + Quetzal_MoveHandle - - Fit one elbow + + Move objects - - Place the elbow between two pipes or beams + + Move quickly objects inside viewport - frameIt + Quetzal_MoveWorkPlane - - Place one-beam over one-edge + + align Workplane - - Place one beam after the other over the edges + + Moves and rotates the drafting workplane with points, edges and faces - hackedL + Quetzal_OffsetWorkPlane - - draw a DWire + + Offset Work Plane - - WP is re-positioned at each point. Possible to spin and offset it. + + Offset: - - - insertAnyz - - Insert any shape + + offset Workplane - - Insert a STEP, IGES or BREP + + Shifts the WP along its normal. - insertBranch + Quetzal_PivotBeam - - Insert a branch + + pivotTheBeam - - Insert a PypeBranch + + Rotates the beam around an axis (edge or center-of-curvature) - insertBranchForm + Quetzal_Point2point - - Insert a branch + + draw a tube point-to-point - - <name> + + Click on subsequent points. + + + Quetzal_QueryModel - - <bend radius> + + query the model - - - insertCap - - - Insert a cap + + Click objects to print infos - insertCapForm + Quetzal_Raiseup - - Insert caps + + Raise-up the support - - Reverse + + Raise the support to the pipe + + + Quetzal_ReverseBeam - - Apply + + Reverse orientation + + + + + Reverse the orientation of selected objects - insertElbow + Quetzal_RotJoin - - - Insert a curve + + rotJoinEdge + + + + + Rotates and align the beam according another edge - insertElbowForm + Quetzal_RotateWorkPlane - - Insert elbows + + rotate Workplane - - <bend angle> + + Spin the Draft working plane about one of its axes + + + Quetzal_SelectSolids - - <bend radius> + + Select solids - - Trim/Extend + + Grab all solids or those partially selected + to export in .step format + + + Quetzal_ShiftBeam - - Reverse + + shiftTheBeam - - Apply + + Translate objects by vectors defined on existing geometry + + + Quetzal_SpinSect - - 0 deg + + Spin beams by 45 deg. - - Wrong selection - + + Rotates the section of the beam by 45 degrees + + + Quetzal_StretchBeam - - deg + + stretchTheBeam + + + + + Changes the length of the beam, either according a preselected edge or a direct input - insertFlange + Sketcher::SketchObject - - - Insert a flange + + pipeRoute - insertFlangeForm + Workbench - - Insert flanges + + Dodo - - Reverse + + Dodo workbench +(substitute of flamingo for Py3/Qt5) - - Apply + + pypetools - - - insertPath - - insert Path + + Frame tools - - Creates one path along selected edges + + Pype tools - - - insertPipe - - - Insert a tube + + + Utils + + + + + QkMenus + + + + + Frames + + + + + Pypes - insertPipeForm + breakForm - - Insert pipes + + Break the pipes - - <length> + + Length - - Reverse + + <reference> - - Apply + + PypeLine: - - - insertPypeLine - - PypeLine Manager + + <none> + + + capQM - - Open PypeLine Manager + + QM for caps - insertPypeLineForm + dpCalcDialog - - PypeLine Manager + + + *** CUSTOM FLUID *** - - <name> + + <custom fluid> - - Redraw + + + No data found - - Part list + + It seems the fluid has not a liquid state. - - Color + + *** LIQUID *** - - Get Path + + Flow (m3/h) - - Get Profile + + It seems the fluid has not a gas state. - - <new> + + *** GAS/VAPOUR *** + + + + + Flow (kg/h) - insertReduct + elbowQM - - - Insert a reduction + + QM for elbows - insertReductForm + fObservers - - Insert reductions + + Select one beam and one edge - - Reverse + + First select the base beam, then the edges - - Apply + + First select the target plane, then the faces to align - - Eccentric + + levelTheBeam + Transaction + + + + + Select the target face, then the others + + + + + alignFlange + Transaction + + + + + Select two edges to join. + + + + + joinTheBeamsEdges + Transaction + + + + + Select the beam and input the length + + + + + First Select the target shape, then the beams to extend. + + + + + Select 2 edges + + + + + Adjust angle + Transaction + + + + + Select 2 edges =>[Ctrl]+select + + + + + rotJoin + Transaction - insertRoute + flangeQM - - Insert a pipe route + + QM for flanges + + + insertBranchForm - - Create a sketch attached to a circular edge + + Insert a branch + + + + + <name> + + + + + <bend radius> - insertRouteForm + insertCapForm - - <select an edge> + + Insert caps + + + + + Reverse + + + + + Apply - insertSection + insertElbowForm - - Insert sections + + Insert elbows - - Creates customized beam profiles 2D + + <bend angle> + + + + + <bend radius> + + + + + Trim/Extend + + + + + Reverse + + + + + Apply + + + + + 0 deg + + + + + Wrong selection + + + + + + deg + + + + + insertFlangeForm + + + Insert flanges - - - insertTank - - Insert a tank + + Reverse - - Create tank and nozzles + + Apply - insertTankForm + insertPipeForm - - doing combine + + Insert pipes - - files read + + <length> - - files not read + + Reverse - - listNozzles: %s + + Apply - insertUbolt + insertPypeLineForm - - - Insert a U-bolt + + PypeLine Manager - - - insertUboltForm - - Insert U-bolt + + <name> - - - no ref. face - + + Redraw - - Ref. face + + Part list - - Head + + Color - - Middle + + Get Path - - Tail + + Get Profile - - - insertValve - - - Insert a valve + + <new> - insertValveForm + insertReductForm - - Insert valves + + Insert reductions - + Reverse - + Apply - - Insert in pipe + + Eccentric - joinPype - - - Join pypes - - + insertRouteForm - - Select the part-pype and the port + + <select an edge> - laydown + insertTankForm - - Lay-down the pipe + + doing combine - - Lay-down the pipe on the support plane + + files read - - - levelBeam - - Flush the surfaces + + files not read - - Shift the beams to line-up the faces to the first selection (faces must be //) + + listNozzles: %s - makeHeader + insertUboltForm - - Connect to header + + Insert U-bolt - - Connect branches to one header pipe -Branches and header's axes must be ortho + + - no ref. face - - - - makeframenbranch - - Travatura + + Ref. face - - - mateEdges - - Mate pipes edges + + Head - - Mate two terminations through their edges + + Middle - - - mouseActionB1 - - ____TAIL + + Tail - moveHandle + insertValveForm - - Move objects + + Insert valves - - Move quickly objects inside viewport + + Reverse - - - moveWorkPlane - - align Workplane + + Apply - - Moves and rotates the drafting workplane with points, edges and faces + + Insert in pipe - offsetWorkPlane - - - Offset Work Plane - - - - - Offset: - - + makeframenbranch - - offset Workplane + + Travatura + + + mouseActionB1 - - Shifts the WP alongg its normal. + + ____TAIL pForms - + Offset Work Plane - + Offset: @@ -2348,46 +2477,20 @@ Branches and header's axes must be ortho pipeQM - + QM for pipes - - pivotBeam - - - pivotTheBeam - - - - - Rotates the beam around an axis (edge or center-of-curvature) - - - - - point2point - - - draw a tube point-to-point - - - - - Click on subsequent points. - - - point2pointPipe - + Reset - + Move WP on click @@ -2493,58 +2596,6 @@ Branches and header's axes must be ortho - - queryModel - - - query the model - - - - - Click objects to print infos - - - - - raiseup - - - Raise-up the support - - - - - Raise the support to the pipe - - - - - reverseBeam - - - Reverse orientation - - - - - Reverse the orientation of selected objects - - - - - rotJoin - - - rotJoinEdge - - - - - Rotates and align the beam according another edge - - - rotWPForm @@ -2558,72 +2609,6 @@ Branches and header's axes must be ortho - - rotateWorkPlane - - - rotate Workplane - - - - - Spin the Draft working plane about one of its axes - - - - - selectSolids - - - Select solids - - - - - Grab all solids or those partially selected - to export in .step format - - - - - shiftBeam - - - shiftTheBeam - - - - - Translate objects by vectors defined on existing geometry - - - - - spinSect - - - Spin beams by 45 deg. - - - - - Rotates the section of the beam by 45 degrees - - - - - stretchBeam - - - stretchTheBeam - - - - - Changes the length of the beam, either according a preselected edge or a direct input - - - uCmd @@ -2719,7 +2704,7 @@ Branches and header's axes must be ortho valveQM - + QM for valves diff --git a/translationz/Quetzal_es-ES.qm b/translationz/Quetzal_es-ES.qm new file mode 100644 index 0000000000000000000000000000000000000000..1bc1d1fcfa8c781faf17d8ac8f7061618c8fbe90 GIT binary patch literal 45622 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 literal 0 HcmV?d00001 diff --git a/translationz/dodo_es-ES.ts b/translationz/Quetzal_es-ES.ts similarity index 74% rename from translationz/dodo_es-ES.ts rename to translationz/Quetzal_es-ES.ts index ab0bf02..e85c6f6 100644 --- a/translationz/dodo_es-ES.ts +++ b/translationz/Quetzal_es-ES.ts @@ -1,6 +1,6 @@ - + App::Property @@ -8,9 +8,10 @@ - + + Outside diameter - Diametro exterior + Diámetro exterior @@ -19,6 +20,7 @@ + Wall thickness Espesor de muro @@ -26,13 +28,13 @@ - + Inside diameter - Diametro interno + Diámetro interno - + Length of tube Longitud del tubo @@ -42,49 +44,33 @@ Section dim. - Dimension de seccion. + Dimensión de sección Bend Angle - Angulo de dobles + Ángulo de doblez - + Bend Radius - Radio de dobles + Radio de doblez Type of flange Tipo de brida - - Type of tubeFeature - Tipo caracteristica de tubo - - - Rating of pipeFeature - Relacion de caracteristicas de tubo - - - Nominal diameter - Diametro nominal - - - Flow factor (m3/h/bar) - Factor de flujo (m3/h/bar) - Flange diameter - Diametro de brida + Diámetro de brida Bore diameter - Diametro de orificio + Diámetro de orificio @@ -94,7 +80,7 @@ Bolts hole diameter - Diametro de orificio para tornillo + Diámetro de orificio para tornillo @@ -114,7 +100,7 @@ Diameter of raised face - Diametro de cara elevada + Diámetro de cara elevada @@ -124,26 +110,26 @@ Diameter of welding neck - Diametro de cuello para soldadura + Diámetro de cuello para soldadura Outside diameter of pipe - Diametro exterior de tuberia + Diámetro exterior de tubería Major diameter - Diametro mayor + Diámetro mayor Minor diameter - Diametro menor + Diámetro menor - Make the lenght variable + Make the length variable Hace la longitud variable @@ -154,320 +140,287 @@ Concentric or Eccentric - Concentrico o excentrico + Concéntrico o excéntrico the radius of bending - El radio de dobles - - - - The group. - El grupo. - - - - Type of pipeFeature - Tipo de caracteristica de tubo - - - - Type of clamp - Tipo de sujeccion - - - - Size of clamp - Tamaño de sujeccion - - - - Arc diameter - Diametro de arco - - - - Overall height - Altura total - - - - Rod diameter - Diametro de vastago - - - - Size of thread - Tamaño de rosca - - - - Ports position relative to the origin of Shape - Posicion de los puertos relativos al origen de la forma - - - - Tank's length - Longitud de deposito + El radio de doblez - - Tank's width - Ancho de deposito + + + The extension of the tail + La extensión de la cola - - Tank's height - Altura de deposito + + + The extension of the head + La extensión de la cabecera - - Thikness of tank's shell - Espesor de carcaza del deposito + + + The rotation of the section + La rotación de la sección - - Thikness of tank's top - Espesor superior del deposito + + + Type of frameFeature + Tipo de característica de marco - - The tubes of the branch. - Tubos de la derivación. + + Size of frame + Tamaño de marco - - The curves of the branch. - Las curvas de la derivacion. + + The group. + El grupo. - - The path. - La ruta. + + the edges + Los bordes - - - App::PropertyFloat - - - The extension of the tail - La extension de la cola + + the profile + El perfil - - - The extension of the head - La extension de la cabezera + + The beams names + Los nombres de las vigas - - - The rotation of the section - La rotacion de la seccion + + The profile + El perfil - - Flow factor (m3/h/bar) - Factor de flujo (m3/h/bar) + + + + + + + + + + Type of section + Tipo de sección - - - App::PropertyLength - - - - - - + + + + + + Width of the beam Ancho de la viga - - - - - - - - + + + + + + + + Height of the beam Alto de la viga - + Thickness of the vertical sides Espesor de los lados verticales - + Thickness of the horizontal sides Espesor de los lados horizontales - + Diameter of the beam - Diametro de la viga + Diámetro de la viga - + Thickness Espesor - - + + Thickness of the webs Espesor de la redes - - - + + + Thickness of the web Espesor de la red - + Thickness of the flanges Espesor de las bridas - + Width of the flanges Ancho de las bridas - - - + + + Thickness 1 Espesor 1 - - - + + + Thickness 2 Espesor 2 - - - + + + Thickness 3 Espesor 3 - - + + Width of the bottom flange Ancho inferior de la brida - - + + Width of the top flange Ancho superior de la brida - - Outside diameter - Diametro exterior - - - - Wall thickness - Espesor de pared - - - - App::PropertyLink - - - the edges - Los bordes + + Type of pipeFeature + Tipo de característica de tubo - - the profile - El perfil + + Type of clamp + Tipo de sujeción - - The path. - La trayectoria. + + Size of clamp + Tamaño de sujeción - - The profile - El perfil + + Arc diameter + Diámetro de arco - - - App::PropertyString - - - Type of frameFeature - Tipo de caracteristica de marco + + Overall height + Altura total - - Size of frame - Tamaño de marco + + Rod diameter + Diámetro de vástago - - The group. - El grupo. + + Size of thread + Tamaño de rosca - - - - - - - - - - Type of section - Tipo de seccion + + + Ports position relative to the origin of Shape + Posición de los puertos relativos al origen de la forma Type of tubeFeature - Tipo de caracteristica de tubo + Tipo de característica de tubo Rating of pipeFeature - Grado de caracteristica de tuberia + Grado de característica de tubería Nominal diameter - Diametro nominal + Diámetro nominal - - - App::PropertyStringList - - The beams names - Los nombres de las vigas + + Flow factor (m3/h/bar) + Factor de flujo (m3/h/bar) + + + + Tank's length + Longitud de depósito + + + + Tank's width + Ancho de depósito + + + + Tank's height + Altura de depósito + + + + Thikness of tank's shell + Espesor de carcasa del depósito + + + + Thikness of tank's top + Espesor superior del depósito + + + + The tubes of the branch. + Tubos de la derivación. + + + + The curves of the branch. + Las curvas de la derivación. + + + + + The path. + La ruta. - App::PropertyVectorList + App::PropertyString - - Ports position relative to the origin of Shape - Posiciones de los puertos relativos al origen de la forma + + The group. + El grupo. @@ -500,7 +453,7 @@ hotkeys: "S" to select, "X" to execute - Teclas rapidas: "S" para seleccionar, "X" para ejecutar + Teclas rápidas: "S" para seleccionar, "X" para ejecutar @@ -591,7 +544,7 @@ hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + teclas rápidas: "S" para seleccionar, "X" para ejecutar @@ -629,7 +582,7 @@ hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + teclas rápidas: "S" para seleccionar, "X" para ejecutar @@ -657,7 +610,7 @@ Group Parts by Size - Agrupar piezas por tamano + Agrupar piezas por tamaño @@ -667,7 +620,7 @@ Maximum Stock Length - Longitud maxima de surtido + Longitud máxima de surtido @@ -690,7 +643,7 @@ Angle: - Angulo: + Ángulo: @@ -702,7 +655,7 @@ * Click on arrow to move * Ctrl+Click to go back * Ctrl+Alt+Click to rotate - * Cliquear en flecha para mover + * Dar clic en la flecha para mover * Control+clic para regresar * Control+alt+clic para rotar @@ -742,7 +695,7 @@ Roughness (um) - Rugozidad (um) + Rugosidad (um) @@ -762,7 +715,7 @@ <on selection> - <en seleccion> + <en selección> @@ -807,7 +760,7 @@ P abs. (bar) - Presion absoluta. (bar) + Presión absoluta. (bar) @@ -822,7 +775,7 @@ *** LIQUID *** - *** LIQUIDO *** + *** LÍQUIDO *** @@ -850,7 +803,7 @@ hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + teclas rápidas: "S" para seleccionar, "X" para ejecutar @@ -863,7 +816,7 @@ <no target selected> - <ningun objetivo seleccionado> + <ningún objetivo seleccionado> @@ -885,10 +838,6 @@ AddBeams Agregar vigas - - Add single beam - Agregar viga simple - ChangeProfile @@ -902,7 +851,7 @@ <no item selected> - <ningun elemento seleccionado> + <ningún elemento seleccionado> @@ -912,7 +861,7 @@ offset head - Desfasar cabezera + Desfasar cabecera @@ -932,7 +881,7 @@ hotkeys: "S" to select, "X" to trim - teclas rapidas: "S" para seleccionar, "X" para ejecutar + teclas rápidas: "S" para seleccionar, "X" para ejecutar @@ -975,7 +924,7 @@ hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + teclas rápidas: "S" para seleccionar, "X" para ejecutar @@ -1023,7 +972,7 @@ hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + teclas rápidas: "S" para seleccionar, "X" para ejecutar @@ -1049,7 +998,7 @@ Quick Insert - Insercion rapida + Inserción rápida @@ -1077,7 +1026,7 @@ hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + teclas rápidas: "S" para seleccionar, "X" para ejecutar @@ -1090,7 +1039,7 @@ Create pipe route - Crear trayectoria de tuberia + Crear trayectoria de tubería @@ -1147,7 +1096,7 @@ hotkeys: "S" to select normal from geometry "X" to execute - teclas rapidas: "S" para seleccionar la normal de la geometria + teclas rápidas: "S" para seleccionar la normal de la geometría "X" para ejecutar @@ -1223,7 +1172,7 @@ Full section - Seccion completa + sección completa @@ -1261,7 +1210,7 @@ profile Tank - Deposito + depósito @@ -1325,7 +1274,7 @@ profile Insert valves - Insertar valvulas + Insertar válvulas @@ -1343,34 +1292,13 @@ profile Tipo: - - FrameBranchManager - - - FrameBranch Manager - Derivacion de gestor de marcos - - - - Open FrameBranch Manager - Abre gestor de marcos - - Part::Feature - - CurvaSemplice - Curva simple - Simple curve Curva simple - - Tube - Tubo - Part::FeaturePython @@ -1392,7 +1320,7 @@ profile Reduction - Reduccion + Reducción @@ -1402,42 +1330,34 @@ profile Tank - Deposito + depósito Cap - Tapon + Tapón Valve - Valvula - - - - Sketcher::SketchObject - - - pipeRoute - Rutatuberia + válvula - adjustFrameAngle + Quetzal_AdjustFrameAngle adjustFrameAngle - Adjuste de angulo de marcos + Ajuste de ángulo de marcos Adjust the angle of frame by two edges - Ajusta del angulo del marco por medio de dos aristas + Ajustar el ángulo del marco por medio de dos aristas - alignEdge + Quetzal_AlignEdge Mate the edges @@ -1446,152 +1366,674 @@ profile Join two edges: select two or pre-select several - Une dos aristas:selecciona dos o pre selecciona varias + Unir dos aristas:selecciona dos o pre selecciona varias - alignFlange + Quetzal_AlignFlange alignFlange - Alinear superficies + Alinear brida Rotates the section of the beam to make the faces parallel to another face - Rota la seccion de la viga para hacer las caras paralelas a otra cara + Rota la sección de la viga para hacer las caras paralelas a otra cara - attach2tube + Quetzal_Attach2tube - + Attach to tube - Ligado al tubo + Ligado al tubo - + Attach one pype to the nearest port of selected pipe - Liga un tipo de tuberia al puerto mas cercano de la tuberia seleccionada - - - - breakForm - - - Break the pipes - Romper las tuberias - - - - Length - Longituf - - - - <reference> - <referencia> - - - - PypeLine: - Linea de tubo: - - - - <none> - <ninguno> + Liga un tipo de tubería al puerto mas cercano de la tubería seleccionada - breakPipe + Quetzal_BreakPipe Break the pipe - Rompe la tuberia + Rompe la tubería Break one pipe at point and insert gap - Dividir un tubo al punto e insertar un espacio - - - - capQM - - - QM for caps - QM para tapones + Dividir un tubo al punto e insertar un espacio - cutListCommand + Quetzal_CreateCutList - + createCutList - Crear lista de corte + Crear lista de corte - + Create a new Cut List from Dodo Beams - Crear una lista nueva de corte desde vigas dodo + Crear una lista nueva de corte desde vigas dodo - dodo + Quetzal_DpCalc - - - Utils - Utilerias + + Pressure loss calculator + Calculadora de Perdida de presion - - frametools - Herramientas estructurales + + Calculate pressure loss in "pypes" using ChEDL libraries. + See __doc__ of the module for futher information. + Calcular perdida de presión en tuberías utilizando biblioteca ChEDL. + Revisar __doc__ del modulo para mayor información. + + + Quetzal_Extend - - pypetools - Herramientas de tuberia + + extendTheBeam + Extender la viga - - Frame tools - Herramientas para estructuras + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado + + + Quetzal_Extend1intersection - - Pype tools - Herramientas para tuberias + + + Extends pipe to intersection + Extender tubo a la intersección + + + Quetzal_Extend2intersection - - QkMenus - Menus QK + + + Extends pipes to intersection + Extender tubos a la intersección - dpCalc + Quetzal_Flat - - Pressure loss calculator - Calculadora de Perdida de presion + + Fit one elbow + Colocar un codo - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. - Calcular perdida de presión en tuberias utilizando biblioteca ChEDL. - Revisar __doc__ del modulo para mayor información. + + Place the elbow between two pipes or beams + Colocar un codo entre 2 tuberías o vigas - dpCalcDialog + Quetzal_FrameBranchManager - - - *** CUSTOM FLUID *** + + FrameBranch Manager + Gestor de marcos ramificados + + + + Open FrameBranch Manager + Abre gestor de marcos + + + + Quetzal_FrameIt + + + Place one-beam over one-edge + Coloca una viga sobre una arista + + + + Place one beam after the other over the edges + Coloca una viga despues de las otras aristas + + + + Quetzal_HackedL + + + draw a DWire + Dibuja un Dwire + + + + WP is re-positioned at each point. Possible to spin and offset it. + Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. + + + + Quetzal_InsertAnyz + + + Insert any shape + Insertar cualquier forma + + + + Insert a STEP, IGES or BREP + Insertar un solido STEP, IGES, BREP + + + + Quetzal_InsertBranch + + + Insert a branch + Insertar una ramificación + + + + Insert a PypeBranch + Insertar una derivación de tubería + + + + Quetzal_InsertCap + + + + Insert a cap + Insertar un tapón + + + + Quetzal_InsertElbow + + + + Insert a curve + Insertar una curva + + + + Quetzal_InsertFlange + + + + Insert a flange + Insertar una brida + + + + Quetzal_InsertPath + + + insert Path + Insertar trayectoria + + + + Creates one path along selected edges + Crea una trayectoria a lo largo de la arista seleccionada + + + + Quetzal_InsertPipe + + + + Insert a tube + Insertar un tubo + + + + Quetzal_InsertPypeLine + + + PypeLine Manager + Gestor de línea de tubo + + + + Open PypeLine Manager + Abre gestor de tubería de línea + + + + Quetzal_InsertReduct + + + + Insert a reduction + Insertar una reducción + + + + Quetzal_InsertRoute + + + Insert a pipe route + Insertar una ruta de tubería + + + + Create a sketch attached to a circular edge + Crea un boceto adjunta a una aristar circular + + + + Quetzal_InsertSection + + + Insert sections + Inserta secciónes + + + + Creates customized beam profiles 2D + Crea un perfil de viga 2D personalizado + + + + Quetzal_InsertTank + + + Insert a tank + Inserta un depósito + + + + Create tank and nozzles + Crea un depósito y boquillas + + + + Quetzal_InsertUbolt + + + + Insert a U-bolt + Insertar un tornillo U + + + + Quetzal_InsertValve + + + + Insert a valve + Insertar una válvula + + + + Quetzal_JoinPype + + + Join pypes + Unir tubos + + + + Select the part-pype and the port + Selecciona la pieza de tubería y el puerto + + + + Quetzal_Laydown + + + Lay-down the pipe + Empotra la tubería + + + + Lay-down the pipe on the support plane + Empotra la tubería sobre el plano de soporte + + + + Quetzal_LevelBeam + + + Flush the surfaces + Empotrar las superficies + + + + Shift the beams to line-up the faces to the first selection (faces must be //) + Desplaza la viga para alinearla a la cara de la primera selección (caras deben ser paralelas) + + + + Quetzal_MakeHeader + + + Connect to header + Conectar a la cabecera + + + + Connect branches to one header pipe +Branches and header's axes must be ortho + Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + + + + Quetzal_MateEdges + + + Mate pipes edges + Coincidir las aristas de las tuberías + + + + Mate two terminations through their edges + Coincidir dos terminaciones a través de sus aristas + + + + Quetzal_MoveHandle + + + Move objects + Mover objetos + + + + Move quickly objects inside viewport + Mover objetos rapidamente dentro de la vista + + + + Quetzal_MoveWorkPlane + + + align Workplane + Alinear plano de trabajo + + + + Moves and rotates the drafting workplane with points, edges and faces + Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras + + + + Quetzal_OffsetWorkPlane + + + Offset Work Plane + + + + + Offset: + Desface: + + + + offset Workplane + Desfasar plano de trabajo + + + + Shifts the WP along its normal. + Desplaza el plano de trabajo a lo largo de su normal. + + + + Quetzal_PivotBeam + + + pivotTheBeam + Pivotea la viga + + + + Rotates the beam around an axis (edge or center-of-curvature) + Rota la viga alrededor de un eje (arista o centro de curvatura) + + + + Quetzal_Point2point + + + draw a tube point-to-point + Dibuja un tubo de punto a punto + + + + Click on subsequent points. + Da clic en puntos subsecuentes. + + + + Quetzal_QueryModel + + + query the model + Consultar el modelo + + + + Click objects to print infos + Cliquear objetos para imprimir información + + + + Quetzal_Raiseup + + + Raise-up the support + Eleva el soporte + + + + Raise the support to the pipe + Eleva el soporte hacia la tubería + + + + Quetzal_ReverseBeam + + + Reverse orientation + Invertir orientación + + + + Reverse the orientation of selected objects + Invertir orientación a los objetos seleccionados + + + + Quetzal_RotJoin + + + rotJoinEdge + Rotar arista de unión + + + + Rotates and align the beam according another edge + Rota y alinea la viga acorde a otra arista + + + + Quetzal_RotateWorkPlane + + + rotate Workplane + Rotar plano de trabajo + + + + Spin the Draft working plane about one of its axes + Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes + + + + Quetzal_SelectSolids + + + Select solids + Seleccionar solidos + + + + Grab all solids or those partially selected + to export in .step format + Sujeta todos los solidos parcialmente seleccionados +para exportar en formato step + + + + Quetzal_ShiftBeam + + + shiftTheBeam + Desplaza la viga + + + + Translate objects by vectors defined on existing geometry + Traslada el objeto por vectores definidos sobre la geometría existente + + + + Quetzal_SpinSect + + + Spin beams by 45 deg. + Gira viga a 45 grados. + + + + Rotates the section of the beam by 45 degrees + Rota la sección de la viga a 45 grados + + + + Quetzal_StretchBeam + + + stretchTheBeam + Estira la viga + + + + Changes the length of the beam, either according a preselected edge or a direct input + Cambia la longitud de la viga, ya sea acorde a la arista preseleccionada o una entrada directa + + + + Sketcher::SketchObject + + + pipeRoute + Ruta tubería + + + + Workbench + + + Dodo + Dodo + + + + Dodo workbench +(substitute of flamingo for Py3/Qt5) + Banco de trabajo Dodo +(sustituto de flamingo para Python3/Qt5) + + + + pypetools + Herramientas de tubería + + + + Frame tools + Herramientas para estructuras + + + + Pype tools + Herramientas para tuberías + + + + + Utils + Utilidades + + + + QkMenus + Menús QM + + + + Frames + Marcos + + + + Pypes + Tuberías + + + + breakForm + + + Break the pipes + Romper las tuberías + + + + Length + longitud + + + + <reference> + <referencia> + + + + PypeLine: + Linea de tubo: + + + + <none> + <ninguno> + + + + capQM + + + QM for caps + QM para tapones + + + + dpCalcDialog + + + + *** CUSTOM FLUID *** *** FLUIDO PERSONALIZADO *** @@ -1639,42 +2081,11 @@ profile elbowQM - + QM for elbows QM para codos - - extend - - - extendTheBeam - Extender la viga - - - - Extend the beam either to a face, a vertex or the c.o.m. of the selected object - Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado - - - - extend1intersection - - - - Extends pipe to intersection - Extender tubo a la interseccion - - - - extend2intersection - - - - Extends pipes to intersection - Extender tubos a la interseccion - - fObservers @@ -1739,7 +2150,7 @@ profile Adjust angle Transaction - Ajustar angulo + Ajustar ángulo @@ -1750,639 +2161,322 @@ profile rotJoin Transaction - Rotar union + Rotar unión flangeQM - + QM for flanges QM para bridas - - flat - - - Fit one elbow - Colocar un codo - - - - Place the elbow between two pipes or beams - Colocar un codo entre 2 tuberias o vigas - - - - frameIt - - - Place one-beam over one-edge - Coloca una viga sobre una arista - - - - Place one beam after the other over the edges - Coloca una viga despues de las otras aristas - - - - hackedL - - - draw a DWire - Dibuja un Dwire - - - - WP is re-positioned at each point. Possible to spin and offset it. - Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. - - - - insertAnyz - - - Insert any shape - Insertar cualquier forma - - - - Insert a STEP, IGES or BREP - Insertar un solido STEP, IGES, BREP - - - - insertBranch - - - Insert a branch - Insertar una derivación - - - - Insert a PypeBranch - Insertar una derivacion de tuberia - - insertBranchForm - + Insert a branch - Insertar una ramificacion + Insertar una ramificación - + <name> <nombre> - + <bend radius> - <radio de dobles> - - - - insertCap - - - - Insert a cap - Insertar un tapon + <radio de doblez> insertCapForm - + Insert caps Insertar tapones - + Reverse Invertir - + Apply Aplicar - - insertElbow - - - - Insert a curve - Insertar una curva - - insertElbowForm - + Insert elbows Insertar codos - + <bend angle> - <angulo de dobles> + <ángulo de doblez> - + <bend radius> - <radio de dobles> + <radio de doblez> - + Trim/Extend Cortar/Extender - + Reverse Invertir - + Apply Aplicar - + 0 deg 0 grados - + Wrong selection - Seleccion equivocada + Selección equivocada - + deg grados - - insertFlange - - - - Insert a flange - Insertar una brida - - insertFlangeForm - + Insert flanges Insertar bridas - + Reverse Invertir - + Apply Aplicar - - insertPath - - - insert Path - Insertar trayectoria - - - - Creates one path along selected edges - Crea una trayectoria a lo largo de la arista seleccionada - - - - insertPipe - - - - Insert a tube - Insertar un tubo - - insertPipeForm - + Insert pipes - Insertar tuberia + Insertar tubería - + <length> <Longitud> - + Reverse Invertir - - Apply - Aplicar - - - - insertPypeLine - - - PypeLine Manager - Gestor de tuberia de linea - - - - Open PypeLine Manager - Abre gestor de tuberia de linea + + Apply + Aplicar insertPypeLineForm - + PypeLine Manager - Gestor de linea de tubo + Gestor de línea de tubo - + <name> <nombre> - + Redraw Redibujar - + Part list Lista de parte - + Color Color - + Get Path Obtener trayectoria - + Get Profile Obtener perfil - + <new> <nuevo> - - insertReduct - - - - Insert a reduction - Insertar una reducción - - insertReductForm - + Insert reductions Insertar reducciones - + Reverse Invertir - + Apply Aplicar - + Eccentric - Excentrico - - - - insertRoute - - - Insert a pipe route - Insertar una ruta de tuberia - - - - Create a sketch attached to a circular edge - Crea un boceto adjunta a una aristar circular + Excéntrico insertRouteForm - + <select an edge> <seleccionar un borde> - - insertSection - - - Insert sections - Inserta secciones - - - - Creates customized beam profiles 2D - Crea un perfil de viga 2D personalizado - - - - insertTank - - - Insert a tank - Inserta un deposito - - - - Create tank and nozzles - Crea un deposito y boquillas - - insertTankForm - + doing combine Haciendo combinado - + files read leer archivos - + files not read no leer archivos - + listNozzles: %s Lista de boquillas: %s - - insertUbolt - - - - Insert a U-bolt - Insertar un tornillo U - - insertUboltForm - + Insert U-bolt Insertar tornillo U - + - no ref. face - Sin cara de referencia - + Ref. face Cara de referencia - + Head Cabecera - + Middle Medio - + Tail Cola - - insertValve - - - - Insert a valve - Insertar una valvula - - insertValveForm - + Insert valves - Insertar valvulas + Insertar válvulas - + Reverse Invertir - + Apply Aplicar - + Insert in pipe Insertar en tubo - - joinPype - - - Join pypes - Unir tuberias - - - - Select the part-pype and the port - Selecciona la pieza de tuberia y el puerto - - - - laydown - - - Lay-down the pipe - Empotra la tuberia - - - - Lay-down the pipe on the support plane - Empotra la tuberia sobre el plano de soporte - - - - levelBeam - - - Flush the surfaces - Empotrar las superficies - - - - Shift the beams to line-up the faces to the first selection (faces must be //) - Desplaza la viga para alinearla a la cara de la primera seleccion (caras deben ser paralelas) - - - - makeHeader - - - Connect to header - Conectar a la cabezera - - - Connect branches to one header pipe Branches and header's axes must be ortho - Conectar rama a una de las cabezeras de tubo; Ejes de ramificaciones y cabezeras deben ser ortogonales - - - - Connect branches to one header pipe -Branches and header's axes must be ortho - Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales - - - Connect branches to one header pipe - Branches and header's axes must be ortho - Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales - - makeframenbranch - + Travatura Estructura - - mateEdges - - - Mate pipes edges - Coincidir las aristas de las tuberias - - - - Mate two terminations through their edges - Coincidir dos terminaciones a traves de sus aristas - - mouseActionB1 - + ____TAIL ____COLA - - moveHandle - - - Move objects - Mover objetos - - - - Move quickly objects inside viewport - Mover objetos rapidamente dentro de la vista - - - - moveWorkPlane - - - align Workplane - Alinear plano de trabajo - - - - Moves and rotates the drafting workplane with points, edges and faces - Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras - - - - offsetWorkPlane - - - Offset Work Plane - Desplazar plano de trabajo - - - - Offset: - Desplazamiento: - - - - offset Workplane - Desfazar plano de trabajo - - - - Shifts the WP alongg its normal. - Desplaza el plano de trabajo a lo largo de su normal. - - pForms - + Offset Work Plane Desface de plano de trabajo - + Offset: Desface: @@ -2390,48 +2484,22 @@ Branches and header's axes must be ortho pipeQM - + QM for pipes - QM para tuberias - - - - pivotBeam - - - pivotTheBeam - Pivotea la viga - - - - Rotates the beam around an axis (edge or center-of-curvature) - Rota la viga alrededor de un eje (arista o centro de curvatura) - - - - point2point - - - draw a tube point-to-point - Dibuja un tubo de punto a punto - - - - Click on subsequent points. - Da clic en puntos subsecuentes. + QM para tuberías point2pointPipe - + Reset Reiniciar - + Move WP on click - Mover plano de trabajo al click + Mover plano de trabajo al clic @@ -2535,64 +2603,12 @@ Branches and header's axes must be ortho Acciones "%s" y "%s" eliminado - - queryModel - - - query the model - Consultar el modelo - - - - Click objects to print infos - Cliquear objetos para imprimir información - - - - raiseup - - - Raise-up the support - Eleva el soporte - - - - Raise the support to the pipe - Eleva el soporte hacia la tuberia - - - - reverseBeam - - - Reverse orientation - Invertir orientacion - - - - Reverse the orientation of selected objects - Invertir orientacion a los objetos seleccionados - - - - rotJoin - - - rotJoinEdge - Rotar arista de union - - - - Rotates and align the beam according another edge - Rota y alinea la viga acorde a otra arista - - rotWPForm Angle: - Angulo: + Ángulo: @@ -2600,80 +2616,13 @@ Branches and header's axes must be ortho Rotar plano de trabajo - - rotateWorkPlane - - - rotate Workplane - Rotar plano de trabajo - - - - Spin the Draft working plane about one of its axes - Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes - - - - selectSolids - - - Select solids - Seleccionar solidos - - - - Grab all solids or those partially selected - to export in .step format - Sujeta todos los solidos parcialmente seleccionados -para exportar en formato step - - - - shiftBeam - - - shiftTheBeam - Desplaza la viga - - - - Translate objects by vectors defined on existing geometry - Traslada el objeto por vectores definidos sobre la geometria existente - - - - spinSect - - - Spin beams by 45 deg. - Gira viga a 45 grados. - - - - Rotates the section of the beam by 45 degrees - Rota la seccion de la viga a 45 grados - - - - stretchBeam - - - stretchTheBeam - Estira la viga - - - - Changes the length of the beam, either according a preselected edge or a direct input - Cambia la longituf de la viga, ya sea acorde a la arista preseleccionada o una entrada directa - - uCmd Quick move Transaction - Movimiento rapido + Movimiento rápido @@ -2711,12 +2660,12 @@ para exportar en formato step (angle) - (angulo) + (ángulo) Rotation angle: - Angulo de rotacion: + Ángulo de rotación: @@ -2726,7 +2675,7 @@ para exportar en formato step Rotation axis: - Eje de rotacion: + Eje de rotación: @@ -2753,10 +2702,6 @@ para exportar en formato step Exit Salir - - Angle: - Angulo: - Rotate WP @@ -2766,9 +2711,9 @@ para exportar en formato step valveQM - + QM for valves - QM para valvulas + QM para válvulas
diff --git a/translationz/dodo_es-ES.qm b/translationz/dodo_es-ES.qm deleted file mode 100644 index 36dcad3a428520435897cd9da58ce00498732a69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45434 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 B`ab{w diff --git a/translationz/update_translation.sh b/translationz/update_translation.sh index 5873aec..6dce07e 100755 --- a/translationz/update_translation.sh +++ b/translationz/update_translation.sh @@ -97,7 +97,7 @@ LUPDATE=/usr/lib/qt6/bin/lupdate # from Qt6 # LUPDATE=lupdate # from Qt5 LRELEASE=/usr/lib/qt6/bin/lrelease # from Qt6 # LRELEASE=lrelease # from Qt5 -WB="dodo" +WB="Quetzal" # Enforce underscore on locales sed -i '3s/-/_/' ${WB}*.ts From 2f5ffc6eca6ef6c72768520fe0e4c4eb0698d598 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Tue, 22 Oct 2024 19:33:04 -0600 Subject: [PATCH 054/135] Create utility file to get paths --- InitGui.py | 132 +++++++++------------------------------------- pForms.py | 6 --- quetzal_config.py | 8 +++ 3 files changed, 33 insertions(+), 113 deletions(-) create mode 100644 quetzal_config.py diff --git a/InitGui.py b/InitGui.py index f8dcc3d..bf392c7 100644 --- a/InitGui.py +++ b/InitGui.py @@ -22,12 +22,32 @@ # * * # **************************************************************************** +import os +import sys + import FreeCAD import FreeCADGui from FreeCADGui import Workbench +Log = FreeCAD.Console.PrintLog +Msg = FreeCAD.Console.PrintMessage + + class dodo(Workbench): + def __init__(self): + from quetzal_config import TRANSLATIONSPATH, ICONPATH + + # Add translations path + FreeCADGui.addLanguagePath(TRANSLATIONSPATH) + FreeCADGui.updateLocale() + + self.__class__.MenuText = FreeCAD.Qt.translate("Workbench", "Dodo") + self.__class__.ToolTip = FreeCAD.Qt.translate( + "Workbench", "Dodo workbench \n(substitute of flamingo for Py3/Qt5)" + ) + self.__class__.Icon = os.path.join(ICONPATH, "dodo.svg") + try: import DraftSnap except Exception: @@ -43,115 +63,13 @@ class dodo(Workbench): FreeCAD.Console.PrintWarning( "Dodo is written for Py3 and Qt5\n You may experience mis-behaviuors\n" ) - Icon = """ -/* XPM */ -static char * dodo1_xpm[] = { -"98 98 2 1", -" c None", -". c #000000", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" .... ", -" ........ ", -" ........... ", -" ............. ", -" ............... ", -" ................. ", -" ..................... ", -" ......................... ", -" ............................. ", -" ................................ ", -" ................................ ", -" ................................. ", -" .................................. ", -" .................................. ", -" .................................. ", -" .................................. ", -" .................................. ", -" ................................. ", -" .......... .............. ", -" ...... ......... ........ ", -" ............ .......... ...... ", -" ................ .......... ", -" ................. .......... ", -" ................. ....... .......... ", -" .................. ................. ........... ", -" .................. ..................... ........... ", -" ........................................... ............ ", -" ............................................. ............. ", -" .............................................. ............. ", -" ................................................ .............. ", -" ................................................. ............... ", -" .................................................... ................. ", -" ....................................................................... ", -" ...................................................................... ", -" .................................................................... ", -" ................................................................ ", -" ............................................................... ", -" ................................................................ ", -" ................................................................ ", -" ................................................................ ", -" ................................................................ ", -" ................................................................. ", -" .................................................................. ", -" ................................................................. ", -" .................................................................. ", -" .................................................................. ", -" .................................................................. ", -" ................................................................... ", -" ................................................................... ", -" ................................................................... ", -" ................................................................ ", -" ............................................................... ", -" .............................................................. ", -" ............................................................. ", -" ............................................................ ", -" .......................................................... ", -" ......................................................... ", -" ....................................................... ", -" ...................................................... ", -" ................................................... ", -" .................................................. ", -" ............................................... ", -" ............................................. ", -" .......................................... ", -" ........................................ ", -" .................................... ", -" ................................ ", -" ............................ ", -" ......................... ", -" .................... ", -" .... ............ ", -" ... ... .. ", -" ... ... .... ", -" ... ................ ", -" ... .... ................. ", -" ... .................. ", -" ... .. ........ ", -" ... .... ..... ", -" .... .......... ....... ", -" ................... .... ", -" .................. . ", -" .... ....... ", -" ...... ", -" ...... ", -" ..... ", -" .. ", -" ", -" ", -" ", -" ", -" "}; -""" - MenuText = "Dodo WB" - ToolTip = "Dodo workbench \n(substitute of flamingo for Py3/Qt5)" def Initialize(self): + """ + This function is called at the first activation of the workbench, + here is the place to import all the commands. + """ + QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP import CUtils self.utilsList = [ diff --git a/pForms.py b/pForms.py index 655d969..c29395a 100644 --- a/pForms.py +++ b/pForms.py @@ -19,12 +19,6 @@ y = max(300, int(mw.height() / 3)) # 350 -def getLanguagePath(): - import os - notnormalized = os.path.join(os.path.dirname(__file__), "translationz") - return os.path.normpath(notnormalized) - - class redrawDialog(QDialog): def __init__(self): super(redrawDialog, self).__init__() diff --git a/quetzal_config.py b/quetzal_config.py new file mode 100644 index 0000000..2f42fd4 --- /dev/null +++ b/quetzal_config.py @@ -0,0 +1,8 @@ +import os + +__version__ = "1.1.0" + +_dir = os.path.dirname(__file__) +ICONPATH = os.path.join(_dir, "iconz") +TRANSLATIONSPATH = os.path.join(_dir, "translationz") +UIPATH = os.path.join(_dir, "dialogz") From f9e0d7081f712f822f4ebbf949e34c9b8d6acfb5 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Tue, 22 Oct 2024 19:58:14 -0600 Subject: [PATCH 055/135] Fix contexts of properties strings Regarding of the type of the property the context always is: "App::Property" --- fFeatures.py | 137 +++++++++++++++++++++++---------------------------- pFeatures.py | 18 +++---- 2 files changed, 70 insertions(+), 85 deletions(-) diff --git a/fFeatures.py b/fFeatures.py index 5657aaf..216f3c2 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -25,6 +25,7 @@ from PySide2.QtWidgets import QHBoxLayout from PySide2.QtWidgets import QVBoxLayout from PySide2.QtWidgets import QPushButton + # from DraftGui import translate from draftutils.translate import translate @@ -727,25 +728,19 @@ def addBeams(self): "App::PropertyFloat", "tailOffset", "FrameBranch", - QT_TRANSLATE_NOOP( - "App::PropertyFloat", "The extension of the tail" - ), + QT_TRANSLATE_NOOP("App::Property", "The extension of the tail"), ) beam.addProperty( "App::PropertyFloat", "headOffset", "FrameBranch", - QT_TRANSLATE_NOOP( - "App::PropertyFloat", "The extension of the head" - ), + QT_TRANSLATE_NOOP("App::Property", "The extension of the head"), ) beam.addProperty( "App::PropertyFloat", "spin", "FrameBranch", - QT_TRANSLATE_NOOP( - "App::PropertyFloat", "The rotation of the section" - ), + QT_TRANSLATE_NOOP("App::Property", "The rotation of the section"), ) if int(FreeCAD.Version()[1]) > 19: # 20220704 beam.addExtension("Part::AttachExtensionPython") @@ -903,13 +898,13 @@ def __init__(self, obj, section="IPE200", lab=None): "App::PropertyString", "FType", "FrameLine", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of frameFeature"), + QT_TRANSLATE_NOOP("App::Property", "Type of frameFeature"), ).FType = "FrameLine" obj.addProperty( "App::PropertyString", "FSize", "FrameLine", - QT_TRANSLATE_NOOP("App::PropertyString", "Size of frame"), + QT_TRANSLATE_NOOP("App::Property", "Size of frame"), ).FSize = section if lab: obj.Label = lab @@ -928,13 +923,13 @@ def __init__(self, obj, section="IPE200", lab=None): "App::PropertyLink", "Base", "FrameLine", - QT_TRANSLATE_NOOP("App::PropertyLink", "the edges"), + QT_TRANSLATE_NOOP("App::Property", "the edges"), ) obj.addProperty( "App::PropertyLink", "Profile", "FrameLine", - QT_TRANSLATE_NOOP("App::PropertyLink", "the profile"), + QT_TRANSLATE_NOOP("App::Property", "the profile"), ) def onChanged(self, fp, prop): @@ -995,25 +990,25 @@ def __init__(self, obj, base=None, profile=None): "App::PropertyString", "FType", "FrameBranch", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of frameFeature"), + QT_TRANSLATE_NOOP("App::Property", "Type of frameFeature"), ).FType = "FrameBranch" obj.addProperty( "App::PropertyStringList", "Beams", "FrameBranch", - QT_TRANSLATE_NOOP("App::PropertyStringList", "The beams names"), + QT_TRANSLATE_NOOP("App::Property", "The beams names"), ) obj.addProperty( "App::PropertyLink", "Base", "FrameBranch", - QT_TRANSLATE_NOOP("App::PropertyLink", "The path."), + QT_TRANSLATE_NOOP("App::Property", "The path."), ).Base = base obj.addProperty( "App::PropertyLink", "Profile", "FrameBranch", - QT_TRANSLATE_NOOP("App::PropertyLink", "The profile"), + QT_TRANSLATE_NOOP("App::Property", "The profile"), ).Profile = profile self.redraw(obj) @@ -1053,25 +1048,19 @@ def redraw(self, obj): "App::PropertyFloat", "tailOffset", "FrameBranch", - QT_TRANSLATE_NOOP( - "App::PropertyFloat", "The extension of the tail" - ), + QT_TRANSLATE_NOOP("App::Property", "The extension of the tail"), ) beam.addProperty( "App::PropertyFloat", "headOffset", "FrameBranch", - QT_TRANSLATE_NOOP( - "App::PropertyFloat", "The extension of the head" - ), + QT_TRANSLATE_NOOP("App::Property", "The extension of the head"), ) beam.addProperty( "App::PropertyFloat", "spin", "FrameBranch", - QT_TRANSLATE_NOOP( - "App::PropertyFloat", "The rotation of the section" - ), + QT_TRANSLATE_NOOP("App::Property", "The rotation of the section"), ) if int(FreeCAD.Version()[1]) > 19: # 20220704 beam.addExtension("Part::AttachExtensionPython") @@ -1299,33 +1288,31 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "RH" obj.addProperty( "App::PropertyLength", "W", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), ).W = profile[4] obj.addProperty( "App::PropertyLength", "H", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), ).H = profile[5] obj.addProperty( "App::PropertyLength", "t1", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness of the vertical sides"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of the vertical sides"), ).t1 = profile[6] obj.addProperty( "App::PropertyLength", "t2", "Draft", - QT_TRANSLATE_NOOP( - "App::PropertyLength", "Thickness of the horizontal sides" - ), + QT_TRANSLATE_NOOP("App::Property", "Thickness of the horizontal sides"), ).t2 = profile[7] _Profile.__init__(self, obj, profile) @@ -1352,19 +1339,19 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "R" obj.addProperty( "App::PropertyLength", "W", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), ).W = profile[4] obj.addProperty( "App::PropertyLength", "H", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), ).H = profile[5] _Profile.__init__(self, obj, profile) @@ -1389,19 +1376,19 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "circle" obj.addProperty( "App::PropertyLength", "D", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Diameter of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Diameter of the beam"), ).D = profile[4] obj.addProperty( "App::PropertyLength", "t1", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness"), + QT_TRANSLATE_NOOP("App::Property", "Thickness"), ).t1 = profile[5] _Profile.__init__(self, obj, profile) @@ -1423,31 +1410,31 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "L" obj.addProperty( "App::PropertyLength", "W", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), ).W = profile[4] obj.addProperty( "App::PropertyLength", "H", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), ).H = profile[5] obj.addProperty( "App::PropertyLength", "t1", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness of the webs"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of the webs"), ).t1 = profile[6] obj.addProperty( "App::PropertyLength", "t2", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness of the webs"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of the webs"), ).t2 = profile[7] _Profile.__init__(self, obj, profile) @@ -1464,31 +1451,31 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "T" obj.addProperty( "App::PropertyLength", "W", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), ).W = profile[4] obj.addProperty( "App::PropertyLength", "H", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), ).H = profile[5] obj.addProperty( "App::PropertyLength", "t1", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness of the web"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of the web"), ).t1 = profile[6] obj.addProperty( "App::PropertyLength", "t2", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness of the web"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of the web"), ).t2 = profile[7] _Profile.__init__(self, obj, profile) @@ -1505,31 +1492,31 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "Z" obj.addProperty( "App::PropertyLength", "W", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), ).W = profile[5] obj.addProperty( "App::PropertyLength", "H", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), ).H = profile[4] obj.addProperty( "App::PropertyLength", "t1", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness of the web"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of the web"), ).t1 = profile[6] obj.addProperty( "App::PropertyLength", "t2", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness of the flanges"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of the flanges"), ).t2 = profile[7] _Profile.__init__(self, obj, profile) @@ -1546,43 +1533,43 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "omega" obj.addProperty( "App::PropertyLength", "W", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), ).W = profile[4] obj.addProperty( "App::PropertyLength", "H", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), ).H = profile[5] obj.addProperty( "App::PropertyLength", "D", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the flanges"), + QT_TRANSLATE_NOOP("App::Property", "Width of the flanges"), ).D = profile[6] obj.addProperty( "App::PropertyLength", "t1", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 1"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 1"), ).t1 = profile[7] obj.addProperty( "App::PropertyLength", "t2", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 2"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 2"), ).t2 = profile[8] obj.addProperty( "App::PropertyLength", "t3", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 3"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 3"), ).t3 = profile[9] _Profile.__init__(self, obj, profile) @@ -1606,43 +1593,43 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "H" obj.addProperty( "App::PropertyLength", "W", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the bottom flange"), + QT_TRANSLATE_NOOP("App::Property", "Width of the bottom flange"), ).W = profile[4] obj.addProperty( "App::PropertyLength", "H", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), ).H = profile[5] obj.addProperty( "App::PropertyLength", "D", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the top flange"), + QT_TRANSLATE_NOOP("App::Property", "Width of the top flange"), ).D = profile[6] obj.addProperty( "App::PropertyLength", "t1", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 1"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 1"), ).t1 = profile[7] obj.addProperty( "App::PropertyLength", "t2", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 2"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 2"), ).t2 = profile[8] obj.addProperty( "App::PropertyLength", "t3", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 3"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 3"), ).t3 = profile[9] _Profile.__init__(self, obj, profile) @@ -1666,43 +1653,43 @@ def __init__(self, obj, profile): "App::PropertyString", "FType", "Profile", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of section"), + QT_TRANSLATE_NOOP("App::Property", "Type of section"), ).FType = "U" obj.addProperty( "App::PropertyLength", "W", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the bottom flange"), + QT_TRANSLATE_NOOP("App::Property", "Width of the bottom flange"), ).W = profile[4] obj.addProperty( "App::PropertyLength", "H", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Height of the beam"), + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), ).H = profile[5] obj.addProperty( "App::PropertyLength", "D", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Width of the top flange"), + QT_TRANSLATE_NOOP("App::Property", "Width of the top flange"), ).D = profile[6] obj.addProperty( "App::PropertyLength", "t1", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 1"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 1"), ).t1 = profile[7] obj.addProperty( "App::PropertyLength", "t2", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 2"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 2"), ).t2 = profile[8] obj.addProperty( "App::PropertyLength", "t3", "Draft", - QT_TRANSLATE_NOOP("App::PropertyLength", "Thickness 3"), + QT_TRANSLATE_NOOP("App::Property", "Thickness 3"), ).t3 = profile[9] _Profile.__init__(self, obj, profile) diff --git a/pFeatures.py b/pFeatures.py index e62fa41..bbb64dc 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -28,26 +28,26 @@ def __init__(self, obj): "App::PropertyString", "PType", "PBase", - QT_TRANSLATE_NOOP("App::PropertyString", "Type of tubeFeature"), + QT_TRANSLATE_NOOP("App::Property", "Type of tubeFeature"), ).PType obj.addProperty( "App::PropertyString", "PRating", "PBase", - QT_TRANSLATE_NOOP("App::PropertyString", "Rating of pipeFeature"), + QT_TRANSLATE_NOOP("App::Property", "Rating of pipeFeature"), ).PRating obj.addProperty( "App::PropertyString", "PSize", "PBase", - QT_TRANSLATE_NOOP("App::PropertyString", "Nominal diameter"), + QT_TRANSLATE_NOOP("App::Property", "Nominal diameter"), ).PSize obj.addProperty( "App::PropertyVectorList", "Ports", "PBase", QT_TRANSLATE_NOOP( - "App::PropertyVectorList", + "App::Property", "Ports position relative to the origin of Shape", ), ) @@ -55,7 +55,7 @@ def __init__(self, obj): "App::PropertyFloat", "Kv", "PBase", - QT_TRANSLATE_NOOP("App::PropertyFloat", "Flow factor (m3/h/bar)"), + QT_TRANSLATE_NOOP("App::Property", "Flow factor (m3/h/bar)"), ).Kv if int(FreeCAD.Version()[1]) > 19: obj.addExtension("Part::AttachExtensionPython") @@ -879,9 +879,7 @@ def __init__(self, obj, DN="DN50", ClampType="DIN-UBolt", C=76, H=109, d=10): "App::PropertyVectorList", "Ports", "PBase", - QT_TRANSLATE_NOOP( - "App::Property", "Ports position relative to the origin of Shape" - ), + QT_TRANSLATE_NOOP("App::Property", "Ports position relative to the origin of Shape"), ) def onChanged(self, fp, prop): @@ -1104,13 +1102,13 @@ def __init__( "App::PropertyLength", "OD", "PypeBranch", - QT_TRANSLATE_NOOP("App::PropertyLength", "Outside diameter"), + QT_TRANSLATE_NOOP("App::Property", "Outside diameter"), ).OD = OD obj.addProperty( "App::PropertyLength", "thk", "PypeBranch", - QT_TRANSLATE_NOOP("App::PropertyLength", "Wall thickness"), + QT_TRANSLATE_NOOP("App::Property", "Wall thickness"), ).thk = thk if not BR: BR = 0.75 * OD From af67cf0ca47543567009a358ed328a6700c0d789 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Tue, 22 Oct 2024 21:01:29 -0600 Subject: [PATCH 056/135] Createcutlist to toolist & package.xml minor update --- InitGui.py | 3 ++- package.xml | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/InitGui.py b/InitGui.py index bf392c7..6dd8276 100644 --- a/InitGui.py +++ b/InitGui.py @@ -85,7 +85,7 @@ def Initialize(self): self.appendToolbar("Utils", self.utilsList) Log("Loading Utils: done\n") import CFrame - + from cut_list.cut_list_commands import cutListCommand self.frameList = [ "Quetzal_FrameIt", "Quetzal_FrameBranchManager", @@ -102,6 +102,7 @@ def Initialize(self): "Quetzal_Extend", "Quetzal_AdjustFrameAngle", "Quetzal_InsertPath", + "Quetzal_CreateCutList", ] self.appendToolbar("frameTools", self.frameList) Log("Loading Frame tools: done\n") diff --git a/package.xml b/package.xml index 40a2c15..bb1f18c 100644 --- a/package.xml +++ b/package.xml @@ -1,7 +1,7 @@ - Dodo + Dodo_Quetzal A set of commands and objects that help to speed-up the drawing of frames and pipelines. Py3/Qt5 port of flamingo. @@ -13,11 +13,11 @@ LGPL-3.0-or-later - https://github.com/oddtopus/dodo + https://github.com/EdgarJRobles/dodo - https://github.com/oddtopus/dodo/issues + https://github.com/EdgarJRobles/dodo/issues - https://github.com/oddtopus/dodo/blob/master/README.md + https://github.com/EdgarJRobles/dodo/blob/master/README.md https://wiki.freecad.org/Dodo_Workbench From 15ad8ce0d95ff7af648fae5dfee9c9636a8de34f Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Tue, 22 Oct 2024 21:13:11 -0600 Subject: [PATCH 057/135] Update README.md --- README.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index e1f377c..a82e0f1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Dodo Workbench +# Quetzal Workbench [![Contributions welcome][ContribsW_badge]][ContribsW] [![license][license_badge]][license] @@ -7,21 +7,19 @@ [![Code style: black][black_badge]][black] [![GitHub Tag][tag_bagde]][tag] -Dodo is the port of "Flamingo tools" for Py3/Qt5 builds of [FreeCAD](https://freecad.org). -While providing basically the same features of flamingo and being compatible with -its feature-pythons, it is also a general review of the instruments and interface. - -![screenshot1](https://www.freecadweb.org/wiki/images/8/85/FlamingoBlob.png) +Quetzal is the fork of Dodo workbench for [FreeCAD](https://freecad.org). +Extending Dodo workbench support & adding translation support. +![screenshot1](https://github.com/user-attachments/assets/70e96920-34db-40d9-a8d6-102e690a13ee) ## Installation ### Automatic Installation -The recommended way to install FreeGrid is via FreeCAD's +The recommended way to install Quetzal is via FreeCAD's [Addon Manager](https://wiki.freecad.org/Std_AddonMgr) under `Tools > Addon Manager` dropdown menu. -Search for **FreeGrid** in the workbench category. +Search for **Quetzal** in the workbench category. ### Manual installation @@ -43,7 +41,7 @@ Examples on different OS Use the CLI to enter the `Mod` directory and use Git to install Dodo: ```shell -git clone https://github.com/oddtopus/dodo Dodo +git clone https://github.com/EdgarJRobles/dodo Quetzal ``` If you are updating the code, restarting FreeCAD is advised. From 702f2111541a9b2d03952cfdd7cbacf572e8b3a8 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Tue, 22 Oct 2024 21:18:02 -0600 Subject: [PATCH 058/135] Update URL on badges --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a82e0f1..0a876b4 100644 --- a/README.md +++ b/README.md @@ -65,12 +65,12 @@ Discussion in the FreeCAD Forum: [ContribsW]: ./CONTRIBUTING.md [ContribsW_badge]: [license]: ./LICENSE -[license_badge]: +[license_badge]: [AddonMgr]: [AddonMgr_badge]: [pre-commit]: [pre-commit_badge]: [black]: [black_badge]: -[tag]: -[tag_bagde]: +[tag]: +[tag_bagde]: From ad38f46292c85f6424617a2ec08a3a7990b5ffbe Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Tue, 22 Oct 2024 21:40:48 -0600 Subject: [PATCH 059/135] remove pyrightconfig.json from repository on gitignore --- .gitignore | 1 + pyrightconfig.json | 41 ----------------------------------------- 2 files changed, 1 insertion(+), 41 deletions(-) delete mode 100644 pyrightconfig.json diff --git a/.gitignore b/.gitignore index 11df72b..c0f005f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ test_**.sh __pycache__/ cut_list/__pycache__/ +pyrightconfig.json diff --git a/pyrightconfig.json b/pyrightconfig.json deleted file mode 100644 index 69d4389..0000000 --- a/pyrightconfig.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "include": [ - "iconz", - "dialogz", - "shapez", - "tablez", - ], - - "exclude": [ - ], - - "ignore": [ - ], - - "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/FreeCAD-stubs", - "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/FreeCADGui-stubs", - - "defineConstant": { - "DEBUG": true - }, - - "reportMissingImports": "error", - "reportMissingTypeStubs": false, - - "pythonVersion": "3.10", - "pythonPlatform": "Linux", - - "executionEnvironments": [ - { - "root": ".", - "extraPaths": [ - "/home/edgar/.platformio/penv/lib/python3.12/site-packages", - "/usr/local/Mod/Part", - "/usr/local/Mod/Draft", - "/usr/local/Mod/BIM", - "/usr/local/lib", - "/usr/local/Ext/PySide", - ] - }, - ] -} From 52a1c77761a152dea948878864069031ed78dc34 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Tue, 22 Oct 2024 22:03:59 -0600 Subject: [PATCH 060/135] extend RH profile csv file --- tablez/Section_RH.csv | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tablez/Section_RH.csv b/tablez/Section_RH.csv index 7ad1fe9..4aaed9e 100644 --- a/tablez/Section_RH.csv +++ b/tablez/Section_RH.csv @@ -1,3 +1,24 @@ SSize;stype;H;W;ta;tf +RH20x10x1.5;RH;20;10;1.5;1.5 +RH30x10x1.2;RH;30;10;1.2;1.2 +RH30x10x1.5;RH;30;10;1.5;1.5 +RH30x15x1.2;RH;30;15;1.2;1.2 +RH30x15x1.5;RH;30;15;1.5;1.5 +RH30x20x1.2;RH;30;20;1.2;1.2 +RH30x20x1.5;RH;30;20;1.5;1.5 +RH40x15x1.5;RH;40;15;1.5;1.5 +RH40x20x1.2;RH;40;20;1.2;1.2 +RH40x20x1.5;RH;40;20;1.5;1.5 +RH40x20x2;RH;40;20;2;2 RH40x40x5;RH;40;40;5;5 +RH50x25x1.2;RH;50;25;1.2;1.2 +RH50x25x1.5;RH;50;25;1.5;1.5 +RH50x25x2;RH;50;25;2;2 +RH50x25x3;RH;50;25;3;3 +RH50x30x1.5;RH;50;30;1.5;1.5 +RH50x30x3;RH;50;30;3;3 RH50x50x5;RH;50;50;5;5 +RH60x20x1.5;RH;60;20;1.5;1.5 +RH60x20x2;RH;60;20;2;2 +RH60x30x1.2;RH;60;30;1.2;1.2 +RH60x30x2;RH;60;30;2;2 From a8702ddd13358e1765fc2decae6c6a7f60a5b2d2 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 23 Oct 2024 09:47:49 -0600 Subject: [PATCH 061/135] Remove print statements --- InitGui.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/InitGui.py b/InitGui.py index 6dd8276..4c81dc1 100644 --- a/InitGui.py +++ b/InitGui.py @@ -36,7 +36,7 @@ class dodo(Workbench): def __init__(self): - from quetzal_config import TRANSLATIONSPATH, ICONPATH + from quetzal_config import TRANSLATIONSPATH, ICONPATH # Add translations path FreeCADGui.addLanguagePath(TRANSLATIONSPATH) @@ -53,10 +53,8 @@ def __init__(self): except Exception: import draftguitools.gui_snapper as DraftSnap - print("flag") # patch if not hasattr(FreeCADGui, "Snapper"): FreeCADGui.Snapper = DraftSnap.Snapper() - print("flag2") # patch v = sys.version_info[0] if v < 3: @@ -86,6 +84,7 @@ def Initialize(self): Log("Loading Utils: done\n") import CFrame from cut_list.cut_list_commands import cutListCommand + self.frameList = [ "Quetzal_FrameIt", "Quetzal_FrameBranchManager", From a285f18459f485afed2382b5321bc067ba9ccb41 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 23 Oct 2024 12:15:07 -0600 Subject: [PATCH 062/135] Rename workbench --- InitGui.py | 14 ++++++++------ package.xml | 4 ++-- translationz/README.md | 16 ++++++++-------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/InitGui.py b/InitGui.py index 4c81dc1..cb3446e 100644 --- a/InitGui.py +++ b/InitGui.py @@ -34,7 +34,7 @@ Msg = FreeCAD.Console.PrintMessage -class dodo(Workbench): +class QuetzalWorkbench(Workbench): def __init__(self): from quetzal_config import TRANSLATIONSPATH, ICONPATH @@ -42,9 +42,11 @@ def __init__(self): FreeCADGui.addLanguagePath(TRANSLATIONSPATH) FreeCADGui.updateLocale() - self.__class__.MenuText = FreeCAD.Qt.translate("Workbench", "Dodo") + self.__class__.MenuText = FreeCAD.Qt.translate("Workbench", "Quetzal") self.__class__.ToolTip = FreeCAD.Qt.translate( - "Workbench", "Dodo workbench \n(substitute of flamingo for Py3/Qt5)" + "Workbench", + "Quetzal is the fork of Dodo workbench for FreeCAD. " + "Extending Dodo workbench support and adding translation support. ", ) self.__class__.Icon = os.path.join(ICONPATH, "dodo.svg") @@ -59,7 +61,7 @@ def __init__(self): v = sys.version_info[0] if v < 3: FreeCAD.Console.PrintWarning( - "Dodo is written for Py3 and Qt5\n You may experience mis-behaviuors\n" + "Quetzal is written for Py3 and Qt5\n You may experience mis-behaviuors\n" ) def Initialize(self): @@ -139,7 +141,7 @@ def Initialize(self): self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "Frame tools"), self.frameList) self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "Pype tools"), self.pypeList) self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "Utils"), self.utilsList) - self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "QkMenus"), self.qm) + self.appendMenu(QT_TRANSLATE_NOOP("Workbench", "QM Menus"), self.qm) def ContextMenu(self, recipient): QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP @@ -181,4 +183,4 @@ def Deactivated(self): # Msg("dodo deactivated()\n") -FreeCADGui.addWorkbench(dodo) +FreeCADGui.addWorkbench(QuetzalWorkbench) diff --git a/package.xml b/package.xml index bb1f18c..0912c67 100644 --- a/package.xml +++ b/package.xml @@ -1,7 +1,7 @@ - Dodo_Quetzal + Quetzal A set of commands and objects that help to speed-up the drawing of frames and pipelines. Py3/Qt5 port of flamingo. @@ -29,7 +29,7 @@ - dodo + QuetzalWorkbench ./ diff --git a/translationz/README.md b/translationz/README.md index 207b278..874d4ad 100644 --- a/translationz/README.md +++ b/translationz/README.md @@ -1,4 +1,4 @@ -# About translating Dodo Workbench +# About translating Quetzal Workbench > [!NOTE] > All commands **must** be run in `./translationz/` directory. @@ -17,13 +17,13 @@ To update the template file from source files you should use this command: ``` Once done you can commit the changes and upload the new file to CrowdIn platform -at webpage and find the **Dodo** project. +at webpage and find the **Quetzal** project. ## Creating file for missing locale ### Using script -To create a file for a new language with all **Dodo** translatable strings execute +To create a file for a new language with all **Quetzal** translatable strings execute the script with `-u` flag plus your locale: ```shell @@ -32,8 +32,8 @@ the script with `-u` flag plus your locale: ### Renaming file -Also you can rename new `Dodo.ts` file by appending the locale code, -for example, `Dodo_es-ES.ts` for Spanish (Spain) and change +Also you can rename new `Quetzal.ts` file by appending the locale code, +for example, `Quetzal_es-ES.ts` for Spanish (Spain) and change ```xml @@ -71,7 +71,7 @@ package or in a text editor like `xed`, `mousepad`, `gedit`, `nano`, `vim`/`nvim Alternatively you can visit the **FreeCAD-addons** project on CrowdIn platform at webpage and find your language, -once done, look for the **Dodo** project. +once done, look for the **Quetzal** project. ## Compiling translations @@ -92,10 +92,10 @@ This will update the `.qm` file for your language (Spanish (Spain) in this case) ## Sending translations -Now you can contribute your translated `.ts` file to **Dodo** repository, +Now you can contribute your translated `.ts` file to **Quetzal** repository, also include the `.qm` file. - + ## More information From f72a957f6f159b91191f05c60cc872d8c8b984d5 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 23 Oct 2024 13:06:06 -0600 Subject: [PATCH 063/135] Don't translate objects' internal name The procedure for translation should be to translate the string that is assigned to the label: `obj.Label` --- pCmd.py | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/pCmd.py b/pCmd.py index 68dcddc..0a728fd 100644 --- a/pCmd.py +++ b/pCmd.py @@ -132,9 +132,7 @@ def portsDir(o): def simpleSurfBend(path=None, profile=None): "select the centerline and the O.D. and let it sweep" - curva = FreeCAD.activeDocument().addObject( - "Part::Feature", translate("Part::Feature", "Simple curve") - ) + curva = FreeCAD.activeDocument().addObject("Part::Feature", "Simple curve") if path == None or profile == None: curva.Shape = Part.makeSweepSurface(*fCmd.edges()[:2]) elif path.ShapeType == profile.ShapeType == "Edge": @@ -158,9 +156,7 @@ def makePipe(propList=[], pos=None, Z=None): pos = FreeCAD.Vector(0, 0, 0) if Z == None: Z = FreeCAD.Vector(0, 0, 1) - a = FreeCAD.ActiveDocument.addObject( - "Part::FeaturePython", translate("Part::FeaturePython", "Tube") - ) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Tube") if len(propList) == 4: pFeatures.Pipe(a, *propList) else: @@ -248,9 +244,7 @@ def makeElbow(propList=[], pos=None, Z=None): pos = FreeCAD.Vector(0, 0, 0) if Z == None: Z = FreeCAD.Vector(0, 0, 1) - a = FreeCAD.ActiveDocument.addObject( - "Part::FeaturePython", translate("Part::FeaturePython", "Elbow") - ) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Elbow") if len(propList) == 5: pFeatures.Elbow(a, *propList) else: @@ -437,9 +431,7 @@ def makeFlange(propList=[], pos=None, Z=None): pos = FreeCAD.Vector(0, 0, 0) if Z == None: Z = FreeCAD.Vector(0, 0, 1) - a = FreeCAD.ActiveDocument.addObject( - "Part::FeaturePython", translate("Part::FeaturePython", "Flange") - ) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Flange") if len(propList) >= 8: pFeatures.Flange(a, *propList) else: @@ -537,9 +529,7 @@ def makeReduct(propList=[], pos=None, Z=None, conc=True): pos = FreeCAD.Vector(0, 0, 0) if Z == None: Z = FreeCAD.Vector(0, 0, 1) - a = FreeCAD.ActiveDocument.addObject( - "Part::FeaturePython", translate("Part::FeaturePython", "Reduction") - ) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Reduction") propList.append(conc) pFeatures.Reduct(a, *propList) a.ViewObject.Proxy = 0 @@ -566,9 +556,7 @@ def makeUbolt(propList=[], pos=None, Z=None): pos = FreeCAD.Vector(0, 0, 0) if Z == None: Z = FreeCAD.Vector(0, 0, 1) - a = FreeCAD.ActiveDocument.addObject( - "Part::FeaturePython", translate("Part::FeaturePython", "U-Bolt") - ) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "U-Bolt") if len(propList) == 5: pFeatures.Ubolt(a, *propList) else: @@ -589,9 +577,7 @@ def makeShell(L=1000, W=1500, H=1500, thk1=6, thk2=8): H(eight): default=500 thk (thickness): default=6 """ - a = FreeCAD.ActiveDocument.addObject( - "Part::FeaturePython", translate("Part::FeaturePython", "Tank") - ) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Tank") pFeatures.Shell(a, L, W, H, thk1, thk2) a.ViewObject.Proxy = 0 a.Placement.Base = FreeCAD.Vector(0, 0, 0) @@ -617,9 +603,7 @@ def makeCap(propList=[], pos=None, Z=None): pos = FreeCAD.Vector(0, 0, 0) if Z == None: Z = FreeCAD.Vector(0, 0, 1) - a = FreeCAD.ActiveDocument.addObject( - "Part::FeaturePython", translate("Part::FeaturePython", "Cap") - ) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Cap") if len(propList) == 3: pFeatures.Cap(a, *propList) else: @@ -1247,9 +1231,7 @@ def makeValve(propList=[], pos=None, Z=None): pos = FreeCAD.Vector(0, 0, 0) if Z == None: Z = FreeCAD.Vector(0, 0, 1) - a = FreeCAD.ActiveDocument.addObject( - "Part::FeaturePython", translate("Part::FeaturePython", "Valve") - ) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Valve") if len(propList): pFeatures.Valve(a, *propList) else: @@ -1441,9 +1423,7 @@ def makeNozzle(DN="DN50", H=200, OD=60.3, thk=3, D=160, d=62, df=132, f=14, t=15 def makeRoute(n=Z): curvedEdges = [e for e in fCmd.edges() if e.curvatureAt(0) != 0] if curvedEdges: - s = FreeCAD.ActiveDocument.addObject( - "Sketcher::SketchObject", translate("Sketcher::SketchObject", "pipeRoute") - ) + s = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject", "pipeRoute") s.MapMode = "SectionOfRevolution" sup = fCmd.edgeName() s.Support = [sup] From 1b6075cf7019ff723e4f09d12fb8114bcb119a18 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 23 Oct 2024 15:22:36 -0600 Subject: [PATCH 064/135] Make FreeCAD version check work with 1.0 version Instead of making a comparison with int variable, a comparison with float works fine. --- fFeatures.py | 3 ++- pFeatures.py | 7 ++++--- quetzal_config.py | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/fFeatures.py b/fFeatures.py index 216f3c2..4dcab2c 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -14,6 +14,7 @@ from os import listdir from os.path import join, dirname, abspath from math import degrees +from quetzal_config import FREECADVERSION from uCmd import label3D from PySide2.QtCore import QT_TRANSLATE_NOOP from PySide2.QtWidgets import QDialog @@ -742,7 +743,7 @@ def addBeams(self): "FrameBranch", QT_TRANSLATE_NOOP("App::Property", "The rotation of the section"), ) - if int(FreeCAD.Version()[1]) > 19: # 20220704 + if FREECADVERSION > 0.19: # 20220704 beam.addExtension("Part::AttachExtensionPython") else: beam.addExtension("Part::AttachExtensionPython", beam) diff --git a/pFeatures.py b/pFeatures.py index bbb64dc..40dc490 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -12,6 +12,7 @@ from os.path import join, dirname, abspath from PySide.QtCore import QT_TRANSLATE_NOOP from DraftGui import translate +from quetzal_config import FREECADVERSION vO = FreeCAD.Vector(0, 0, 0) vX = FreeCAD.Vector(1, 0, 0) @@ -57,7 +58,7 @@ def __init__(self, obj): "PBase", QT_TRANSLATE_NOOP("App::Property", "Flow factor (m3/h/bar)"), ).Kv - if int(FreeCAD.Version()[1]) > 19: + if FREECADVERSION > 0.19: obj.addExtension("Part::AttachExtensionPython") else: obj.addExtension("Part::AttachExtensionPython", obj) # 20220704 @@ -982,7 +983,7 @@ def execute(self, fp): class ViewProviderPypeBranch: def __init__(self, vobj): vobj.Proxy = self - if int(FreeCAD.Version()[1]) > 19: + if FREECADVERSION > 0.19: vobj.addExtension("Gui::ViewProviderGroupExtensionPython") else: vobj.addExtension("Gui::ViewProviderGroupExtensionPython", self) # 20220704 @@ -1094,7 +1095,7 @@ def __init__( obj.PSize = DN obj.PRating = PRating # define specific properties - if int(FreeCAD.Version()[1]) > 19: + if FREECADVERSION > 0.19: obj.addExtension("App::GroupExtensionPython") else: obj.addExtension("App::GroupExtensionPython", obj) # 20220704 diff --git a/quetzal_config.py b/quetzal_config.py index 2f42fd4..8f85dc7 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -1,4 +1,5 @@ import os +import FreeCAD __version__ = "1.1.0" @@ -6,3 +7,5 @@ ICONPATH = os.path.join(_dir, "iconz") TRANSLATIONSPATH = os.path.join(_dir, "translationz") UIPATH = os.path.join(_dir, "dialogz") + +FREECADVERSION = float(FreeCAD.Version()[0] + "." + FreeCAD.Version()[1]) From 8074219f91d2950f192a8a017bd468f3159fb420 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 23 Oct 2024 18:46:59 -0600 Subject: [PATCH 065/135] Use translate functions from `FreeCAD.Qt`, reorganize imports Used "code actions" --- CFrame.py | 10 ++++-- CPipe.py | 10 ++++-- CUtils.py | 11 +++++-- cut_list/cut_list_commands.py | 3 +- dodoDialogs.py | 14 +++++--- dodoPM.py | 10 ++++-- fFeatures.py | 61 ++++++++++++++++------------------- fForms.py | 17 ++++++---- fObservers.py | 8 +++-- pCmd.py | 5 +-- pFeatures.py | 16 ++++++--- pForms.py | 23 ++++++++----- uCmd.py | 17 +++++++--- uForms.py | 8 +++-- 14 files changed, 132 insertions(+), 81 deletions(-) diff --git a/CFrame.py b/CFrame.py index d51bc40..a6154fe 100644 --- a/CFrame.py +++ b/CFrame.py @@ -6,9 +6,13 @@ __license__="LGPL 3" # import FreeCAD modules -import FreeCAD, FreeCADGui, inspect, os -from PySide.QtCore import QT_TRANSLATE_NOOP -from DraftGui import translate +import FreeCAD +import FreeCADGui +import inspect +import os + +QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP +translate = FreeCAD.Qt.translate # helper ------------------------------------------------------------------- # FreeCAD TemplatePyMod module diff --git a/CPipe.py b/CPipe.py index e822ce7..9bfa02e 100644 --- a/CPipe.py +++ b/CPipe.py @@ -6,9 +6,13 @@ __license__ = "LGPL 3" # import FreeCAD modules -import FreeCAD, FreeCADGui, inspect, os -from PySide.QtCore import QT_TRANSLATE_NOOP -from DraftGui import translate +import FreeCAD +import FreeCADGui +import inspect +import os + +QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP +translate = FreeCAD.Qt.translate # helper ------------------------------------------------------------------- # FreeCAD TemplatePyMod module # (c) 2007 Juergen Riegel LGPL diff --git a/CUtils.py b/CUtils.py index cd0a71b..7b4dd24 100644 --- a/CUtils.py +++ b/CUtils.py @@ -3,8 +3,12 @@ __license__ = "LGPL 3" # import FreeCAD modules -import FreeCAD, FreeCADGui, inspect, os -from PySide.QtCore import QT_TRANSLATE_NOOP +import FreeCAD +import FreeCADGui +import inspect +import os + +QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP # helper ------------------------------------------------------------------- # FreeCAD TemplatePyMod module @@ -110,7 +114,8 @@ def Activated(self): FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s ) from PySide.QtGui import QInputDialog as qid - from DraftGui import translate + + translate = FreeCAD.Qt.translate offset = qid.getInt( None, diff --git a/cut_list/cut_list_commands.py b/cut_list/cut_list_commands.py index 0551826..caccc0c 100644 --- a/cut_list/cut_list_commands.py +++ b/cut_list/cut_list_commands.py @@ -2,7 +2,8 @@ import FreeCAD import FreeCADGui -from PySide.QtCore import QT_TRANSLATE_NOOP + +QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP from . import RESOURCE_PATH, cut_list_ui diff --git a/dodoDialogs.py b/dodoDialogs.py index 047c458..0f8a9e8 100644 --- a/dodoDialogs.py +++ b/dodoDialogs.py @@ -1,10 +1,14 @@ +import csv +from os import listdir +from os.path import abspath, dirname, join +from sys import platform + +import FreeCAD +import FreeCADGui from PySide.QtCore import * from PySide.QtGui import * -from sys import platform -from os.path import join, dirname, abspath -from os import listdir -import FreeCAD, FreeCADGui, csv -from DraftGui import translate + +translate = FreeCAD.Qt.translate class protoTypeDialog(object): diff --git a/dodoPM.py b/dodoPM.py index 9396016..5b4aa06 100644 --- a/dodoPM.py +++ b/dodoPM.py @@ -6,12 +6,18 @@ # Copyright (C) 2015,2016 looo @ FreeCAD # Copyright (C) 2015 microelly -import FreeCAD, FreeCADGui, math, platform, csv, pCmd +import FreeCAD +import FreeCADGui +import math +import platform +import csv +import pCmd from PySide import QtCore from PySide import QtGui from os.path import join, dirname, abspath from os import listdir -from DraftGui import translate + +translate = FreeCAD.Qt.translate # definition of style styleButton = """ diff --git a/fFeatures.py b/fFeatures.py index 4dcab2c..f8a1f43 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -5,30 +5,38 @@ __url__ = "github.com/oddtopus/dodo" __license__ = "LGPL 3" -import FreeCAD, FreeCADGui, Part, csv, fCmd, pCmd, ArchProfile -from Arch import makeStructure -from Arch import makeProfile +import csv +from math import degrees +from os import listdir +from os.path import abspath, dirname, join + +import ArchProfile +import FreeCAD +import FreeCADGui +import Part +from Arch import makeProfile, makeStructure from Draft import makeCircle from PySide2.QtCore import * from PySide2.QtGui import * -from os import listdir -from os.path import join, dirname, abspath -from math import degrees +from PySide2.QtWidgets import ( + QCheckBox, + QComboBox, + QDialog, + QHBoxLayout, + QLabel, + QListWidget, + QPushButton, + QVBoxLayout, + QWidget, +) + +import fCmd +import pCmd from quetzal_config import FREECADVERSION from uCmd import label3D -from PySide2.QtCore import QT_TRANSLATE_NOOP -from PySide2.QtWidgets import QDialog -from PySide2.QtWidgets import QWidget -from PySide2.QtWidgets import QListWidget -from PySide2.QtWidgets import QCheckBox -from PySide2.QtWidgets import QLabel -from PySide2.QtWidgets import QComboBox -from PySide2.QtWidgets import QHBoxLayout -from PySide2.QtWidgets import QVBoxLayout -from PySide2.QtWidgets import QPushButton - -# from DraftGui import translate -from draftutils.translate import translate + +translate = FreeCAD.Qt.translate +QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP ################ FUNCTIONS ########################### @@ -1129,21 +1137,6 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings import Draft from FreeCAD import Vector -if FreeCAD.GuiUp: - # import FreeCADGui - # from PySide import QtCore, QtGui - from DraftGui import translate - from PySide.QtCore import QT_TRANSLATE_NOOP -else: - # \cond - def translate(ctxt, txt): - return txt - - def QT_TRANSLATE_NOOP(ctxt, txt): - return txt - - # \endcond - def doProfile( typeS="RH", label="Square", dims=[50, 100, 5] diff --git a/fForms.py b/fForms.py index fcbc016..f18fb55 100644 --- a/fForms.py +++ b/fForms.py @@ -2,16 +2,21 @@ __license__="LGPL 3" -import FreeCAD,FreeCADGui -import fCmd, dodoDialogs +from os.path import abspath, dirname, join + +import FreeCAD +import FreeCADGui from PySide.QtCore import * from PySide.QtGui import * -from DraftGui import translate -from os.path import join, dirname, abspath -from sys import platform + +import dodoDialogs +import fCmd from uCmd import label3D -FTypes=['R','circle','T','H','U','L','Z','omega'] +translate = FreeCAD.Qt.translate + +FTypes = ["R", "circle", "T", "H", "U", "L", "Z", "omega"] + class fillForm(dodoDialogs.protoTypeDialog): 'dialog for fillFrame()' diff --git a/fObservers.py b/fObservers.py index c2e3047..d986fa6 100644 --- a/fObservers.py +++ b/fObservers.py @@ -5,8 +5,12 @@ __url__ = "github.com/oddtopus/dodo" __license__ = "LGPL 3" -import FreeCAD, FreeCADGui, fCmd -from DraftGui import translate +import FreeCAD +import FreeCADGui + +import fCmd + +translate = FreeCAD.Qt.translate class frameObserverPrototype(object): diff --git a/pCmd.py b/pCmd.py index 0a728fd..c9c687c 100644 --- a/pCmd.py +++ b/pCmd.py @@ -3,8 +3,6 @@ __title__ = "pypeTools functions" import FreeCAD, FreeCADGui, Part, fCmd, pFeatures from DraftVecUtils import rounded -from PySide.QtCore import QT_TRANSLATE_NOOP -from DraftGui import translate objToPaint = ["Pipe", "Elbow", "Reduct", "Flange", "Cap"] from math import degrees @@ -16,6 +14,9 @@ Y = FreeCAD.Vector(0, 1, 0) Z = FreeCAD.Vector(0, 0, 1) +translate = FreeCAD.Qt.translate +QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP + ############### AUX FUNCTIONS ###################### diff --git a/pFeatures.py b/pFeatures.py index 40dc490..4d03592 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -7,13 +7,19 @@ objs = ["Pipe", "Elbow", "Reduct", "Cap", "Flange", "Ubolt", "Valve"] metaObjs = ["PypeLine", "PypeBranch"] -import FreeCAD, FreeCADGui, Part, fCmd, pCmd -from copy import copy -from os.path import join, dirname, abspath -from PySide.QtCore import QT_TRANSLATE_NOOP -from DraftGui import translate +from os.path import abspath, dirname, join + +import FreeCAD +import FreeCADGui +import Part + +import fCmd +import pCmd from quetzal_config import FREECADVERSION +QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP +translate = FreeCAD.Qt.translate + vO = FreeCAD.Vector(0, 0, 0) vX = FreeCAD.Vector(1, 0, 0) vY = FreeCAD.Vector(0, 1, 0) diff --git a/pForms.py b/pForms.py index c29395a..71dfb17 100644 --- a/pForms.py +++ b/pForms.py @@ -2,17 +2,24 @@ __license__ = "LGPL 3" -import FreeCAD, FreeCADGui, Part, csv - -pq = FreeCAD.Units.parseQuantity -import fCmd, pCmd, dodoDialogs +import csv +from math import degrees from os import listdir -from os.path import join, dirname, abspath +from os.path import abspath, dirname, join + +import FreeCAD +import FreeCADGui +import Part +from DraftVecUtils import rounded from PySide.QtCore import * from PySide.QtGui import * -from math import degrees -from DraftVecUtils import rounded -from DraftGui import translate + +import dodoDialogs +import fCmd +import pCmd + +pq = FreeCAD.Units.parseQuantity +translate = FreeCAD.Qt.translate mw = FreeCADGui.getMainWindow() x = mw.x() + int(mw.width() / 20) # 100 diff --git a/uCmd.py b/uCmd.py index 1305a23..965d50b 100644 --- a/uCmd.py +++ b/uCmd.py @@ -2,15 +2,24 @@ __license__ = "LGPL 3" -import FreeCAD, FreeCADGui, fCmd, dodoDialogs -from os.path import join, dirname, abspath -from DraftGui import translate +from os.path import abspath, dirname, join + +import FreeCAD +import FreeCADGui from pivy import coin +import dodoDialogs +import fCmd + +translate = FreeCAD.Qt.translate + def setWP(): # TARGET [working]: deal with App::Parts "function to change working plane" - import FreeCAD, FreeCADGui, fCmd + import FreeCAD + import FreeCADGui + + import fCmd normal = point = None curves = [] diff --git a/uForms.py b/uForms.py index ba764e4..4b7415e 100644 --- a/uForms.py +++ b/uForms.py @@ -5,9 +5,11 @@ __url__ = "github.com/oddtopus/dodo" __license__ = "LGPL 3" -from PySide import QtGui, QtCore -import FreeCAD, FreeCADGui -from DraftGui import translate +import FreeCAD +import FreeCADGui +from PySide import QtCore, QtGui + +translate = FreeCAD.Qt.translate # UI Class definitions From 27fdd9bbece6560421ef8a34eb40ab3bf2aea15c Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 23 Oct 2024 20:30:01 -0600 Subject: [PATCH 066/135] Fix typos --- CUtils.py | 2 +- cut_list/README.md | 10 +++++----- cut_list/cut_list_creation.py | 20 +++++++++----------- cut_list/cut_list_ui.py | 4 ++-- pCmd.py | 8 ++++---- pFeatures.py | 8 ++++---- pForms.py | 2 +- 7 files changed, 26 insertions(+), 28 deletions(-) diff --git a/CUtils.py b/CUtils.py index 7b4dd24..4376d02 100644 --- a/CUtils.py +++ b/CUtils.py @@ -192,7 +192,7 @@ def GetResources(self): "MenuText": QT_TRANSLATE_NOOP("Quetzal_DpCalc", "Pressure loss calculator"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_DpCalc", - 'Calculate pressure loss in "pypes" using ChEDL libraries.\n See __doc__ of the module for futher information.', + 'Calculate pressure loss in "pypes" using ChEDL libraries.\n See __doc__ of the module for further information.', ), } diff --git a/cut_list/README.md b/cut_list/README.md index ad63af2..c563fb5 100644 --- a/cut_list/README.md +++ b/cut_list/README.md @@ -1,4 +1,4 @@ -# Cut List Creation Command for Dodo Workbench +# Cut List Creation Command for Dodo Workbench This Module can be used to create a cut list of beams created by the DODO-Workbench.\ The cut list can use one or more profiles (sections/sketches).\ @@ -16,7 +16,7 @@ The Option "Group Parts by Size" will count all Pieces with the same profile and | Beam No. 1 | | | | |-----------------------------|--|--|--| -| Used 2855.0 mm | | | | +| Used 2855.0 mm | | | | | Pos. | Profil | Length | Quantity | | 1 | 10X10 | 610,00 mm | 2 | | 2 | 10X10 | 600,00 mm | 2 | @@ -24,9 +24,9 @@ The Option "Group Parts by Size" will count all Pieces with the same profile and ### Exampl: Without Group Party by Size - | Beam No. 1 | | | | + | Beam No. 1 | | | | |-----------------------------|--|--|--| - | Used 2410.0 mm | | | | + | Used 2410.0 mm | | | | | Pos. | Profil | Label | Length | 1 | 10X10 | Structure006 | 610,00 mm | | 1 | 10X10 | Structure017 | 610,00 mm | @@ -37,7 +37,7 @@ The Option "Group Parts by Size" will count all Pieces with the same profile and ## Use Nesting The Option "Use Nesting" allows to specify the maximum length of the Stock Material and allows for optimizing of the available material.\ The cut Width will be added to each piece to account for the saw thickness.\ -The list will be seperated into Sections and shows the Used Length and the Parts that can be cut from the Stock Material.\ +The list will be separated into Sections and shows the Used Length and the Parts that can be cut from the Stock Material.\ The position number of a piece will be the same on every stock material beam. ### Example with Nesting & Group Party by Size diff --git a/cut_list/cut_list_creation.py b/cut_list/cut_list_creation.py index 4161264..09bd48a 100644 --- a/cut_list/cut_list_creation.py +++ b/cut_list/cut_list_creation.py @@ -9,8 +9,8 @@ @dataclass class Cut: - """ Store the Infomation about the cutted Piece and provide Helper Functions - """ + """Store the Information about the cut Piece and provide Helper Functions""" + label: str profil: str length: object @@ -31,8 +31,8 @@ def getRow(self): @dataclass class Beam: - """ Store the Infomation about the Stock Material Beam and provide Helper Functions - """ + """Store the Information about the Stock Material Beam and provide Helper Functions""" + number: int length: object lengthLeft: object @@ -42,8 +42,8 @@ def addCut(self,cut): """ Try to fit the cutted piece on the Beam and provide a status if it fits """ if self.length.getValueAs("mm") > 0.1 and self.lengthLeft < cut.totalLength(): - # Cut is not Possible on this Beam - # Ignore if Beam has no lenght + # Cut is not Possible on this Beam + # Ignore if Beam has no length return False self.cuts.append(cut) @@ -72,13 +72,11 @@ def queryStructures(profiles:list,rootObjs = None): if obj.TypeId == "App::LinkGroup": resultObjs = resultObjs + queryStructures(profiles,obj.ElementList) - # TODO: A Link to a ink Group will currently not be queried - - # Get the base Profile Used for the Stucture + # Get the base Profile Used for the Structure base = getattr(obj, "Base", None) computedLength = getattr(obj, "ComputedLength", None) - - # Check if the Object is a valid Strucutre + + # Check if the Object is a valid Structure if base is None or computedLength is None: continue diff --git a/cut_list/cut_list_ui.py b/cut_list/cut_list_ui.py index 7b6838f..70f36d0 100644 --- a/cut_list/cut_list_ui.py +++ b/cut_list/cut_list_ui.py @@ -14,7 +14,7 @@ def __init__(self): # this will create a Qt widget from our ui file self.form = FreeCADGui.PySideUic.loadUi(uiPath) - # Set the Default Values and allow only Positiv Values + # Set the Default Values and allow only Positive Values maxStockDefault = Units.parseQuantity("6m") cutWidthDefault = Units.parseQuantity("5mm") @@ -82,7 +82,7 @@ def accept(self): # Do not try to create a cut list with an empty selection # TODO: Add Message Box return - # Get teh Nesting Information or set the default + # Get the Nesting Information or set the default if self.form.use_nesting.checkState() == False: maxStockLength = Units.parseQuantity("0mm") cutWidth = Units.parseQuantity("0mm") diff --git a/pCmd.py b/pCmd.py index c9c687c..cc2b5c2 100644 --- a/pCmd.py +++ b/pCmd.py @@ -418,9 +418,9 @@ def makeFlange(propList=[], pos=None, Z=None): f (float): bolts holes diameter t (float): flange thickness n (int): nr. of bolts - trf (float): raised-face thikness - OPTIONAL - + trf (float): raised-face thickness - OPTIONAL - drf (float): raised-face diameter - OPTIONAL - - twn (float): welding-neck thikness - OPTIONAL - + twn (float): welding-neck thickness - OPTIONAL - dwn (float): welding-neck diameter - OPTIONAL - ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - Default is "DN50 (PN16)" @@ -457,9 +457,9 @@ def doFlanges( f (float): bolts holes diameter t (float): flange thickness n (int): nr. of bolts - trf (float): raised-face thikness - OPTIONAL - + trf (float): raised-face thickness - OPTIONAL - drf (float): raised-face diameter - OPTIONAL - - twn (float): welding-neck thikness - OPTIONAL - + twn (float): welding-neck thickness - OPTIONAL - dwn (float): welding-neck diameter - OPTIONAL - ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - pypeline = string diff --git a/pFeatures.py b/pFeatures.py index 4d03592..a97d85f 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -328,9 +328,9 @@ class Flange(pypeType): f (float): bolts holes diameter t (float): flange thickness n (int): nr. of bolts - trf (float): raised-face thikness - OPTIONAL - + trf (float): raised-face thickness - OPTIONAL - drf (float): raised-face diameter - OPTIONAL - - twn (float): welding-neck thikness - OPTIONAL - + twn (float): welding-neck thickness - OPTIONAL - dwn (float): welding-neck diameter - OPTIONAL - ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - """ @@ -947,13 +947,13 @@ def __init__(self, obj, L=800, W=400, H=500, thk1=6, thk2=8): "App::PropertyLength", "thk1", "Tank", - QT_TRANSLATE_NOOP("App::Property", "Thikness of tank's shell"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of tank's shell"), ).thk1 = thk1 obj.addProperty( "App::PropertyLength", "thk2", "Tank", - QT_TRANSLATE_NOOP("App::Property", "Thikness of tank's top"), + QT_TRANSLATE_NOOP("App::Property", "Thickness of tank's top"), ).thk2 = thk2 def onChanged(self, fp, prop): diff --git a/pForms.py b/pForms.py index 71dfb17..23dcbae 100644 --- a/pForms.py +++ b/pForms.py @@ -673,7 +673,7 @@ class insertUboltForm(dodoDialogs.protoPypeForm): For position and orientation you can select - one or more circular edges, - nothing. - In case one pipe is selected, its properties are aplied to the U-bolt. + In case one pipe is selected, its properties are applied to the U-bolt. Available one button to reverse the orientation of the last or selected tubes. """ From c17b285c4dd3f52175e9248e0b730dcdc0ce1714 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 23 Oct 2024 22:57:55 -0600 Subject: [PATCH 067/135] Use new function to get icon path --- CPipe.py | 121 ++++++++++++++-------------------------------- CUtils.py | 35 ++++---------- quetzal_config.py | 5 ++ 3 files changed, 51 insertions(+), 110 deletions(-) diff --git a/CPipe.py b/CPipe.py index 9bfa02e..6d91865 100644 --- a/CPipe.py +++ b/CPipe.py @@ -9,7 +9,8 @@ import FreeCAD import FreeCADGui import inspect -import os + +from quetzal_config import get_icon_path QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP translate = FreeCAD.Qt.translate @@ -58,9 +59,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "pipe.svg" - ), + "Pixmap": get_icon_path("pipe"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", "Insert a tube"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", "Insert a tube"), } @@ -68,15 +67,13 @@ def GetResources(self): class insertElbow: def Activated(self): - import pForms, FreeCAD + import pForms elbForm = pForms.insertElbowForm() def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "elbow.svg" - ), + "Pixmap": get_icon_path("elbow"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a curve"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a curve"), } @@ -90,9 +87,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "reduct.svg" - ), + "Pixmap": get_icon_path("reduct"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertReduct", "Insert a reduction"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertReduct", "Insert a reduction"), } @@ -106,9 +101,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "cap.svg" - ), + "Pixmap": get_icon_path("cap"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertCap", "Insert a cap"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertCap", "Insert a cap"), } @@ -122,9 +115,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "flange.svg" - ), + "Pixmap": get_icon_path("flange"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertFlange", "Insert a flange"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertFlange", "Insert a flange"), } @@ -138,9 +129,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "clamp.svg" - ), + "Pixmap": get_icon_path("clamp"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertUbolt", "Insert a U-bolt"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertUbolt", "Insert a U-bolt"), } @@ -154,9 +143,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "pypeline.svg" - ), + "Pixmap": get_icon_path("pypeline"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPypeLine", "PypeLine Manager"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertPypeLine", "Open PypeLine Manager"), } @@ -171,9 +158,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "branch.svg" - ), + "Pixmap": get_icon_path("branch"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertBranch", "Insert a branch"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertBranch", "Insert a PypeBranch"), } @@ -187,9 +172,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "break.svg" - ), + "Pixmap": get_icon_path("break"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_BreakPipe", "Break the pipe"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_BreakPipe", "Break one pipe at point and insert gap" @@ -208,9 +191,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "mate.svg" - ), + "Pixmap": get_icon_path("mate"), "Accel": "M,E", "MenuText": QT_TRANSLATE_NOOP("Quetzal_MateEdges", "Mate pipes edges"), "ToolTip": QT_TRANSLATE_NOOP( @@ -227,11 +208,11 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "flat.svg" - ), + "Pixmap": get_icon_path("flat"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_Flat", "Fit one elbow"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Flat", "Place the elbow between two pipes or beams"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_Flat", "Place the elbow between two pipes or beams" + ), } @@ -246,9 +227,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "intersect.svg" - ), + "Pixmap": get_icon_path("intersect"), "MenuText": QT_TRANSLATE_NOOP( "Quetzal_Extend2intersection", "Extends pipes to intersection" ), @@ -269,9 +248,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "intersect1.svg" - ), + "Pixmap": get_icon_path("intersect1"), "MenuText": QT_TRANSLATE_NOOP( "Quetzal_Extend1intersection", "Extends pipe to intersection" ), @@ -296,11 +273,11 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "laydown.svg" - ), + "Pixmap": get_icon_path("laydown"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_Laydown", "Lay-down the pipe"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Laydown", "Lay-down the pipe on the support plane"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_Laydown", "Lay-down the pipe on the support plane" + ), } @@ -325,9 +302,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "raiseup.svg" - ), + "Pixmap": get_icon_path("raiseup"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_Raiseup", "Raise-up the support"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Raiseup", "Raise the support to the pipe"), } @@ -344,9 +319,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "join.svg" - ), + "Pixmap": get_icon_path("join"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Join pypes"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Select the part-pype and the port"), } @@ -362,9 +335,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "valve.svg" - ), + "Pixmap": get_icon_path("valve"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertValve", "Insert a valve"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertValve", "Insert a valve"), } @@ -381,9 +352,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "attach.svg" - ), + "Pixmap": get_icon_path("attach"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_Attach2tube", "Attach to tube"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_Attach2tube", "Attach one pype to the nearest port of selected pipe" @@ -399,9 +368,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "point2point.svg" - ), + "Pixmap": get_icon_path("point2point"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_Point2point", "draw a tube point-to-point"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Point2point", "Click on subsequent points."), } @@ -432,9 +399,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "tank.svg" - ), + "Pixmap": get_icon_path("tank"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertTank", "Insert a tank"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertTank", "Create tank and nozzles"), } @@ -448,9 +413,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "route.svg" - ), + "Pixmap": get_icon_path("route"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertRoute", "Insert a pipe route"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_InsertRoute", "Create a sketch attached to a circular edge" @@ -469,9 +432,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "header.svg" - ), + "Pixmap": get_icon_path("header"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_MakeHeader", "Connect to header"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_MakeHeader", @@ -518,9 +479,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "pipe.svg" - ), + "Pixmap": get_icon_path("pipe"), "MenuText": QT_TRANSLATE_NOOP("pipeQM", "QM for pipes"), } @@ -536,9 +495,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "elbow.svg" - ), + "Pixmap": get_icon_path("elbow"), "MenuText": QT_TRANSLATE_NOOP("elbowQM", "QM for elbows"), } @@ -554,9 +511,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "flange.svg" - ), + "Pixmap": get_icon_path("flange"), "MenuText": QT_TRANSLATE_NOOP("flangeQM", "QM for flanges"), } @@ -572,9 +527,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "valve.svg" - ), + "Pixmap": get_icon_path("valve"), "MenuText": QT_TRANSLATE_NOOP("valveQM", "QM for valves"), } @@ -590,9 +543,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "cap.svg" - ), + "Pixmap": get_icon_path("cap"), "MenuText": QT_TRANSLATE_NOOP("capQM", "QM for caps"), } diff --git a/CUtils.py b/CUtils.py index 4376d02..00a65fa 100644 --- a/CUtils.py +++ b/CUtils.py @@ -6,7 +6,8 @@ import FreeCAD import FreeCADGui import inspect -import os + +from quetzal_config import get_icon_path QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP @@ -40,9 +41,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "query.svg" - ), + "Pixmap": get_icon_path("query"), "Accel": "Q,M", "MenuText": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "query the model"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "Click objects to print infos"), @@ -70,9 +69,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "grid.svg" - ), + "Pixmap": get_icon_path("grid"), "Accel": "A,W", "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveWorkPlane", "align Workplane"), "ToolTip": QT_TRANSLATE_NOOP( @@ -90,9 +87,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "rotWP.svg" - ), + "Pixmap": get_icon_path("rotWP"), "Accel": "R,W", "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotateWorkPlane", "rotate Workplane"), "ToolTip": QT_TRANSLATE_NOOP( @@ -129,9 +124,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "offsetWP.svg" - ), + "Pixmap": get_icon_path("offsetWP"), "Accel": "O,W", "MenuText": QT_TRANSLATE_NOOP("Quetzal_OffsetWorkPlane", "offset Workplane"), "ToolTip": QT_TRANSLATE_NOOP( @@ -148,9 +141,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "hackedL.svg" - ), + "Pixmap": get_icon_path("hackedL"), "Accel": "H,L", "MenuText": QT_TRANSLATE_NOOP("Quetzal_HackedL", "draw a DWire"), "ToolTip": QT_TRANSLATE_NOOP( @@ -169,9 +160,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "moveHandle.svg" - ), + "Pixmap": get_icon_path("moveHandle"), "Accel": "M,H", "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveHandle", "Move objects"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_MoveHandle", "Move quickly objects inside viewport"), @@ -186,9 +175,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "delta.svg" - ), + "Pixmap": get_icon_path("delta"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_DpCalc", "Pressure loss calculator"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_DpCalc", @@ -209,9 +196,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "solids.svg" - ), + "Pixmap": get_icon_path("solids"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_SelectSolids", "Select solids"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_SelectSolids", diff --git a/quetzal_config.py b/quetzal_config.py index 8f85dc7..1ae8675 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -9,3 +9,8 @@ UIPATH = os.path.join(_dir, "dialogz") FREECADVERSION = float(FreeCAD.Version()[0] + "." + FreeCAD.Version()[1]) + + +def get_icon_path(icon_name: str) -> str: + """Returns the path to the SVG icon.""" + return os.path.join(ICONPATH, icon_name + ".svg") From 7923429bd56dae3ed66fe33dbc046428d31e4e07 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 23 Oct 2024 23:46:40 -0600 Subject: [PATCH 068/135] Use ViewProvider to assign icon to parametric objects --- pCmd.py | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/pCmd.py b/pCmd.py index cc2b5c2..2562274 100644 --- a/pCmd.py +++ b/pCmd.py @@ -1,12 +1,19 @@ # (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD __title__ = "pypeTools functions" -import FreeCAD, FreeCADGui, Part, fCmd, pFeatures +import FreeCAD +import FreeCADGui +import Part +import fCmd +import pFeatures from DraftVecUtils import rounded +from quetzal_config import get_icon_path -objToPaint = ["Pipe", "Elbow", "Reduct", "Flange", "Cap"] from math import degrees +objToPaint = ["Pipe", "Elbow", "Reduct", "Flange", "Cap"] + + __author__ = "oddtopus" __url__ = "github.com/oddtopus/dodo" __license__ = "LGPL 3" @@ -131,6 +138,24 @@ def portsDir(o): ################## COMMANDS ######################## +class ViewProvider: + def __init__(self, obj, icon_fn): + obj.Proxy = self + self._check_attr() + self.icon_fn = get_icon_path(icon_fn) or get_icon_path("dodo") + + def _check_attr(self): + """Check for missing attributes.""" + + if not hasattr(self, "icon_fn"): + setattr(self, "icon_fn", get_icon_path("dodo")) + + def getIcon(self): + """Returns the path to the SVG icon.""" + self._check_attr() + return self.icon_fn + + def simpleSurfBend(path=None, profile=None): "select the centerline and the O.D. and let it sweep" curva = FreeCAD.activeDocument().addObject("Part::Feature", "Simple curve") @@ -162,7 +187,7 @@ def makePipe(propList=[], pos=None, Z=None): pFeatures.Pipe(a, *propList) else: pFeatures.Pipe(a) - a.ViewObject.Proxy = 0 + ViewProvider(a.ViewObject, "pipe") a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) @@ -250,7 +275,7 @@ def makeElbow(propList=[], pos=None, Z=None): pFeatures.Elbow(a, *propList) else: pFeatures.Elbow(a) - a.ViewObject.Proxy = 0 + ViewProvider(a.ViewObject, "elbow") a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) # rot=FreeCAD.Rotation(FreeCAD.Vector(0,-1,0),Z) @@ -437,7 +462,7 @@ def makeFlange(propList=[], pos=None, Z=None): pFeatures.Flange(a, *propList) else: pFeatures.Flange(a) - a.ViewObject.Proxy = 0 + ViewProvider(a.ViewObject, "flange") a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) @@ -533,7 +558,7 @@ def makeReduct(propList=[], pos=None, Z=None, conc=True): a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Reduction") propList.append(conc) pFeatures.Reduct(a, *propList) - a.ViewObject.Proxy = 0 + ViewProvider(a.ViewObject, "reduct") a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) @@ -562,7 +587,7 @@ def makeUbolt(propList=[], pos=None, Z=None): pFeatures.Ubolt(a, *propList) else: pFeatures.Ubolt(a) - a.ViewObject.Proxy = 0 + ViewProvider(a.ViewObject, "clamp") a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) @@ -580,7 +605,7 @@ def makeShell(L=1000, W=1500, H=1500, thk1=6, thk2=8): """ a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Tank") pFeatures.Shell(a, L, W, H, thk1, thk2) - a.ViewObject.Proxy = 0 + ViewProvider(a.ViewObject, "tank") a.Placement.Base = FreeCAD.Vector(0, 0, 0) a.ViewObject.ShapeColor = 0.0, 0.0, 1.0 a.ViewObject.Transparency = 85 @@ -609,7 +634,7 @@ def makeCap(propList=[], pos=None, Z=None): pFeatures.Cap(a, *propList) else: pFeatures.Cap(a) - a.ViewObject.Proxy = 0 + ViewProvider(a.ViewObject, "cap") a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) @@ -1237,7 +1262,7 @@ def makeValve(propList=[], pos=None, Z=None): pFeatures.Valve(a, *propList) else: pFeatures.Valve(a) - a.ViewObject.Proxy = 0 + ViewProvider(a.ViewObject, "valve") a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) From f5600d53b71d60401ee52368ee11d865e9beee87 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 24 Oct 2024 10:29:51 -0600 Subject: [PATCH 069/135] Rename QM commands (pie menu) --- CPipe.py | 20 ++++++++++---------- dodoPM.py | 10 +++++----- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/CPipe.py b/CPipe.py index 6d91865..8546d44 100644 --- a/CPipe.py +++ b/CPipe.py @@ -480,11 +480,11 @@ def Activated(self): def GetResources(self): return { "Pixmap": get_icon_path("pipe"), - "MenuText": QT_TRANSLATE_NOOP("pipeQM", "QM for pipes"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_PipeQM", "QM for pipes"), } -addCommand("pipeQM", pipeQM()) +addCommand("Quetzal_PipeQM", pipeQM()) class elbowQM: @@ -496,11 +496,11 @@ def Activated(self): def GetResources(self): return { "Pixmap": get_icon_path("elbow"), - "MenuText": QT_TRANSLATE_NOOP("elbowQM", "QM for elbows"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_ElbowQM", "QM for elbows"), } -addCommand("elbowQM", elbowQM()) +addCommand("Quetzal_ElbowQM", elbowQM()) class flangeQM: @@ -512,11 +512,11 @@ def Activated(self): def GetResources(self): return { "Pixmap": get_icon_path("flange"), - "MenuText": QT_TRANSLATE_NOOP("flangeQM", "QM for flanges"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_FlangeQM", "QM for flanges"), } -addCommand("flangeQM", flangeQM()) +addCommand("Quetzal_FlangeQM", flangeQM()) class valveQM: @@ -528,11 +528,11 @@ def Activated(self): def GetResources(self): return { "Pixmap": get_icon_path("valve"), - "MenuText": QT_TRANSLATE_NOOP("valveQM", "QM for valves"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_ValveQM", "QM for valves"), } -addCommand("valveQM", valveQM()) +addCommand("Quetzal_ValveQM", valveQM()) class capQM: @@ -544,8 +544,8 @@ def Activated(self): def GetResources(self): return { "Pixmap": get_icon_path("cap"), - "MenuText": QT_TRANSLATE_NOOP("capQM", "QM for caps"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_CapQM", "QM for caps"), } -addCommand("capQM", capQM()) +addCommand("Quetzal_CapQM", capQM()) diff --git a/dodoPM.py b/dodoPM.py index 5b4aa06..56cd2cc 100644 --- a/dodoPM.py +++ b/dodoPM.py @@ -533,11 +533,11 @@ def go(self): # main mw = FreeCADGui.getMainWindow() toolList = [ - "pipeQM", - "elbowQM", - "flangeQM", - "valveQM", - "capQM", + "Quetzal_PipeQM", + "Quetzal_ElbowQM", + "Quetzal_FlangeQM", + "Quetzal_ValveQM", + "Quetzal_CapQM", ] # ["Quetzal_InsertPipe","Quetzal_InsertElbow","Quetzal_InsertReduct","Quetzal_InsertCap","Quetzal_InsertValve","Quetzal_InsertFlange","Quetzal_InsertUbolt"] compositingManager = True if QtCore.qVersion() < "5": From 3d84f756f64dc66b5248571e84dc2d160a0c2e9a Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 24 Oct 2024 12:33:05 -0600 Subject: [PATCH 070/135] Update some icons Get better contrast on dark themes --- iconz/cap.svg | 528 ++++++++++++++------------------------- iconz/clamp.svg | 627 ++++++++++++++++------------------------------- iconz/elbow.svg | 379 +++++++++++++--------------- iconz/flange.svg | 420 +++++++++++++------------------ iconz/reduct.svg | 420 ++++++++++++++----------------- iconz/valve.svg | 529 ++++++++++++++------------------------- 6 files changed, 1096 insertions(+), 1807 deletions(-) diff --git a/iconz/cap.svg b/iconz/cap.svg index c69b079..d1165dd 100644 --- a/iconz/cap.svg +++ b/iconz/cap.svg @@ -1,342 +1,188 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + cap + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + cap + + + + + + + + + + + + + + + + diff --git a/iconz/clamp.svg b/iconz/clamp.svg index cca924f..c1e1e3a 100644 --- a/iconz/clamp.svg +++ b/iconz/clamp.svg @@ -1,417 +1,212 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + clamp, U-bolt + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + clamp, U-bolt + + + + + + + + + + + + + + + + + + + diff --git a/iconz/elbow.svg b/iconz/elbow.svg index 7f162a3..cc6ebe6 100644 --- a/iconz/elbow.svg +++ b/iconz/elbow.svg @@ -1,216 +1,165 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + elbow + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + elbow + + + + + + + + diff --git a/iconz/flange.svg b/iconz/flange.svg index 8b8fa64..73ad103 100644 --- a/iconz/flange.svg +++ b/iconz/flange.svg @@ -1,253 +1,169 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + flange + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + flange + + + + + + + + diff --git a/iconz/reduct.svg b/iconz/reduct.svg index c1aa5c2..27584f6 100644 --- a/iconz/reduct.svg +++ b/iconz/reduct.svg @@ -1,236 +1,186 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + reduction + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + reduction + + + + + + + + + + + + + + + + diff --git a/iconz/valve.svg b/iconz/valve.svg index ce99fa4..b02a1f6 100644 --- a/iconz/valve.svg +++ b/iconz/valve.svg @@ -1,348 +1,181 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + valve + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + valve + + + + + + + + + + + + + + + From b1638a3795455a4ad4df7316015abd1627fcd627 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 24 Oct 2024 14:30:04 -0600 Subject: [PATCH 071/135] Mark commands unavailable when there is no active document --- CPipe.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/CPipe.py b/CPipe.py index 8546d44..7084e98 100644 --- a/CPipe.py +++ b/CPipe.py @@ -52,6 +52,12 @@ def updatesPL(dialogqm): class insertPipe: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -66,6 +72,12 @@ def GetResources(self): class insertElbow: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -80,6 +92,12 @@ def GetResources(self): class insertReduct: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -94,6 +112,12 @@ def GetResources(self): class insertCap: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -108,6 +132,12 @@ def GetResources(self): class insertFlange: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -122,6 +152,12 @@ def GetResources(self): class insertUbolt: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -136,6 +172,12 @@ def GetResources(self): class insertPypeLine: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -150,6 +192,12 @@ def GetResources(self): class insertBranch: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -165,6 +213,12 @@ def GetResources(self): class breakPipe: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms @@ -326,6 +380,12 @@ def GetResources(self): class insertValve: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + def Activated(self): import pForms From 97b3d65fd24b11f055afc00d3476f95d3e5ff2c0 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Thu, 24 Oct 2024 20:10:42 -0600 Subject: [PATCH 072/135] Fixed PypeLineForm pipe generation & python files -Match method & classes spacing -Include exception condition for OCC Part on pypeline class -Remove .ts code with no lines asociated --- cut_list/cut_list_commands.py | 2 +- dodoDialogs.py | 5 +- fFeatures.py | 1 + pFeatures.py | 85 ++- pForms.py | 29 +- translationz/Quetzal.ts | 778 +++++++++++++-------------- translationz/Quetzal_es-ES.qm | Bin 45622 -> 45363 bytes translationz/Quetzal_es-ES.ts | 959 ++++++++++++++++------------------ 8 files changed, 869 insertions(+), 990 deletions(-) diff --git a/cut_list/cut_list_commands.py b/cut_list/cut_list_commands.py index caccc0c..e53ece1 100644 --- a/cut_list/cut_list_commands.py +++ b/cut_list/cut_list_commands.py @@ -17,7 +17,7 @@ def GetResources(self): return { "MenuText": QT_TRANSLATE_NOOP("Quetzal_CreateCutList", "createCutList"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_CreateCutList", "Create a new Cut List from Dodo Beams" + "Quetzal_CreateCutList", "Create a new Cut List from Quetzal Beams" ), "Pixmap": Icon, } diff --git a/dodoDialogs.py b/dodoDialogs.py index 0f8a9e8..39a5bbe 100644 --- a/dodoDialogs.py +++ b/dodoDialogs.py @@ -5,8 +5,8 @@ import FreeCAD import FreeCADGui -from PySide.QtCore import * -from PySide.QtGui import * +from PySide2.QtCore import * +from PySide2.QtGui import * translate = FreeCAD.Qt.translate @@ -94,7 +94,6 @@ def reject(self): if FreeCAD.ActiveDocument: FreeCAD.ActiveDocument.recompute() - class protoPypeForm(QDialog): "prototype dialog for insert pFeatures" diff --git a/fFeatures.py b/fFeatures.py index f8a1f43..161a935 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -574,6 +574,7 @@ def makeMiter(self): self.placementfinal = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),90),element.StartPoint).multiply(self.placementrelative) plane.AttachmentOffset = self.placementfinal j=j+1 + # TODO::Remove code inside if False condicion ones plane bisec each sketch corner if False: vend1=FreeCAD.Vector(sel[0].Geometry[i-1].EndPoint) vstart1=FreeCAD.Vector(sel[0].Geometry[i-1].StartPoint) diff --git a/pFeatures.py b/pFeatures.py index a97d85f..59a2e08 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -27,7 +27,6 @@ ################ CLASSES ########################### - class pypeType(object): def __init__(self, obj): obj.Proxy = self @@ -80,32 +79,32 @@ def nearestPort(self, point=None): or to the selected geometry. (, , ) """ - obj = FreeCAD.ActiveDocument.getObject(self.Name) - if not point and FreeCADGui.ActiveDocument: - try: - selex = FreeCADGui.Selection.getSelectionEx() - target = selex[0].Object - so = selex[0].SubObjects[0] - except: - FreeCAD.Console.PrintError("No geometry selected\n") - return None - if type(so) == Part.Vertex: - point = so.Point - else: - point = so.CenterOfMass - if point: - pos = pCmd.portsPos(obj)[0] - Z = pCmd.portsDir(obj)[0] - i = nearest = 0 - if len(obj.Ports) > 1: - for p in pCmd.portsPos(obj)[1:]: - i += 1 - if (p - point).Length < (pos - point).Length: - pos = p - Z = pCmd.portsDir(obj)[i] - nearest = i - return nearest, pos, Z - + if FreeCAD.ActiveDocument: + obj = FreeCAD.ActiveDocument.getObject(self.Name) + if not point and FreeCADGui.ActiveDocument: + try: + selex = FreeCADGui.Selection.getSelectionEx() + target = selex[0].Object + so = selex[0].SubObjects[0] + except: + FreeCAD.Console.PrintError("No geometry selected\n") + return None + if type(so) == Part.Vertex: + point = so.Point + else: + point = so.CenterOfMass + if point: + pos = pCmd.portsPos(obj)[0] + Z = pCmd.portsDir(obj)[0] + i = nearest = 0 + if len(obj.Ports) > 1: + for p in pCmd.portsPos(obj)[1:]: + i += 1 + if (p - point).Length < (pos - point).Length: + pos = p + Z = pCmd.portsDir(obj)[i] + nearest = i + return nearest, pos, Z class Pipe(pypeType): """Class for object PType="Pipe" @@ -195,7 +194,6 @@ def execute(self, fp): fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.Height))] super(Pipe, self).execute(fp) # perform common operations - class Elbow(pypeType): """Class for object PType="Elbow" Elbow(obj,[PSize="DN50",OD=60.3,thk=3,BA=90,BR=45.225]) @@ -305,16 +303,18 @@ def execute(self, fp): ) ) ) - sol = Part.Solid(Part.Shell([b, p1, p2])) - planeFaces = [f for f in sol.Faces if type(f.Surface) == Part.Plane] - # elbow=sol.makeThickness(planeFaces,-fp.thk,1.e-3) - # fp.Shape = elbow - if fp.thk < fp.OD / 2: - fp.Shape = sol.makeThickness(planeFaces, -fp.thk, 1.0e-3) - else: - fp.Shape = sol - super(Elbow, self).execute(fp) # perform common operations - + try: + sol = Part.Solid(Part.Shell([b.Faces[0], p1.Faces[0], p2.Faces[0]])) + planeFaces = [f for f in sol.Faces if type(f.Surface) == Part.Plane] + # elbow=sol.makeThickness(planeFaces,-fp.thk,1.e-3) + # fp.Shape = elbow + if fp.thk < fp.OD / 2: + fp.Shape = sol.makeThickness(planeFaces, -fp.thk, 1.0e-3) + else: + fp.Shape = sol + super(Elbow, self).execute(fp) # perform common operations + except Part.OCCError as occer: + FreeCAD.Console.PrintWarning(str(occer) + "\n") class Flange(pypeType): """Class for object PType="Flange" @@ -475,7 +475,6 @@ def execute(self, fp): fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.t))] super(Flange, self).execute(fp) # perform common operations - class Reduct(pypeType): """Class for object PType="Reduct" Reduct(obj,[PSize="DN50",OD=60.3, OD2= 48.3, thk=3, thk2=None, H=None, conc=True]) @@ -609,7 +608,6 @@ def execute(self, fp): ] super(Reduct, self).execute(fp) # perform common operations - class Cap(pypeType): """Class for object PType="Cap" Cap(obj,[PSize="DN50",OD=60.3,thk=3]) @@ -682,7 +680,6 @@ def execute(self, fp): fp.Ports = [FreeCAD.Vector()] super(Cap, self).execute(fp) # perform common operations - class PypeLine2(pypeType): """Class for object PType="PypeLine2" This object represent a collection of objects "PType" that are updated with the @@ -802,7 +799,6 @@ def update(self, fp, edges=None): def execute(self, fp): return None - class ViewProviderPypeLine: def __getstate__(self): return None @@ -826,7 +822,6 @@ def attach(self, vobj): self.ViewObject = vobj self.Object = vobj.Object - class Ubolt: """Class for object PType="Clamp" UBolt(obj,[PSize="DN50",ClampType="U-bolt", C=76, H=109, d=10]) @@ -910,7 +905,6 @@ def execute(self, fp): fp.Shape = path.makePipe(p) fp.Ports = [FreeCAD.Vector(0, 0, 1)] - class Shell: """ Class for a lateral-shell-of-tank object @@ -985,7 +979,6 @@ def execute(self, fp): ) fp.Shape = Part.makeCompound([tank, top]) - class ViewProviderPypeBranch: def __init__(self, vobj): vobj.Proxy = self @@ -1032,7 +1025,6 @@ def claimChildren(self): def onDelete(self, feature, subelements): # subelements is a tuple of strings return True - class Valve(pypeType): """Class for object PType="Valve" Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100]) @@ -1082,7 +1074,6 @@ def execute(self, fp): fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.Height))] super(Valve, self).execute(fp) # perform common operations - class PypeBranch2(pypeType): # use AttachExtensionPython """Class for object PType="PypeBranch2" Single-line pipe branch linked to its center-line using AttachExtensionPython diff --git a/pForms.py b/pForms.py index 23dcbae..856d58b 100644 --- a/pForms.py +++ b/pForms.py @@ -90,7 +90,6 @@ def clearAll(self): for cb in self.checkBoxes: cb.setChecked(False) - class insertPipeForm(dodoDialogs.protoPypeForm): """ Dialog to insert tubes. @@ -221,7 +220,6 @@ def changeL(self): self.lastPipe.Height = newL FreeCAD.ActiveDocument.recompute() - class insertElbowForm(dodoDialogs.protoPypeForm): """ Dialog to insert one elbow. @@ -384,7 +382,6 @@ def reverse(self): self.lastElbow.Placement.Rotation.multVec(self.lastElbow.Ports[0]) * -2 ) - class insertFlangeForm(dodoDialogs.protoPypeForm): """ Dialog to insert flanges. @@ -483,7 +480,6 @@ def apply(self): obj.PRating = self.PRating FreeCAD.activeDocument().recompute() - class insertReductForm(dodoDialogs.protoPypeForm): """ Dialog to insert concentric reductions. @@ -666,7 +662,6 @@ def changeRating2(self, item): self.sizeList.setCurrentRow(0) self.fillOD2() - class insertUboltForm(dodoDialogs.protoPypeForm): """ Dialog to insert U-bolts. @@ -787,7 +782,6 @@ def insert(self): FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() - class insertCapForm(dodoDialogs.protoPypeForm): """ Dialog to insert caps. @@ -851,7 +845,6 @@ def apply(self): obj.PRating = self.PRating FreeCAD.activeDocument().recompute() - class insertPypeLineForm(dodoDialogs.protoPypeForm): """ Dialog to insert pypelines. @@ -901,7 +894,7 @@ def __init__(self): self.show() def summary(self, pl=None): - if self.combo.currentText() != "": + if self.combo.currentText() != translate("insertPypeLineForm",""): pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] FreeCAD.Console.PrintMessage( "\n%s: %s - %s\nProfile: %.1fx%.1f\nRGB color: %.3f, %.3f, %.3f\n" @@ -923,7 +916,7 @@ def summary(self, pl=None): def apply(self): d = self.pipeDictList[self.sizeList.currentRow()] - if self.combo.currentText() != "": + if self.combo.currentText() != translate("insertPypeLineForm",""): pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] pl.PSize = d["PSize"] pl.PRating = self.PRating @@ -936,7 +929,7 @@ def apply(self): def insert(self): d = self.pipeDictList[self.sizeList.currentRow()] FreeCAD.activeDocument().openTransaction("Insert pype-line") - if self.combo.currentText() == "": + if self.combo.currentText() == translate("insertPypeLineForm",""): plLabel = self.edit1.text() if not plLabel: plLabel = "Tubatura" @@ -969,7 +962,7 @@ def insert(self): FreeCAD.ActiveDocument.recompute() def getBase(self): - if self.combo.currentText() != "": + if self.combo.currentText() != translate("insertPypeLineForm",""): pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] sel = FreeCADGui.Selection.getSelection() if sel: @@ -1005,7 +998,7 @@ def changeColor(self): col = QColorDialog.getColor() if col.isValid(): self.color = tuple([c / 255.0 for c in col.toTuple()[:3]]) - if self.combo.currentText() != "": + if self.combo.currentText() != translate("insertPypeLineForm",""): pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[ 0 ] @@ -1019,7 +1012,7 @@ def partList(self): f = None f = qfd.getSaveFileName()[0] if f: - if self.combo.currentText() != "": + if self.combo.currentText() != translate("insertPypeLineForm",""): group = FreeCAD.activeDocument().getObjectsByLabel( FreeCAD.__activePypeLine__ + "_pieces" )[0] @@ -1059,7 +1052,6 @@ def partList(self): plist.close() FreeCAD.Console.PrintMessage("Data saved in %s.\n" % f) - class insertBranchForm(dodoDialogs.protoPypeForm): """ Dialog to insert branches. @@ -1151,7 +1143,6 @@ def insert(self): FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute() - class breakForm(QDialog): """ Dialog to break one pipe and create a gap. @@ -1235,7 +1226,7 @@ def __init__( self.show() def setCurrentPL(self, PLName=None): - if self.combo.currentText() not in ["", ""]: + if self.combo.currentText() not in [translate("breakForm",""), translate("breakForm","")]: FreeCAD.__activePypeLine__ = self.combo.currentText() else: FreeCAD.__activePypeLine__ = None @@ -1323,10 +1314,8 @@ def breakPipe(self): FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() - import pObservers as po - class joinForm(dodoDialogs.protoTypeDialog): def __init__(self): super(joinForm, self).__init__("joinPypes.ui") @@ -1355,7 +1344,6 @@ def reset(self): po.pCmd.arrows1 = [] po.pCmd.arrows2 = [] - class insertValveForm(dodoDialogs.protoPypeForm): """ Dialog to insert Valves. @@ -1452,11 +1440,9 @@ def apply(self): obj.Kv = float(d["Kv"]) FreeCAD.activeDocument().recompute() - import DraftTools, Draft, uForms, uCmd from PySide.QtGui import * - class point2pointPipe(DraftTools.Line): """ Draw pipes by sequence point. @@ -1609,7 +1595,6 @@ def action(self, arg): # re-defintition of the method of parent self.finish(True, cont=True) FreeCAD.activeDocument().commitTransaction() - class insertTankForm(dodoDialogs.protoTypeDialog): def __init__(self): self.nozzles = list() diff --git a/translationz/Quetzal.ts b/translationz/Quetzal.ts index 4866cae..74c6f5f 100644 --- a/translationz/Quetzal.ts +++ b/translationz/Quetzal.ts @@ -4,214 +4,224 @@ App::Property - - - - - - + + + + + + Outside diameter - - - - - - - + + + + + + + Wall thickness - - - - + + + + Inside diameter - - + + Length of tube - - - - + + + + Section dim. - + Bend Angle - - + + Bend Radius - + Type of flange - + Flange diameter - + Bore diameter - + Bolts distance - + Bolts hole diameter - + Thickness of flange - + Nr. of bolts - + Thickness of raised face - + Diameter of raised face - + Length of welding neck - + Diameter of welding neck - + Outside diameter of pipe - + Major diameter - + Minor diameter - + Make the length variable - + Length of reduction - + Concentric or Eccentric - + the radius of bending - - + + The extension of the tail - - + + The extension of the head - - + + The rotation of the section - - + + Type of frameFeature - + Size of frame - + The group. - + the edges - + the profile - + The beams names - + The profile + + + + + + + + + + + Type of section + + - - - - Type of section + Width of the beam @@ -221,196 +231,186 @@ - Width of the beam - - - - - - - - - - - + + Height of the beam - + Thickness of the vertical sides - + Thickness of the horizontal sides - + Diameter of the beam - + Thickness + - Thickness of the webs + - - + Thickness of the web - + Thickness of the flanges - + Width of the flanges + + + + + Thickness 1 + + - Thickness 1 + Thickness 2 - Thickness 2 - - - - - - Thickness 3 - - + + Width of the bottom flange - - + + Width of the top flange - + Type of pipeFeature - + Type of clamp - + Size of clamp - + Arc diameter - + Overall height - + Rod diameter - + Size of thread - - + + Ports position relative to the origin of Shape - + Type of tubeFeature - + Rating of pipeFeature - + Nominal diameter - + Flow factor (m3/h/bar) - + Tank's length - + Tank's width - + Tank's height - + Thikness of tank's shell - + Thikness of tank's top - + The tubes of the branch. - + The curves of the branch. - - + + The path. @@ -418,7 +418,7 @@ App::PropertyString - + The group. @@ -994,7 +994,7 @@ DialogQM - + Quick Insert @@ -1289,66 +1289,15 @@ profile - - Part::Feature - - - Simple curve - - - - - Part::FeaturePython - - - Tube - - - - - Elbow - - - - - Flange - - - - - Reduction - - - - - U-Bolt - - - - - Tank - - - - - Cap - - - - - Valve - - - Quetzal_AdjustFrameAngle - + adjustFrameAngle - + Adjust the angle of frame by two edges @@ -1356,12 +1305,12 @@ profile Quetzal_AlignEdge - + Mate the edges - + Join two edges: select two or pre-select several @@ -1369,12 +1318,12 @@ profile Quetzal_AlignFlange - + alignFlange - + Rotates the section of the beam to make the faces parallel to another face @@ -1382,12 +1331,12 @@ profile Quetzal_Attach2tube - + Attach to tube - + Attach one pype to the nearest port of selected pipe @@ -1395,12 +1344,12 @@ profile Quetzal_BreakPipe - + Break the pipe - + Break one pipe at point and insert gap @@ -1408,12 +1357,12 @@ profile Quetzal_CreateCutList - + createCutList - + Create a new Cut List from Dodo Beams @@ -1421,12 +1370,12 @@ profile Quetzal_DpCalc - + Pressure loss calculator - + Calculate pressure loss in "pypes" using ChEDL libraries. See __doc__ of the module for futher information. @@ -1435,12 +1384,12 @@ profile Quetzal_Extend - + extendTheBeam - + Extend the beam either to a face, a vertex or the c.o.m. of the selected object @@ -1448,8 +1397,8 @@ profile Quetzal_Extend1intersection - - + + Extends pipe to intersection @@ -1457,8 +1406,8 @@ profile Quetzal_Extend2intersection - - + + Extends pipes to intersection @@ -1466,12 +1415,12 @@ profile Quetzal_Flat - + Fit one elbow - + Place the elbow between two pipes or beams @@ -1479,12 +1428,12 @@ profile Quetzal_FrameBranchManager - + FrameBranch Manager - + Open FrameBranch Manager @@ -1492,12 +1441,12 @@ profile Quetzal_FrameIt - + Place one-beam over one-edge - + Place one beam after the other over the edges @@ -1505,12 +1454,12 @@ profile Quetzal_HackedL - + draw a DWire - + WP is re-positioned at each point. Possible to spin and offset it. @@ -1518,12 +1467,12 @@ profile Quetzal_InsertAnyz - + Insert any shape - + Insert a STEP, IGES or BREP @@ -1531,12 +1480,12 @@ profile Quetzal_InsertBranch - + Insert a branch - + Insert a PypeBranch @@ -1544,8 +1493,8 @@ profile Quetzal_InsertCap - - + + Insert a cap @@ -1553,8 +1502,8 @@ profile Quetzal_InsertElbow - - + + Insert a curve @@ -1562,8 +1511,8 @@ profile Quetzal_InsertFlange - - + + Insert a flange @@ -1571,12 +1520,12 @@ profile Quetzal_InsertPath - + insert Path - + Creates one path along selected edges @@ -1584,8 +1533,8 @@ profile Quetzal_InsertPipe - - + + Insert a tube @@ -1593,12 +1542,12 @@ profile Quetzal_InsertPypeLine - + PypeLine Manager - + Open PypeLine Manager @@ -1606,8 +1555,8 @@ profile Quetzal_InsertReduct - - + + Insert a reduction @@ -1615,12 +1564,12 @@ profile Quetzal_InsertRoute - + Insert a pipe route - + Create a sketch attached to a circular edge @@ -1628,12 +1577,12 @@ profile Quetzal_InsertSection - + Insert sections - + Creates customized beam profiles 2D @@ -1641,12 +1590,12 @@ profile Quetzal_InsertTank - + Insert a tank - + Create tank and nozzles @@ -1654,8 +1603,8 @@ profile Quetzal_InsertUbolt - - + + Insert a U-bolt @@ -1663,8 +1612,8 @@ profile Quetzal_InsertValve - - + + Insert a valve @@ -1672,12 +1621,12 @@ profile Quetzal_JoinPype - + Join pypes - + Select the part-pype and the port @@ -1685,12 +1634,12 @@ profile Quetzal_Laydown - + Lay-down the pipe - + Lay-down the pipe on the support plane @@ -1698,12 +1647,12 @@ profile Quetzal_LevelBeam - + Flush the surfaces - + Shift the beams to line-up the faces to the first selection (faces must be //) @@ -1711,12 +1660,12 @@ profile Quetzal_MakeHeader - + Connect to header - + Connect branches to one header pipe Branches and header's axes must be ortho @@ -1725,12 +1674,12 @@ Branches and header's axes must be ortho Quetzal_MateEdges - + Mate pipes edges - + Mate two terminations through their edges @@ -1738,12 +1687,12 @@ Branches and header's axes must be ortho Quetzal_MoveHandle - + Move objects - + Move quickly objects inside viewport @@ -1751,12 +1700,12 @@ Branches and header's axes must be ortho Quetzal_MoveWorkPlane - + align Workplane - + Moves and rotates the drafting workplane with points, edges and faces @@ -1764,22 +1713,22 @@ Branches and header's axes must be ortho Quetzal_OffsetWorkPlane - + Offset Work Plane - + Offset: - + offset Workplane - + Shifts the WP along its normal. @@ -1787,12 +1736,12 @@ Branches and header's axes must be ortho Quetzal_PivotBeam - + pivotTheBeam - + Rotates the beam around an axis (edge or center-of-curvature) @@ -1800,12 +1749,12 @@ Branches and header's axes must be ortho Quetzal_Point2point - + draw a tube point-to-point - + Click on subsequent points. @@ -1813,12 +1762,12 @@ Branches and header's axes must be ortho Quetzal_QueryModel - + query the model - + Click objects to print infos @@ -1826,12 +1775,12 @@ Branches and header's axes must be ortho Quetzal_Raiseup - + Raise-up the support - + Raise the support to the pipe @@ -1839,12 +1788,12 @@ Branches and header's axes must be ortho Quetzal_ReverseBeam - + Reverse orientation - + Reverse the orientation of selected objects @@ -1852,12 +1801,12 @@ Branches and header's axes must be ortho Quetzal_RotJoin - + rotJoinEdge - + Rotates and align the beam according another edge @@ -1865,12 +1814,12 @@ Branches and header's axes must be ortho Quetzal_RotateWorkPlane - + rotate Workplane - + Spin the Draft working plane about one of its axes @@ -1878,12 +1827,12 @@ Branches and header's axes must be ortho Quetzal_SelectSolids - + Select solids - + Grab all solids or those partially selected to export in .step format @@ -1892,12 +1841,12 @@ Branches and header's axes must be ortho Quetzal_ShiftBeam - + shiftTheBeam - + Translate objects by vectors defined on existing geometry @@ -1905,12 +1854,12 @@ Branches and header's axes must be ortho Quetzal_SpinSect - + Spin beams by 45 deg. - + Rotates the section of the beam by 45 degrees @@ -1918,70 +1867,61 @@ Branches and header's axes must be ortho Quetzal_StretchBeam - + stretchTheBeam - + Changes the length of the beam, either according a preselected edge or a direct input - - Sketcher::SketchObject - - - pipeRoute - - - Workbench - Dodo + Quetzal - - Dodo workbench -(substitute of flamingo for Py3/Qt5) + + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. - + pypetools - + Frame tools - + Pype tools - - + + Utils - - QkMenus + + QM Menus - + Frames - + Pypes @@ -1989,35 +1929,41 @@ Branches and header's axes must be ortho breakForm - + Break the pipes - + Length - + <reference> - + PypeLine: - + + <none> + + + <new> + + capQM - + QM for caps @@ -2025,49 +1971,49 @@ Branches and header's axes must be ortho dpCalcDialog - - + + *** CUSTOM FLUID *** - + <custom fluid> - - + + No data found - + It seems the fluid has not a liquid state. - + *** LIQUID *** - + Flow (m3/h) - + It seems the fluid has not a gas state. - + *** GAS/VAPOUR *** - + Flow (kg/h) @@ -2075,7 +2021,7 @@ Branches and header's axes must be ortho elbowQM - + QM for elbows @@ -2083,76 +2029,76 @@ Branches and header's axes must be ortho fObservers - + Select one beam and one edge - + First select the base beam, then the edges - + First select the target plane, then the faces to align - + levelTheBeam Transaction - + Select the target face, then the others - + alignFlange Transaction - + Select two edges to join. - + joinTheBeamsEdges Transaction - + Select the beam and input the length - + First Select the target shape, then the beams to extend. - + Select 2 edges - + Adjust angle Transaction - + Select 2 edges =>[Ctrl]+select - + rotJoin Transaction @@ -2161,7 +2107,7 @@ Branches and header's axes must be ortho flangeQM - + QM for flanges @@ -2169,17 +2115,17 @@ Branches and header's axes must be ortho insertBranchForm - + Insert a branch - + <name> - + <bend radius> @@ -2187,17 +2133,17 @@ Branches and header's axes must be ortho insertCapForm - + Insert caps - + Reverse - + Apply @@ -2205,48 +2151,48 @@ Branches and header's axes must be ortho insertElbowForm - + Insert elbows - + <bend angle> - + <bend radius> - + Trim/Extend - + Reverse - + Apply - + 0 deg - + Wrong selection - + deg @@ -2254,17 +2200,17 @@ Branches and header's axes must be ortho insertFlangeForm - + Insert flanges - + Reverse - + Apply @@ -2272,22 +2218,22 @@ Branches and header's axes must be ortho insertPipeForm - + Insert pipes - + <length> - + Reverse - + Apply @@ -2295,42 +2241,48 @@ Branches and header's axes must be ortho insertPypeLineForm - + PypeLine Manager - + <name> - + Redraw - + Part list - + Color - + Get Path - + Get Profile - + + + + + + + <new> @@ -2338,22 +2290,22 @@ Branches and header's axes must be ortho insertReductForm - + Insert reductions - + Reverse - + Apply - + Eccentric @@ -2361,7 +2313,7 @@ Branches and header's axes must be ortho insertRouteForm - + <select an edge> @@ -2369,22 +2321,22 @@ Branches and header's axes must be ortho insertTankForm - + doing combine - + files read - + files not read - + listNozzles: %s @@ -2392,32 +2344,32 @@ Branches and header's axes must be ortho insertUboltForm - + Insert U-bolt - + - no ref. face - - + Ref. face - + Head - + Middle - + Tail @@ -2425,22 +2377,22 @@ Branches and header's axes must be ortho insertValveForm - + Insert valves - + Reverse - + Apply - + Insert in pipe @@ -2448,7 +2400,7 @@ Branches and header's axes must be ortho makeframenbranch - + Travatura @@ -2456,7 +2408,7 @@ Branches and header's axes must be ortho mouseActionB1 - + ____TAIL @@ -2464,12 +2416,12 @@ Branches and header's axes must be ortho pForms - + Offset Work Plane - + Offset: @@ -2477,7 +2429,7 @@ Branches and header's axes must be ortho pipeQM - + QM for pipes @@ -2485,12 +2437,12 @@ Branches and header's axes must be ortho point2pointPipe - + Reset - + Move WP on click @@ -2498,67 +2450,67 @@ Branches and header's axes must be ortho profEdit - + Square Profile name in the Tree View - + T-profile Profile name in the Tree View - + U-profile Profile name in the Tree View - + H-profile Profile name in the Tree View - + L-profile Profile name in the Tree View - + Z-profile Profile name in the Tree View - + Omega-profile Profile name in the Tree View - + Circle-profile Profile name in the Tree View - + Insert profile Transaction, used on undo/redo lists - + Modify profile Transaction, used on undo/redo lists - + Shift profile Transaction, used on undo/redo lists @@ -2567,13 +2519,13 @@ Branches and header's axes must be ortho protoPypeForm - - + + Rating: - + Insert @@ -2581,17 +2533,17 @@ Branches and header's axes must be ortho protoTypeDialog - + "%s" to select; "%s" to execute - + No view available. - + Actions "%s" and "%s" removed @@ -2599,12 +2551,12 @@ Branches and header's axes must be ortho rotWPForm - + Angle: - + Rotate working plane @@ -2612,18 +2564,18 @@ Branches and header's axes must be ortho uCmd - + Quick move Transaction - + Offset Work Plane - + Offset: @@ -2631,72 +2583,72 @@ Branches and header's axes must be ortho uForms - + QueryTool - + (Select a object) - + (base) - + Base: - + (angle) - + Rotation angle: - + v = (x,y,z) - + Rotation axis: - + (Sub object property) - + (Beam property) - + (Profile property) - + QueryObject - + Exit - + Rotate WP @@ -2704,7 +2656,7 @@ Branches and header's axes must be ortho valveQM - + QM for valves diff --git a/translationz/Quetzal_es-ES.qm b/translationz/Quetzal_es-ES.qm index 1bc1d1fcfa8c781faf17d8ac8f7061618c8fbe90..e0adcb22f705022fc379bd7b0ee9a64d6a75f6fe 100644 GIT binary patch delta 4238 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 Q^{?4WS88i779@E82Z~FlS^xk5 delta 4624 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 diff --git a/translationz/Quetzal_es-ES.ts b/translationz/Quetzal_es-ES.ts index e85c6f6..0bdf5d1 100644 --- a/translationz/Quetzal_es-ES.ts +++ b/translationz/Quetzal_es-ES.ts @@ -4,215 +4,225 @@ App::Property - - - - - - + + + + + + Outside diameter Diámetro exterior - - - - - - - + + + + + + + Wall thickness Espesor de muro - - - - + + + + Inside diameter Diámetro interno - - + + Length of tube Longitud del tubo - - - - + + + + Section dim. - Dimensión de sección + Dimensión de sección. - + Bend Angle Ángulo de doblez - - + + Bend Radius Radio de doblez - + Type of flange Tipo de brida - + Flange diameter Diámetro de brida - + Bore diameter Diámetro de orificio - + Bolts distance Distancia de tornillos - + Bolts hole diameter Diámetro de orificio para tornillo - + Thickness of flange Espesor de brida - + Nr. of bolts Numero de tornillos - + Thickness of raised face Espesor de cara elevada - + Diameter of raised face Diámetro de cara elevada - + Length of welding neck Longitud de cuello para soldadura - + Diameter of welding neck Diámetro de cuello para soldadura - + Outside diameter of pipe Diámetro exterior de tubería - + Major diameter Diámetro mayor - + Minor diameter Diámetro menor - + Make the length variable Hace la longitud variable - + Length of reduction Longitud de reducción - + Concentric or Eccentric Concéntrico o excéntrico - + the radius of bending El radio de doblez - - + + The extension of the tail La extensión de la cola - - + + The extension of the head La extensión de la cabecera - - + + The rotation of the section La rotación de la sección - - + + Type of frameFeature Tipo de característica de marco - + Size of frame Tamaño de marco - + The group. El grupo. - + the edges Los bordes - + the profile El perfil - + The beams names Los nombres de las vigas - + The profile El perfil + + + + + + + + + + + Type of section + Tipo de sección + - - - - Type of section - Tipo de sección + Width of the beam + Ancho de la viga @@ -221,196 +231,186 @@ - Width of the beam - Ancho de la viga - - - - - - - - - - + + Height of the beam Alto de la viga - + Thickness of the vertical sides Espesor de los lados verticales - + Thickness of the horizontal sides Espesor de los lados horizontales - + Diameter of the beam Diámetro de la viga - + Thickness Espesor + - Thickness of the webs Espesor de la redes + - - + Thickness of the web Espesor de la red - + Thickness of the flanges Espesor de las bridas - + Width of the flanges Ancho de las bridas - - - + + + Thickness 1 Espesor 1 - - - + + + Thickness 2 Espesor 2 - - - + + + Thickness 3 Espesor 3 - - + + Width of the bottom flange Ancho inferior de la brida - - + + Width of the top flange Ancho superior de la brida - + Type of pipeFeature Tipo de característica de tubo - + Type of clamp Tipo de sujeción - + Size of clamp Tamaño de sujeción - + Arc diameter Diámetro de arco - + Overall height Altura total - + Rod diameter Diámetro de vástago - + Size of thread Tamaño de rosca - - + + Ports position relative to the origin of Shape Posición de los puertos relativos al origen de la forma - + Type of tubeFeature Tipo de característica de tubo - + Rating of pipeFeature Grado de característica de tubería - + Nominal diameter Diámetro nominal - + Flow factor (m3/h/bar) Factor de flujo (m3/h/bar) - + Tank's length Longitud de depósito - + Tank's width Ancho de depósito - + Tank's height Altura de depósito - + Thikness of tank's shell Espesor de carcasa del depósito - + Thikness of tank's top Espesor superior del depósito - + The tubes of the branch. Tubos de la derivación. - + The curves of the branch. Las curvas de la derivación. - - + + The path. La ruta. @@ -418,9 +418,9 @@ App::PropertyString - + The group. - El grupo. + El grupo. @@ -996,7 +996,7 @@ DialogQM - + Quick Insert Inserción rápida @@ -1292,66 +1292,15 @@ profile Tipo: - - Part::Feature - - - Simple curve - Curva simple - - - - Part::FeaturePython - - - Tube - Tubo - - - - Elbow - Codo - - - - Flange - Brida - - - - Reduction - Reducción - - - - U-Bolt - Tornillo U - - - - Tank - depósito - - - - Cap - Tapón - - - - Valve - válvula - - Quetzal_AdjustFrameAngle - + adjustFrameAngle Ajuste de ángulo de marcos - + Adjust the angle of frame by two edges Ajustar el ángulo del marco por medio de dos aristas @@ -1359,12 +1308,12 @@ profile Quetzal_AlignEdge - + Mate the edges Coindicir las aristas - + Join two edges: select two or pre-select several Unir dos aristas:selecciona dos o pre selecciona varias @@ -1372,418 +1321,418 @@ profile Quetzal_AlignFlange - + alignFlange - Alinear brida + Alinear brida - + Rotates the section of the beam to make the faces parallel to another face - Rota la sección de la viga para hacer las caras paralelas a otra cara + Rota la sección de la viga para hacer las caras paralelas a otra cara Quetzal_Attach2tube - + Attach to tube - Ligado al tubo + Ligado al tubo - + Attach one pype to the nearest port of selected pipe - Liga un tipo de tubería al puerto mas cercano de la tubería seleccionada + Liga un tipo de tubería al puerto mas cercano de la tubería seleccionada Quetzal_BreakPipe - + Break the pipe - Rompe la tubería + Rompe la tubería - + Break one pipe at point and insert gap - Dividir un tubo al punto e insertar un espacio + Dividir un tubo al punto e insertar un espacio Quetzal_CreateCutList - + createCutList - Crear lista de corte + Crear lista de corte - - Create a new Cut List from Dodo Beams - Crear una lista nueva de corte desde vigas dodo + + Create a new Cut List from Quetzal Beams + Crear una lista nueva de corte desde vigas Quetzal Quetzal_DpCalc - + Pressure loss calculator - Calculadora de Perdida de presion + Calculadora de Perdida de presion - + Calculate pressure loss in "pypes" using ChEDL libraries. See __doc__ of the module for futher information. - Calcular perdida de presión en tuberías utilizando biblioteca ChEDL. + Calcular perdida de presión en tuberías utilizando biblioteca ChEDL. Revisar __doc__ del modulo para mayor información. Quetzal_Extend - + extendTheBeam - Extender la viga + Extender la viga - + Extend the beam either to a face, a vertex or the c.o.m. of the selected object - Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado + Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado Quetzal_Extend1intersection - - + + Extends pipe to intersection - Extender tubo a la intersección + Extender tubo a la intersección Quetzal_Extend2intersection - - + + Extends pipes to intersection - Extender tubos a la intersección + Extender tubos a la intersección Quetzal_Flat - + Fit one elbow - Colocar un codo + Colocar un codo - + Place the elbow between two pipes or beams - Colocar un codo entre 2 tuberías o vigas + Colocar un codo entre 2 tuberías o vigas Quetzal_FrameBranchManager - + FrameBranch Manager - Gestor de marcos ramificados + Gestor de marcos ramificados - + Open FrameBranch Manager - Abre gestor de marcos + Abre gestor de marcos Quetzal_FrameIt - + Place one-beam over one-edge - Coloca una viga sobre una arista + Coloca una viga sobre una arista - + Place one beam after the other over the edges - Coloca una viga despues de las otras aristas + Coloca una viga despues de las otras aristas Quetzal_HackedL - + draw a DWire - Dibuja un Dwire + Dibuja un Dwire - + WP is re-positioned at each point. Possible to spin and offset it. - Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. + Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. Quetzal_InsertAnyz - + Insert any shape - Insertar cualquier forma + Insertar cualquier forma - + Insert a STEP, IGES or BREP - Insertar un solido STEP, IGES, BREP + Insertar un solido STEP, IGES, BREP Quetzal_InsertBranch - + Insert a branch - Insertar una ramificación + Insertar una ramificación - + Insert a PypeBranch - Insertar una derivación de tubería + Insertar una derivación de tubería Quetzal_InsertCap - - + + Insert a cap - Insertar un tapón + Insertar un tapón Quetzal_InsertElbow - - + + Insert a curve - Insertar una curva + Insertar una curva Quetzal_InsertFlange - - + + Insert a flange - Insertar una brida + Insertar una brida Quetzal_InsertPath - + insert Path - Insertar trayectoria + Insertar trayectoria - + Creates one path along selected edges - Crea una trayectoria a lo largo de la arista seleccionada + Crea una trayectoria a lo largo de la arista seleccionada Quetzal_InsertPipe - - + + Insert a tube - Insertar un tubo + Insertar un tubo Quetzal_InsertPypeLine - + PypeLine Manager - Gestor de línea de tubo + Gestor de línea de tubo - + Open PypeLine Manager - Abre gestor de tubería de línea + Abre gestor de tubería de línea Quetzal_InsertReduct - - + + Insert a reduction - Insertar una reducción + Insertar una reducción Quetzal_InsertRoute - + Insert a pipe route - Insertar una ruta de tubería + Insertar una ruta de tubería - + Create a sketch attached to a circular edge - Crea un boceto adjunta a una aristar circular + Crea un boceto adjunta a una aristar circular Quetzal_InsertSection - + Insert sections - Inserta secciónes + Inserta secciónes - + Creates customized beam profiles 2D - Crea un perfil de viga 2D personalizado + Crea un perfil de viga 2D personalizado Quetzal_InsertTank - + Insert a tank - Inserta un depósito + Inserta un depósito - + Create tank and nozzles - Crea un depósito y boquillas + Crea un depósito y boquillas Quetzal_InsertUbolt - - + + Insert a U-bolt - Insertar un tornillo U + Insertar un tornillo U Quetzal_InsertValve - - + + Insert a valve - Insertar una válvula + Insertar una válvula Quetzal_JoinPype - + Join pypes - Unir tubos + Unir tubos - + Select the part-pype and the port - Selecciona la pieza de tubería y el puerto + Selecciona la pieza de tubería y el puerto Quetzal_Laydown - + Lay-down the pipe - Empotra la tubería + Empotra la tubería - + Lay-down the pipe on the support plane - Empotra la tubería sobre el plano de soporte + Empotra la tubería sobre el plano de soporte Quetzal_LevelBeam - + Flush the surfaces - Empotrar las superficies + Empotrar las superficies - + Shift the beams to line-up the faces to the first selection (faces must be //) - Desplaza la viga para alinearla a la cara de la primera selección (caras deben ser paralelas) + Desplaza la viga para alinearla a la cara de la primera selección (caras deben ser paralelas) Quetzal_MakeHeader - + Connect to header - Conectar a la cabecera + Conectar a la cabecera - + Connect branches to one header pipe Branches and header's axes must be ortho - Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales Quetzal_MateEdges - + Mate pipes edges - Coincidir las aristas de las tuberías + Coincidir las aristas de las tuberías - + Mate two terminations through their edges - Coincidir dos terminaciones a través de sus aristas + Coincidir dos terminaciones a través de sus aristas Quetzal_MoveHandle - + Move objects - Mover objetos + Mover objetos - + Move quickly objects inside viewport - Mover objetos rapidamente dentro de la vista + Mover objetos rapidamente dentro de la vista Quetzal_MoveWorkPlane - + align Workplane - Alinear plano de trabajo + Alinear plano de trabajo - + Moves and rotates the drafting workplane with points, edges and faces - Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras + Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras Quetzal_OffsetWorkPlane - + Offset Work Plane - + Desfase de plano de trabajo - + Offset: - Desface: + Desface: - + offset Workplane - Desfasar plano de trabajo + Desfasar plano de trabajo - + Shifts the WP along its normal. Desplaza el plano de trabajo a lo largo de su normal. @@ -1791,203 +1740,193 @@ Branches and header's axes must be ortho Quetzal_PivotBeam - + pivotTheBeam - Pivotea la viga + Pivotea la viga - + Rotates the beam around an axis (edge or center-of-curvature) - Rota la viga alrededor de un eje (arista o centro de curvatura) + Rota la viga alrededor de un eje (arista o centro de curvatura) Quetzal_Point2point - + draw a tube point-to-point - Dibuja un tubo de punto a punto + Dibuja un tubo de punto a punto - + Click on subsequent points. - Da clic en puntos subsecuentes. + Da clic en puntos subsecuentes. Quetzal_QueryModel - + query the model - Consultar el modelo + Consultar el modelo - + Click objects to print infos - Cliquear objetos para imprimir información + Cliquear objetos para imprimir información Quetzal_Raiseup - + Raise-up the support - Eleva el soporte + Eleva el soporte - + Raise the support to the pipe - Eleva el soporte hacia la tubería + Eleva el soporte hacia la tubería Quetzal_ReverseBeam - + Reverse orientation - Invertir orientación + Invertir orientación - + Reverse the orientation of selected objects - Invertir orientación a los objetos seleccionados + Invertir orientación a los objetos seleccionados Quetzal_RotJoin - + rotJoinEdge - Rotar arista de unión + Rotar arista de unión - + Rotates and align the beam according another edge - Rota y alinea la viga acorde a otra arista + Rota y alinea la viga acorde a otra arista Quetzal_RotateWorkPlane - + rotate Workplane - Rotar plano de trabajo + Rotar plano de trabajo - + Spin the Draft working plane about one of its axes - Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes + Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes Quetzal_SelectSolids - + Select solids - Seleccionar solidos + Seleccionar solidos - + Grab all solids or those partially selected to export in .step format - Sujeta todos los solidos parcialmente seleccionados + Sujeta todos los solidos parcialmente seleccionados para exportar en formato step Quetzal_ShiftBeam - + shiftTheBeam - Desplaza la viga + Desplaza la viga - + Translate objects by vectors defined on existing geometry - Traslada el objeto por vectores definidos sobre la geometría existente + Traslada el objeto por vectores definidos sobre la geometría existente Quetzal_SpinSect - + Spin beams by 45 deg. - Gira viga a 45 grados. + Gira viga a 45 grados. - + Rotates the section of the beam by 45 degrees - Rota la sección de la viga a 45 grados + Rota la sección de la viga a 45 grados Quetzal_StretchBeam - + stretchTheBeam - Estira la viga + Estira la viga - + Changes the length of the beam, either according a preselected edge or a direct input - Cambia la longitud de la viga, ya sea acorde a la arista preseleccionada o una entrada directa - - - - Sketcher::SketchObject - - - pipeRoute - Ruta tubería + Cambia la longitud de la viga, ya sea acorde a la arista preseleccionada o una entrada directa Workbench - Dodo - Dodo + Quetzal + Quetzal - - Dodo workbench -(substitute of flamingo for Py3/Qt5) - Banco de trabajo Dodo -(sustituto de flamingo para Python3/Qt5) + + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + Quetzal es la bifurcacion del banco de trabajo Dodo para FreeCAD. Extendiendo soporte al banco de trabajo Dodo y agregando soporte de traduccion. - + pypetools Herramientas de tubería - + Frame tools Herramientas para estructuras - + Pype tools Herramientas para tuberías - - + + Utils Utilidades - - QkMenus - Menús QM + + QM Menus + Menus QM - + Frames Marcos - + Pypes Tuberías @@ -1995,35 +1934,41 @@ para exportar en formato step breakForm - + Break the pipes Romper las tuberías - + Length longitud - + <reference> <referencia> - + PypeLine: Linea de tubo: - + + <none> <ninguno> + + + <new> + <nuevo> + capQM - + QM for caps QM para tapones @@ -2031,49 +1976,49 @@ para exportar en formato step dpCalcDialog - - + + *** CUSTOM FLUID *** *** FLUIDO PERSONALIZADO *** - + <custom fluid> <Fluido personalizado> - - + + No data found Datos no encontrados - + It seems the fluid has not a liquid state. Parece que el fluido no tiene un estado liquido. - + *** LIQUID *** *** LIQUIDO *** - + Flow (m3/h) Flujo (m3/h) - + It seems the fluid has not a gas state. Parece que el fluido no tiene un estado gaseoso. - + *** GAS/VAPOUR *** *** GAS/VAPOR *** - + Flow (kg/h) Flujo (kg/h) @@ -2081,7 +2026,7 @@ para exportar en formato step elbowQM - + QM for elbows QM para codos @@ -2089,76 +2034,76 @@ para exportar en formato step fObservers - + Select one beam and one edge Seleccionar una viga y un borde - + First select the base beam, then the edges Primero seleccionar la base, luego los bordes - + First select the target plane, then the faces to align Primero seleccionar el plano objetivo, luego las caras a alinear - + levelTheBeam Transaction Nivelar la viga - + Select the target face, then the others Seleccionar la cara objetivo, luego las otras - + alignFlange Transaction Alinear brida - + Select two edges to join. Seleccionar dos bordes para unir. - + joinTheBeamsEdges Transaction Unir los bordes de las vigas - + Select the beam and input the length Selecciona la viga y la entrada de la longitud - + First Select the target shape, then the beams to extend. Primero selecciona la forma objetivo, luego la viga a extender. - + Select 2 edges Seleccionar 2 bordes - + Adjust angle Transaction Ajustar ángulo - + Select 2 edges =>[Ctrl]+select Seleccionar 2 bordes =>[Ctrl]+seleccionar - + rotJoin Transaction Rotar unión @@ -2167,7 +2112,7 @@ para exportar en formato step flangeQM - + QM for flanges QM para bridas @@ -2175,17 +2120,17 @@ para exportar en formato step insertBranchForm - + Insert a branch Insertar una ramificación - + <name> <nombre> - + <bend radius> <radio de doblez> @@ -2193,17 +2138,17 @@ para exportar en formato step insertCapForm - + Insert caps Insertar tapones - + Reverse Invertir - + Apply Aplicar @@ -2211,49 +2156,49 @@ para exportar en formato step insertElbowForm - + Insert elbows Insertar codos - + <bend angle> <ángulo de doblez> - + <bend radius> <radio de doblez> - + Trim/Extend Cortar/Extender - + Reverse Invertir - + Apply Aplicar - + 0 deg 0 grados - + Wrong selection Selección equivocada - + deg grados @@ -2261,17 +2206,17 @@ para exportar en formato step insertFlangeForm - + Insert flanges Insertar bridas - + Reverse Invertir - + Apply Aplicar @@ -2279,22 +2224,22 @@ para exportar en formato step insertPipeForm - + Insert pipes Insertar tubería - + <length> <Longitud> - + Reverse Invertir - + Apply Aplicar @@ -2302,42 +2247,48 @@ para exportar en formato step insertPypeLineForm - + PypeLine Manager Gestor de línea de tubo - + <name> <nombre> - + Redraw Redibujar - + Part list Lista de parte - + Color Color - + Get Path Obtener trayectoria - + Get Profile Obtener perfil - + + + + + + + <new> <nuevo> @@ -2345,22 +2296,22 @@ para exportar en formato step insertReductForm - + Insert reductions Insertar reducciones - + Reverse Invertir - + Apply Aplicar - + Eccentric Excéntrico @@ -2368,7 +2319,7 @@ para exportar en formato step insertRouteForm - + <select an edge> <seleccionar un borde> @@ -2376,22 +2327,22 @@ para exportar en formato step insertTankForm - + doing combine Haciendo combinado - + files read leer archivos - + files not read no leer archivos - + listNozzles: %s Lista de boquillas: %s @@ -2399,32 +2350,32 @@ para exportar en formato step insertUboltForm - + Insert U-bolt Insertar tornillo U - + - no ref. face - Sin cara de referencia - + Ref. face Cara de referencia - + Head Cabecera - + Middle Medio - + Tail Cola @@ -2432,22 +2383,22 @@ para exportar en formato step insertValveForm - + Insert valves Insertar válvulas - + Reverse Invertir - + Apply Aplicar - + Insert in pipe Insertar en tubo @@ -2455,7 +2406,7 @@ para exportar en formato step makeframenbranch - + Travatura Estructura @@ -2463,7 +2414,7 @@ para exportar en formato step mouseActionB1 - + ____TAIL ____COLA @@ -2471,12 +2422,12 @@ para exportar en formato step pForms - + Offset Work Plane Desface de plano de trabajo - + Offset: Desface: @@ -2484,7 +2435,7 @@ para exportar en formato step pipeQM - + QM for pipes QM para tuberías @@ -2492,12 +2443,12 @@ para exportar en formato step point2pointPipe - + Reset Reiniciar - + Move WP on click Mover plano de trabajo al clic @@ -2505,67 +2456,67 @@ para exportar en formato step profEdit - + Square Profile name in the Tree View Rectangular - + T-profile Profile name in the Tree View Perfil T - + U-profile Profile name in the Tree View Perfil U - + H-profile Profile name in the Tree View Perfil H - + L-profile Profile name in the Tree View Perfil L - + Z-profile Profile name in the Tree View Perfil Z - + Omega-profile Profile name in the Tree View Perfil Omega - + Circle-profile Profile name in the Tree View Perfil circular - + Insert profile Transaction, used on undo/redo lists Insertar perfil - + Modify profile Transaction, used on undo/redo lists Modificar perfil - + Shift profile Transaction, used on undo/redo lists Gira perfil @@ -2574,13 +2525,13 @@ para exportar en formato step protoPypeForm - - + + Rating: Grado: - + Insert Insertar @@ -2588,17 +2539,17 @@ para exportar en formato step protoTypeDialog - + "%s" to select; "%s" to execute "%s" para seleccionar; "%s" para ejecutar - + No view available. Vista no disponible. - + Actions "%s" and "%s" removed Acciones "%s" y "%s" eliminado @@ -2606,12 +2557,12 @@ para exportar en formato step rotWPForm - + Angle: Ángulo: - + Rotate working plane Rotar plano de trabajo @@ -2619,18 +2570,18 @@ para exportar en formato step uCmd - + Quick move Transaction Movimiento rápido - + Offset Work Plane Desfasar plano de trabajo - + Offset: Desface: @@ -2638,72 +2589,72 @@ para exportar en formato step uForms - + QueryTool Herramienta de consulta - + (Select a object) (Seleccionar un objeto) - + (base) (base) - + Base: Base: - + (angle) (ángulo) - + Rotation angle: Ángulo de rotación: - + v = (x,y,z) v = (x,y,z) - + Rotation axis: Eje de rotación: - + (Sub object property) (Propiedad de sub objeto) - + (Beam property) (Propiedad de viga) - + (Profile property) (Propiedad de perfil) - + QueryObject Consulta de objeto - + Exit Salir - + Rotate WP Rotar plano de trabajo @@ -2711,7 +2662,7 @@ para exportar en formato step valveQM - + QM for valves QM para válvulas From 480b2f7081375ece4e8fd28f14b0b278f493d043 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Fri, 1 Nov 2024 22:01:51 -0600 Subject: [PATCH 073/135] Added miter corner feature & carry returns +carry return on dodo console messages +new miter feature automatically remove a diagonal volume --- dialogz/fbranch.ui | 13 ++- dodoDialogs.py | 8 +- fCmd.py | 9 ++ fFeatures.py | 232 ++++++++++++++++++++++++++++++--------------- 4 files changed, 178 insertions(+), 84 deletions(-) diff --git a/dialogz/fbranch.ui b/dialogz/fbranch.ui index 96dd951..9bf5ee8 100644 --- a/dialogz/fbranch.ui +++ b/dialogz/fbranch.ui @@ -7,7 +7,7 @@ 0 0 290 - 504 + 550
@@ -187,9 +187,9 @@
- + - Slice Intersections + Generate planes @@ -238,6 +238,13 @@
+ + + + Cut Miters + + +
diff --git a/dodoDialogs.py b/dodoDialogs.py index 39a5bbe..5c5d0e2 100644 --- a/dodoDialogs.py +++ b/dodoDialogs.py @@ -5,8 +5,8 @@ import FreeCAD import FreeCADGui -from PySide2.QtCore import * -from PySide2.QtGui import * +from PySide.QtCore import * +from PySide.QtGui import * translate = FreeCAD.Qt.translate @@ -38,7 +38,7 @@ def __init__(self, dialog="anyFile.ui"): % ( self.actionS.shortcuts()[0].toString(), self.actionX.shortcuts()[0].toString(), - ) + )+'\r\n' ) try: self.view = FreeCADGui.activeDocument().activeView() @@ -84,7 +84,7 @@ def reject(self): self.mw.removeAction(self.actionS) FreeCAD.Console.PrintMessage( translate("protoTypeDialog", 'Actions "%s" and "%s" removed') - % (self.actionX.objectName(), self.actionS.objectName()) + % (self.actionX.objectName(), self.actionS.objectName())+'\r\n' ) try: self.view.removeEventCallback("SoMouseButtonEvent", self.call) diff --git a/fCmd.py b/fCmd.py index c655b67..311769c 100644 --- a/fCmd.py +++ b/fCmd.py @@ -427,6 +427,11 @@ def rotjoinTheBeam(beam=None,e1=None,e2=None): beam.Placement.move(rounded(dist+rot.multVec(delta))) def getSolids(allDoc=True): + ''' + Get solid objects inside the active document o just selected solid objects based on alldoc parameter config + + return solid objects into selection class + ''' if allDoc: objects=FreeCAD.ActiveDocument.Objects else: @@ -437,6 +442,10 @@ def getSolids(allDoc=True): FreeCADGui.Selection.addSelection(o) def getFaces(allDoc=True): + ''' + Get faces from whole document or treview o viewport selection based on alldoc parameter config + return faces into selection class + ''' if allDoc: objects=FreeCAD.ActiveDocument.Objects else: diff --git a/fFeatures.py b/fFeatures.py index 161a935..2931ed8 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -6,7 +6,7 @@ __license__ = "LGPL 3" import csv -from math import degrees +from math import degrees, frexp from os import listdir from os.path import abspath, dirname, join @@ -471,7 +471,8 @@ def __init__(self): self.form.comboRatings.currentIndexChanged.connect(self.fillSizes) self.form.btnRemove.clicked.connect(self.removeBeams) self.form.btnAdd.clicked.connect(self.addBeams) - self.form.slicebtn.clicked.connect(self.makeMiter) + self.form.btnGenPlanes.clicked.connect(self.generateBisectPlanes) + self.form.btnMiter.clicked.connect(self.cutMiters) self.form.btnProfile.clicked.connect(self.changeProfile) self.form.btnRefresh.clicked.connect(self.refresh) self.form.btnTargets.clicked.connect(self.selectAction) @@ -531,87 +532,164 @@ def makeSingle(self): beam.Height = float(self.form.editLength.text()) FreeCAD.ActiveDocument.recompute() - def cutcorners(self): + def cutMiters(self): import ArchCutPlane + volumes = list() + totalvertexes=0 sel=FreeCADGui.Selection.getSelection() - seldoc=FreeCADGui.ActiveDocument - if sel[0].FType=='FrameBranch': - pass - # for beam in sel[0].Beams: - # if seldoc.: - # pass - # ArchCutPlane.cutComponentwithPlane(beam,) - - def makeMiter(self): + seldoc=FreeCAD.ActiveDocument + miterplanesfaces=self.getMiterPlanesFaces(seldoc) + framebeams=self.getBeamsFromStructureNames(sel) + for beam in framebeams: + for miterplaneface in miterplanesfaces: + matchpoints=False + sketcher=beam.AttachmentSupport[0][0] + edgename=beam.AttachmentSupport[0][1][0] + index=int(edgename[4:])-1 + if self.roundVectors(miterplaneface.CenterOfMass,4) == self.roundVectors(sketcher.Shape.Edges[index].Vertexes[0].Point,4): + matchpoints=True + totalvertexes=totalvertexes+1 + elif self.roundVectors(miterplaneface.CenterOfMass,4) == self.roundVectors(sketcher.Shape.Edges[index].Vertexes[1].Point,4): + matchpoints=True + totalvertexes=totalvertexes+1 + if matchpoints: + # FreeCAD.Console.PrintMessage('Plano: '+str()+'\r') + ArchCutPlane.cutComponentwithPlane(beam,miterplaneface, side=0) + FreeCAD.ActiveDocument.recompute() + volumes.append(beam.Shape.Volume) + self.removeCutVolume(beam) + ArchCutPlane.cutComponentwithPlane(beam,miterplaneface, side=1) + FreeCAD.ActiveDocument.recompute() + volumes.append(beam.Shape.Volume) + # volumes.sort() + if volumes[0]< volumes[1]: + FreeCAD.Console.PrintMessage(str(beam.Name)+' volume1: '+str(volumes[0])+'< volume2: '+str(volumes[1])+'\r') + FreeCAD.ActiveDocument.recompute() + elif volumes[0]> volumes[1]: + self.removeCutVolume(beam) + ArchCutPlane.cutComponentwithPlane(beam,miterplaneface, side=0) + FreeCAD.Console.PrintMessage(str(beam.Name)+' volume1: '+str(volumes[0])+'> volume2: '+str(volumes[1])+'\r') + FreeCAD.ActiveDocument.recompute() + volumes.clear() + FreeCAD.Console.PrintMessage('totalvertexes: '+str(totalvertexes)) + + def removeCutVolume(self,beam): + cutvolumeitems= list() + cutvolumeid = list() + for obj in beam.OutList: + if obj.TypeId=='Part::Feature' and obj.Label.startswith('CutVolume'): + cutvolumeid.append(obj.ID) + cutvolumeitems.append(obj) + cutvolumeid.sort(reverse=True) + lastobj=cutvolumeid[0] + for obj in beam.OutList: + if obj.TypeId=='Part::Feature' and obj.Label.startswith('CutVolume') and obj.ID == lastobj: + FreeCAD.ActiveDocument.removeObject(obj.Label) + FreeCAD.ActiveDocument.recompute() + + def getBeamsFromStructureNames(self,sel): + ''' + Return a list with beam Structures on a frameBranch object type + ''' + framebeams = list() + if hasattr(sel[0],"FType"): + for beamname in sel[0].Beams: + beam=FreeCAD.ActiveDocument.getObject(beamname) + framebeams.append(beam) + return framebeams + + def getMiterPlanesFaces(self,seldoc): + ''' + Return a list with plane named 'cutplane' from the whole seldoc + ''' + miterplanes = list() + for object in seldoc.Objects: + if object.Name.startswith('cutplane'): + miterplanes.append(object.Shape.Faces[0]) + return miterplanes + + def roundVectors(self,vxlist, num): + l = [v for v in vxlist] + return FreeCAD.Vector(round(l[0], num), round(l[1], num), round(l[2], num)) + + def generateBisectPlanes(self): """Get intersection between lines, generate a plane between lines & do a boolean diferente""" sel = FreeCADGui.Selection.getSelection() + from DraftGeomUtils import findIntersection # FreeCAD.Console.PrintMessage('posicion de boceto:'+ str(sel[0].Placement.Rotation)+'\r\n') i=0 - intersectlines=[] - for element in sel[0].Geometry: - j=0 - for subelement in sel[0].Geometry: - if (element.EndPoint != subelement.EndPoint) and (element.StartPoint != subelement.StartPoint): - if element.intersectCC(subelement): - # intersectlines.append(element) - # intersectlines.append(subelement) - interpoint=element.intersectCC(subelement)[0] - # intersectpoint=FreeCAD.Vector(interpoint.X,interpoint.Y,interpoint.Z) - FreeCAD.Console.PrintMessage('Segmento '+str(element)+' intersecta con segmento '+str(subelement)+' aqui:'+ str(interpoint)+'\r\n') - resultv1=FreeCAD.Vector(element.EndPoint-element.StartPoint) - resultv2=FreeCAD.Vector(subelement.EndPoint-subelement.StartPoint) - bisectvector=fCmd.bisect(resultv1,resultv2) - plane=FreeCAD.activeDocument().addObject("Part::Plane","myplane") - plane.AttachmentSupport = sel[0].AttachmentSupport - plane.MapMode = 'FlatFace' - self.rotvector = element.StartPoint-FreeCAD.Vector(0,plane.Length/2,-plane.Length/2) - plane.recompute() - # self.CenterOfMass = plane.Shape.CenterOfMass - self.placementrotplan = FreeCAD.Placement(self.rotvector,FreeCAD.Rotation(FreeCAD.Vector(0,1,0),90)) - plane.AttachmentOffset = self.placementrotplan - # FreeCAD.Console.PrintMessage('Antes Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') - self.placementrelative = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)),element.StartPoint).multiply(self.placementrotplan) - self.placementfinal = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),90),element.StartPoint).multiply(self.placementrelative) - plane.AttachmentOffset = self.placementfinal - j=j+1 - # TODO::Remove code inside if False condicion ones plane bisec each sketch corner - if False: - vend1=FreeCAD.Vector(sel[0].Geometry[i-1].EndPoint) - vstart1=FreeCAD.Vector(sel[0].Geometry[i-1].StartPoint) - resultv1=vend1-vstart1 - vend2=FreeCAD.Vector(sel[0].Geometry[i].EndPoint) - vstart2=FreeCAD.Vector(sel[0].Geometry[i].StartPoint) - resultv2=vend2-vstart2 - crossvector=resultv1.cross(resultv2) - # FreeCAD.Console.PrintMessage(crossvector.Length) - bisectvector=fCmd.bisect(resultv1,resultv2) - # FreeCAD.Console.PrintMessage(intersectpoint) - # FreeCAD.Console.PrintMessage(crossvector) - # linseg=Part.LineSegment(intersectpoint,crossvector) - # linseg=Part.LineSegment(intersectpoint,bisectvector) - # obj=FreeCAD.ActiveDocument.addObject("Part::Feature", "Line") - # obj.Shape = linseg.toShape() - # obj.Placement = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(1,0,0),90)) - plane=FreeCAD.activeDocument().addObject("Part::Plane","myplane") - plane.AttachmentSupport = sel[0].AttachmentSupport - plane.MapMode = 'FlatFace' - self.rotvector = element.StartPoint-FreeCAD.Vector(0,plane.Length/2,-plane.Length/2) - plane.recompute() - # self.CenterOfMass = plane.Shape.CenterOfMass - self.placementrotplan = FreeCAD.Placement(self.rotvector,FreeCAD.Rotation(FreeCAD.Vector(0,1,0),90)) - plane.AttachmentOffset = self.placementrotplan - # FreeCAD.Console.PrintMessage('Antes Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') - self.placementrelative = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)),element.StartPoint).multiply(self.placementrotplan) - self.placementfinal = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),90),element.StartPoint).multiply(self.placementrelative) - plane.AttachmentOffset = self.placementfinal - # if i==0: - # FreeCADGui.ActiveDocument.myplane.PointSize = 10 - # FreeCADGui.ActiveDocument.myplane.PointColor = 100,50,20 - # elif i>=1: - # obj=FreeCADGui.ActiveDocument.getObject('myplane00'+str(i)) - # obj.PointSize = 10 - # obj.PointColor = 100,50,20 - i=i+1 + reachedlines = [] + interVertex = [] + if sel[0].FType == 'FrameBranch': + for element in sel[0].Base.Geometry: + # FreeCAD.Console.PrintMessage('Segmento '+str(element)+'\r\n') + for subelement in sel[0].Base.Geometry: + if element.EndPoint != subelement.EndPoint or element.StartPoint != subelement.StartPoint or (element.EndPoint != subelement.EndPoint and element.StartPoint != subelement.StartPoint): + #WARN:intersectionCLines method forces to detect infinite intersections that is not required + # interVertex=fCmd.intersectionCLines(element.toShape().Edges[0],subelement.toShape().Edges[0]) + interVertex=findIntersection(element.toShape().Edges[0],subelement.toShape().Edges[0],infinite1=False, infinite2=False) + if interVertex: + if interVertex[0] not in reachedlines: + # FreeCAD.Console.PrintMessage('Punto de interseccion: '+str(interVertex[0])+'\r\n') + roundelementStart=self.roundVectors(element.StartPoint,2) + roundelementEnd=self.roundVectors(element.EndPoint,2) + roundsubelementStart=self.roundVectors(subelement.StartPoint,2) + roundsubelementEnd=self.roundVectors(subelement.EndPoint,2) + roundinterVertex=self.roundVectors(interVertex[0],2) + reachedlines.append(interVertex[0]) + # FIXME: intersectCC method does not return line intersection; findIntersection method does it right + # interpoint=element.intersectCC(subelement)[0] + + # FreeCAD.Console.PrintMessage('Segmento '+str(element)+' intersecta con segmento '+str(subelement)+' aqui:'+ str(interpoint)+'\r\n') + # FreeCAD.Console.PrintMessage(str(type(interpoint))) + # INFO:Section aided to get bisect vector on each intersection + if roundelementStart== roundinterVertex: + resultv1 = FreeCAD.Vector(element.EndPoint-element.StartPoint) + elif roundelementEnd == roundinterVertex: + resultv1 = FreeCAD.Vector(element.StartPoint-element.EndPoint) + if roundsubelementStart == roundinterVertex: + resultv2 = FreeCAD.Vector(subelement.EndPoint-subelement.StartPoint) + elif roundsubelementEnd == roundinterVertex: + resultv2 = FreeCAD.Vector(subelement.StartPoint-subelement.EndPoint) + bisectvector=fCmd.bisect(resultv1,resultv2) + plane=FreeCAD.activeDocument().addObject("Part::Plane","cutplane") + import numpy + from math import pi + plane.AttachmentSupport = sel[0].Base.AttachmentSupport + plane.MapMode = 'FlatFace' + self.rotvector =(interVertex[0])-(FreeCAD.Vector(0,plane.Length/2,-plane.Length/2)) + # INFO: Section aided to apply random color to each plane + randomcolorarray=numpy.random.choice(range(256),size=3) + plane.ViewObject.ShapeAppearance = FreeCAD.Material(DiffuseColor= tuple(map(int,randomcolorarray))) + plane.recompute() + # self.CenterOfMass = plane.Shape.CenterOfMass + # INFO:Section aided to get the correct plane orientation on each intersection + self.placementrotplan = FreeCAD.Placement(self.rotvector,FreeCAD.Rotation(FreeCAD.Vector(0,1,0),90)) + plane.AttachmentOffset = self.placementrotplan + # FreeCAD.Console.PrintMessage('Antes Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') + # crossvector=resultv1.cross(resultv2).normalize() + # FreeCAD.Console.PrintMessage('Vector cruz: '+str(crossvector)+'\r\n') + # FreeCAD.Console.PrintMessage('Vector normal de plano: '+str(self.roundVectors(plane.Shape.normalAt(0,0),2))+'\r\n') + self.placementrelative = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(plane.Shape.normalAt(0,0),bisectvector),interVertex[0]).multiply(self.placementrotplan) + # plane.AttachmentOffset = self.placementrelative + # FreeCAD.Console.PrintMessage('Despues Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') + if self.roundVectors(plane.Shape.normalAt(0,0),0) == FreeCAD.Vector(1.0, 0.0, 0.0): + rotateplane=90 + else: + rotateplane=0 + self.placementfinal = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),rotateplane),interVertex[0]).multiply(self.placementrelative) + plane.AttachmentOffset = self.placementfinal + # FreeCAD.Console.PrintMessage(str(plane.Name)) + # sel[0].cutplanes.append(plane.Name) + # TODO::Made method definition to change plane dots colors + # if i==0: + # FreeCADGui.ActiveDocument.myplane.PointSize = 10 + # FreeCADGui.ActiveDocument.myplane.PointColor = 100,50,20 + # elif i>=1: + # obj=FreeCADGui.ActiveDocument.getObject('myplane00'+str(i)) + # obj.PointSize = 10 + # obj.PointColor = 100,50,20 + i=i+1 def accept(self): if FreeCAD.ActiveDocument: From 8d8cb5409b431d6a089f4a1a214ef9c0e7c78bd1 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 3 Nov 2024 21:29:16 -0600 Subject: [PATCH 074/135] Bump version of pre-commit hooks --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5d9f466..686e69c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,7 +4,7 @@ # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -12,12 +12,12 @@ repos: - id: check-added-large-files - id: mixed-line-ending - repo: https://github.com/psf/black - rev: 24.4.2 + rev: 24.10.0 hooks: - id: black args: ["--line-length", "100"] - repo: https://github.com/codespell-project/codespell - rev: v2.1.0 + rev: v2.3.0 hooks: - id: codespell files: ^.*\.(py|md|sh|ui|yml|xml)$ From 68d9a2a32f9ad36cabed6a4794cf0b09e72c857a Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 3 Nov 2024 21:43:40 -0600 Subject: [PATCH 075/135] Apply "black", 100 char line width style to Python files Used pre-commit --- CFrame.py | 828 +++++++++++++--------- CUtils.py | 12 +- Init.py | 47 +- anyShapez.py | 290 ++++---- cut_list/__init__.py | 47 +- cut_list/cut_list_creation.py | 121 ++-- cut_list/cut_list_ui.py | 84 ++- cut_list/resultSpreadsheet.py | 35 +- dodoDialogs.py | 23 +- dodoPM.py | 37 +- fCmd.py | 891 ++++++++++++----------- fForms.py | 1242 ++++++++++++++++++--------------- fObservers.py | 35 +- pCmd.py | 84 +-- pFeatures.py | 188 +++-- pForms.py | 161 ++--- pObservers.py | 194 ++--- uCmd.py | 52 +- uForms.py | 67 +- 19 files changed, 2304 insertions(+), 2134 deletions(-) diff --git a/CFrame.py b/CFrame.py index a6154fe..8b4c8df 100644 --- a/CFrame.py +++ b/CFrame.py @@ -1,9 +1,9 @@ -#(c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD -__title__="frameTools toolbar" -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" +__title__ = "frameTools toolbar" +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" # import FreeCAD modules import FreeCAD @@ -18,382 +18,520 @@ # FreeCAD TemplatePyMod module # (c) 2007 Juergen Riegel LGPL -def addCommand(name,cmdObject): - (list,num) = inspect.getsourcelines(cmdObject.Activated) - pos = 0 - # check for indentation - while(list[1][pos] == ' ' or list[1][pos] == '\t'): - pos += 1 - source = "" - for i in range(len(list)-1): - source += list[i+1][pos:] - FreeCADGui.addCommand(name,cmdObject,source) - -#--------------------------------------------------------------------------- + +def addCommand(name, cmdObject): + (list, num) = inspect.getsourcelines(cmdObject.Activated) + pos = 0 + # check for indentation + while list[1][pos] == " " or list[1][pos] == "\t": + pos += 1 + source = "" + for i in range(len(list) - 1): + source += list[i + 1][pos:] + FreeCADGui.addCommand(name, cmdObject, source) + + +# --------------------------------------------------------------------------- # The command classes -#--------------------------------------------------------------------------- +# --------------------------------------------------------------------------- + class frameIt: - ''' - Given a beam object and an edge in the model, this tool lay down the - beam over the edge by selecting them one after the other until ESC is - pressed. - ''' - def Activated(self): - import FreeCAD, FreeCADGui, fObservers, fCmd - s=fObservers.frameItObserver() - FreeCADGui.Selection.addObserver(s) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamFit.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_FrameIt",'Place one-beam over one-edge'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_FrameIt",'Place one beam after the other over the edges')} + """ + Given a beam object and an edge in the model, this tool lay down the + beam over the edge by selecting them one after the other until ESC is + pressed. + """ + + def Activated(self): + import FreeCAD, FreeCADGui, fObservers, fCmd + + s = fObservers.frameItObserver() + FreeCADGui.Selection.addObserver(s) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "beamFit.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_FrameIt", "Place one-beam over one-edge"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_FrameIt", "Place one beam after the other over the edges" + ), + } + class spinSect: - ''' - Tool to spin one object around the "Z" axis of its shape - by 45 degrees. - ''' - def Activated(self): - import FreeCAD, FreeCADGui, fCmd, pCmd - from math import pi - FreeCAD.activeDocument().openTransaction('Spin') - for beam in FreeCADGui.Selection.getSelection(): - pCmd.rotateTheTubeAx(beam) - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamRot.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_SpinSect",'Spin beams by 45 deg.'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_SpinSect",'Rotates the section of the beam by 45 degrees')} + """ + Tool to spin one object around the "Z" axis of its shape + by 45 degrees. + """ + + def Activated(self): + import FreeCAD, FreeCADGui, fCmd, pCmd + from math import pi + + FreeCAD.activeDocument().openTransaction("Spin") + for beam in FreeCADGui.Selection.getSelection(): + pCmd.rotateTheTubeAx(beam) + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "beamRot.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_SpinSect", "Spin beams by 45 deg."), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_SpinSect", "Rotates the section of the beam by 45 degrees" + ), + } + class reverseBeam: - ''' - Tool to spin one object around the "X" axis of its shape - by 180 degrees. - Note: - if one edge of the object is selected, that is used - as the pivot of rotation. - ''' - def Activated(self): - import FreeCAD, FreeCADGui, pCmd - FreeCAD.activeDocument().openTransaction('Reverse') - for objEx in FreeCADGui.Selection.getSelectionEx(): - pCmd.reverseTheTube(objEx) - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","reverse.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_ReverseBeam",'Reverse orientation'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_ReverseBeam",'Reverse the orientation of selected objects')} + """ + Tool to spin one object around the "X" axis of its shape + by 180 degrees. + Note: - if one edge of the object is selected, that is used + as the pivot of rotation. + """ + + def Activated(self): + import FreeCAD, FreeCADGui, pCmd + + FreeCAD.activeDocument().openTransaction("Reverse") + for objEx in FreeCADGui.Selection.getSelectionEx(): + pCmd.reverseTheTube(objEx) + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "reverse.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_ReverseBeam", "Reverse orientation"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_ReverseBeam", "Reverse the orientation of selected objects" + ), + } + # class fillFrame: - # ''' - # Dialog to create over multiple edges selected in the viewport the - # beams of the type of that previously chosen among those present - # in the model. - # ''' - # def Activated(self): - # import fForms - # #frameFormObj=fForms.fillForm() - # FreeCADGui.Control.showDialog(fForms.fillForm()) - - # def GetResources(self): - # return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","fillFrame.svg"),'MenuText':'Fill the frame','ToolTip':'Fill the sketch of the frame with the selected beam'} +# ''' +# Dialog to create over multiple edges selected in the viewport the +# beams of the type of that previously chosen among those present +# in the model. +# ''' +# def Activated(self): +# import fForms +# #frameFormObj=fForms.fillForm() +# FreeCADGui.Control.showDialog(fForms.fillForm()) + +# def GetResources(self): +# return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","fillFrame.svg"),'MenuText':'Fill the frame','ToolTip':'Fill the sketch of the frame with the selected beam'} + class alignFlange: - ''' - Tool to rotate beams (or other objects) so that their surfaces are - parallel to one reference plane. - If multiple faces are preselected, objects will be rotated according - the first face in the selections set. Otherwise the program prompts - to select one reference face and then the faces to be reoriented until - ESC is pressed. - ''' - def Activated(self): - import fForms - FreeCADGui.Control.showDialog(fForms.alignForm()) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","flangeAlign.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_AlignFlange",'alignFlange'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_AlignFlange",'Rotates the section of the beam to make the faces parallel to another face')} + """ + Tool to rotate beams (or other objects) so that their surfaces are + parallel to one reference plane. + If multiple faces are preselected, objects will be rotated according + the first face in the selections set. Otherwise the program prompts + to select one reference face and then the faces to be reoriented until + ESC is pressed. + """ + + def Activated(self): + import fForms + + FreeCADGui.Control.showDialog(fForms.alignForm()) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "flangeAlign.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_AlignFlange", "alignFlange"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_AlignFlange", + "Rotates the section of the beam to make the faces parallel to another face", + ), + } + class shiftBeam: - ''' - Dialog to translate and copy objects. - * "x/y/z" textboxes: direct input of amount of translation in each - direction. - * "Multiple" textbox: the multiple coefficient of the translation - amount. - * "Steps" textbox: the denominator of the translation amount. It's - used when the amount of translation is to be covered in some steps. - * "move/copy" radiobuttons: to select if the selected objects shall - be copied or only translated. - * [Displacement] button: takes the amount and direction of translation - from the distance of selected entities (points, edges, faces). - * [Vector] button: defines the amount and direction of translation - by the orientation and length of the selected edge. - * [OK] button: execute the translation - * [Cancel]: exits - ''' - def Activated(self): - import fForms - #frameFormObj=fForms.translateForm() - FreeCADGui.Control.showDialog(fForms.translateForm()) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamShift.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_ShiftBeam",'shiftTheBeam'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_ShiftBeam",'Translate objects by vectors defined on existing geometry')} + """ + Dialog to translate and copy objects. + * "x/y/z" textboxes: direct input of amount of translation in each + direction. + * "Multiple" textbox: the multiple coefficient of the translation + amount. + * "Steps" textbox: the denominator of the translation amount. It's + used when the amount of translation is to be covered in some steps. + * "move/copy" radiobuttons: to select if the selected objects shall + be copied or only translated. + * [Displacement] button: takes the amount and direction of translation + from the distance of selected entities (points, edges, faces). + * [Vector] button: defines the amount and direction of translation + by the orientation and length of the selected edge. + * [OK] button: execute the translation + * [Cancel]: exits + """ + + def Activated(self): + import fForms + + # frameFormObj=fForms.translateForm() + FreeCADGui.Control.showDialog(fForms.translateForm()) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "beamShift.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_ShiftBeam", "shiftTheBeam"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_ShiftBeam", "Translate objects by vectors defined on existing geometry" + ), + } + class levelBeam: - ''' - Tool to flush the parallel faces of two objects. - - Note: - actually the command takes to the same level, respect the - position and orientation of the first face selected, the center-of-mass - of all faces selected. Thus it translates the objects even if the - faces are not parallel. - ''' - def Activated(self): - import FreeCAD, FreeCADGui, fCmd, fObservers - selex=Gui.Selection.getSelectionEx() - faces=fCmd.faces(selex) - beams=[sx.Object for sx in selex] - if len(faces)==len(beams)>1: - FreeCAD.activeDocument().openTransaction('LevelTheBeams') - beams.pop(0) - fBase=faces.pop(0) - for i in range(len(beams)): - fCmd.levelTheBeam(beams[i],[fBase,faces[i]]) - FreeCAD.activeDocument().commitTransaction() - elif len(faces)!=len(beams): - FreeCAD.Console.PrintError('Select only one face for each beam.\n') - else: - FreeCADGui.Selection.clearSelection() - s=fObservers.levelBeamObserver() - FreeCADGui.Selection.addObserver(s) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamLevel.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_LevelBeam",'Flush the surfaces'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_LevelBeam",'Shift the beams to line-up the faces to the first selection (faces must be //)')} + """ + Tool to flush the parallel faces of two objects. + + Note: - actually the command takes to the same level, respect the + position and orientation of the first face selected, the center-of-mass + of all faces selected. Thus it translates the objects even if the + faces are not parallel. + """ + + def Activated(self): + import FreeCAD, FreeCADGui, fCmd, fObservers + + selex = Gui.Selection.getSelectionEx() + faces = fCmd.faces(selex) + beams = [sx.Object for sx in selex] + if len(faces) == len(beams) > 1: + FreeCAD.activeDocument().openTransaction("LevelTheBeams") + beams.pop(0) + fBase = faces.pop(0) + for i in range(len(beams)): + fCmd.levelTheBeam(beams[i], [fBase, faces[i]]) + FreeCAD.activeDocument().commitTransaction() + elif len(faces) != len(beams): + FreeCAD.Console.PrintError("Select only one face for each beam.\n") + else: + FreeCADGui.Selection.clearSelection() + s = fObservers.levelBeamObserver() + FreeCADGui.Selection.addObserver(s) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "beamLevel.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_LevelBeam", "Flush the surfaces"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_LevelBeam", + "Shift the beams to line-up the faces to the first selection (faces must be //)", + ), + } + class alignEdge: - ''' - Tool to mate two parallel edges. - - Notes: - actually the command moves the objects along the minimum - distance of their selected edge to the first one. Thus it translates - the object even if edges are not parallel. - - It is also possible to select two edges of the same objects. With - this method is possible to move quickly one object by steps defined - on its own geometry. - ''' - def Activated(self): - import FreeCAD, FreeCADGui, fCmd, fObservers - edges=fCmd.edges() - if len(edges)>=2 and len(FreeCADGui.Selection.getSelection())>=2: - e1=edges.pop(0) - beams=FreeCADGui.Selection.getSelection()[1:] - if len(edges)==len(beams): - pairs=[(beams[i],edges[i]) for i in range(len(beams))] - FreeCAD.activeDocument().openTransaction('AlignEdge') - for p in pairs: - fCmd.joinTheBeamsEdges(p[0],e1,p[1]) - FreeCAD.activeDocument().commitTransaction() - else: - FreeCADGui.Selection.clearSelection() - s=fObservers.alignEdgeObserver() - FreeCADGui.Selection.addObserver(s) + """ + Tool to mate two parallel edges. + + Notes: - actually the command moves the objects along the minimum + distance of their selected edge to the first one. Thus it translates + the object even if edges are not parallel. + - It is also possible to select two edges of the same objects. With + this method is possible to move quickly one object by steps defined + on its own geometry. + """ + + def Activated(self): + import FreeCAD, FreeCADGui, fCmd, fObservers + + edges = fCmd.edges() + if len(edges) >= 2 and len(FreeCADGui.Selection.getSelection()) >= 2: + e1 = edges.pop(0) + beams = FreeCADGui.Selection.getSelection()[1:] + if len(edges) == len(beams): + pairs = [(beams[i], edges[i]) for i in range(len(beams))] + FreeCAD.activeDocument().openTransaction("AlignEdge") + for p in pairs: + fCmd.joinTheBeamsEdges(p[0], e1, p[1]) + FreeCAD.activeDocument().commitTransaction() + else: + FreeCADGui.Selection.clearSelection() + s = fObservers.alignEdgeObserver() + FreeCADGui.Selection.addObserver(s) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "edgeAlign.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_AlignEdge", "Mate the edges"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_AlignEdge", "Join two edges: select two or pre-select several" + ), + } - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","edgeAlign.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_AlignEdge",'Mate the edges'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_AlignEdge",'Join two edges: select two or pre-select several')} class pivotBeam: - ''' - Dialog to rotate objects around one edge in the model or principal axis. - * Dial or textbox: the degree of rotation. - * "copy items" checkbox: select if the objects will be also copied. - * [Select axis] button: choose the pivot. - * [X / Y / Z]: choose one principal axis as pivot. - ''' - def Activated(self): - import fForms - #frameFormObj=fForms.pivotForm() - FreeCADGui.Control.showDialog(fForms.rotateAroundForm()) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","around.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_PivotBeam",'pivotTheBeam'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_PivotBeam",'Rotates the beam around an axis (edge or center-of-curvature)')} + """ + Dialog to rotate objects around one edge in the model or principal axis. + * Dial or textbox: the degree of rotation. + * "copy items" checkbox: select if the objects will be also copied. + * [Select axis] button: choose the pivot. + * [X / Y / Z]: choose one principal axis as pivot. + """ + + def Activated(self): + import fForms + + # frameFormObj=fForms.pivotForm() + FreeCADGui.Control.showDialog(fForms.rotateAroundForm()) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "around.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_PivotBeam", "pivotTheBeam"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_PivotBeam", "Rotates the beam around an axis (edge or center-of-curvature)" + ), + } + class stretchBeam: - ''' - Dialog to change the length of beams. - * "mm" textbox: the new length that will be applied to selected beams. - * [OK] button: execute the stretch operation to the selected beams. - * [Get Length] button: takes the new length from the selected geometry, - either the length of a beam or edge or the distance between geometric - entities (point, edges, faces). - * [Cancel]: exits - * slider: extends the reference length from -100% to +100%. - - ''' - def Activated(self): - import fForms - #frameFormObj=fForms.stretchForm() - FreeCADGui.Control.showDialog(fForms.stretchForm()) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","beamStretch.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_StretchBeam",'stretchTheBeam'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_StretchBeam",'Changes the length of the beam, either according a preselected edge or a direct input')} + """ + Dialog to change the length of beams. + * "mm" textbox: the new length that will be applied to selected beams. + * [OK] button: execute the stretch operation to the selected beams. + * [Get Length] button: takes the new length from the selected geometry, + either the length of a beam or edge or the distance between geometric + entities (point, edges, faces). + * [Cancel]: exits + * slider: extends the reference length from -100% to +100%. + + """ + + def Activated(self): + import fForms + + # frameFormObj=fForms.stretchForm() + FreeCADGui.Control.showDialog(fForms.stretchForm()) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "beamStretch.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_StretchBeam", "stretchTheBeam"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_StretchBeam", + "Changes the length of the beam, either according a preselected edge or a direct input", + ), + } + class extend: - ''' - Dialog to extend one beam to one selected target. - Note: - if entities are preselected before calling this command, the - first entity is automatically taken as target and the object attached - to it is removed from selection set. - ''' - def Activated(self): - import fForms - #frameFormObj=fForms.extendForm() - FreeCADGui.Control.showDialog(fForms.extendForm()) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","extend.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_Extend",'extendTheBeam'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_Extend",'Extend the beam either to a face, a vertex or the c.o.m. of the selected object')} + """ + Dialog to extend one beam to one selected target. + Note: - if entities are preselected before calling this command, the + first entity is automatically taken as target and the object attached + to it is removed from selection set. + """ + + def Activated(self): + import fForms + + # frameFormObj=fForms.extendForm() + FreeCADGui.Control.showDialog(fForms.extendForm()) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "extend.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Extend", "extendTheBeam"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_Extend", + "Extend the beam either to a face, a vertex or the c.o.m. of the selected object", + ), + } + class adjustFrameAngle: - ''' - Tool to adjust the beams at square angles of frames. - ''' - def Activated(self): - import FreeCADGui, fObservers - FreeCADGui.Selection.clearSelection() - s=fObservers.adjustAngleObserver() - FreeCADGui.Selection.addObserver(s) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","adjustAngle.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_AdjustFrameAngle",'adjustFrameAngle'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_AdjustFrameAngle",'Adjust the angle of frame by two edges')} + """ + Tool to adjust the beams at square angles of frames. + """ + + def Activated(self): + import FreeCADGui, fObservers + + FreeCADGui.Selection.clearSelection() + s = fObservers.adjustAngleObserver() + FreeCADGui.Selection.addObserver(s) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "adjustAngle.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_AdjustFrameAngle", "adjustFrameAngle"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_AdjustFrameAngle", "Adjust the angle of frame by two edges" + ), + } + class rotJoin: - ''' - Tool to translate and rotate the beams to mate two edges. - ''' - def Activated(self): - import FreeCAD, fCmd - if len(fCmd.beams())>1: - FreeCAD.activeDocument().openTransaction('rotJoin') - fCmd.rotjoinTheBeam() - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - else: - FreeCAD.Console.PrintError('Please select two edges of beams before\n') - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","rotjoin.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_RotJoin",'rotJoinEdge'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_RotJoin",'Rotates and align the beam according another edge')} + """ + Tool to translate and rotate the beams to mate two edges. + """ + + def Activated(self): + import FreeCAD, fCmd + + if len(fCmd.beams()) > 1: + FreeCAD.activeDocument().openTransaction("rotJoin") + fCmd.rotjoinTheBeam() + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + else: + FreeCAD.Console.PrintError("Please select two edges of beams before\n") + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "rotjoin.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotJoin", "rotJoinEdge"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_RotJoin", "Rotates and align the beam according another edge" + ), + } + class insertPath: - ''' - Tool to create a continuous DWire over the path defined by the - edges selected in the viewport, even if these are not continuous or - belongs to different objects. - ''' - def Activated(self): - import pCmd - FreeCAD.activeDocument().openTransaction('make Path') - pCmd.makeW() - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","path.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_InsertPath",'insert Path'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_InsertPath",'Creates one path along selected edges')} + """ + Tool to create a continuous DWire over the path defined by the + edges selected in the viewport, even if these are not continuous or + belongs to different objects. + """ + + def Activated(self): + import pCmd + + FreeCAD.activeDocument().openTransaction("make Path") + pCmd.makeW() + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def GetResources(self): + return { + "Pixmap": os.path.join(os.path.dirname(os.path.abspath(__file__)), "iconz", "path.svg"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPath", "insert Path"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_InsertPath", "Creates one path along selected edges" + ), + } + # class FrameLineManager: - # ''' - # Dialog to create and change properties of objects FrameLine - # providing the following features: - # * a list of beams' profiles previously included in the model - # by "insertSection" dialog; - # * a combo-box to select the active FrameLine among those already - # created or to create a new one; - # * a text-box where to write the name of the FrameLine that is going - # to be created; if nothing or "", the FrameLined will be named - # as default "Telaio00n"; - # * [Insert] button: creates a new FrameLine object or adds new members - # to the one selected in the combo-box if edges are selected in the - # active viewport. - # * [Redraw] button: creates new beams and places them over the selected - # path. New beams will be collected inside the group of the FrameLine. - # Does not create or update beams added to the FrameLine outside - # its defined path. - # * [Clear] button: deletes all beams in the FrameLine group. It applies - # also to beams added to the FrameLine outside its defined path. - # * [Get Path] button: assigns the Dwire selected to the attribute Path - # of the FrameLine object. - # * [Get Profile] button: changes the Profile attribute of the FrameLine - # object to the one of the beam selected in the viewport or the one - # selected in the list. - # * "Copy profile" checkbox: if checked generates a new profile object - # for each beam in order to avoid multiple references in the model. - # * "Move to origin" checkbox: if checked, moves the center-of-mass - # of the profile to the origin of coordinates system: that makes the - # centerline of the beam coincide with the c.o.m. of the profile. - - # Notes: - if the name of a FrameLine object is modified, also the name - # of the relevant group will change automatically but not viceversa. - # ''' - # def Activated(self): - # if FreeCAD.ActiveDocument: - # import fFeatures - # frameFormObj=fFeatures.frameLineForm() - - # def GetResources(self): - # return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","frameline.svg"),'MenuText':'FrameLine Manager','ToolTip':'Open FrameLine Manager'} +# ''' +# Dialog to create and change properties of objects FrameLine +# providing the following features: +# * a list of beams' profiles previously included in the model +# by "insertSection" dialog; +# * a combo-box to select the active FrameLine among those already +# created or to create a new one; +# * a text-box where to write the name of the FrameLine that is going +# to be created; if nothing or "", the FrameLined will be named +# as default "Telaio00n"; +# * [Insert] button: creates a new FrameLine object or adds new members +# to the one selected in the combo-box if edges are selected in the +# active viewport. +# * [Redraw] button: creates new beams and places them over the selected +# path. New beams will be collected inside the group of the FrameLine. +# Does not create or update beams added to the FrameLine outside +# its defined path. +# * [Clear] button: deletes all beams in the FrameLine group. It applies +# also to beams added to the FrameLine outside its defined path. +# * [Get Path] button: assigns the Dwire selected to the attribute Path +# of the FrameLine object. +# * [Get Profile] button: changes the Profile attribute of the FrameLine +# object to the one of the beam selected in the viewport or the one +# selected in the list. +# * "Copy profile" checkbox: if checked generates a new profile object +# for each beam in order to avoid multiple references in the model. +# * "Move to origin" checkbox: if checked, moves the center-of-mass +# of the profile to the origin of coordinates system: that makes the +# centerline of the beam coincide with the c.o.m. of the profile. + +# Notes: - if the name of a FrameLine object is modified, also the name +# of the relevant group will change automatically but not vice-versa. +# ''' +# def Activated(self): +# if FreeCAD.ActiveDocument: +# import fFeatures +# frameFormObj=fFeatures.frameLineForm() + +# def GetResources(self): +# return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","frameline.svg"),'MenuText':'FrameLine Manager','ToolTip':'Open FrameLine Manager'} + class FrameBranchManager: - ''' - Dialog to create and change properties of objects FrameBranch - ''' - def Activated(self): - if FreeCAD.ActiveDocument: - import fFeatures - FreeCADGui.Control.showDialog(fFeatures.frameBranchForm()) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","framebranch.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager",'FrameBranch Manager'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager",'Open FrameBranch Manager')} + """ + Dialog to create and change properties of objects FrameBranch + """ + + def Activated(self): + if FreeCAD.ActiveDocument: + import fFeatures + + FreeCADGui.Control.showDialog(fFeatures.frameBranchForm()) + + def GetResources(self): + return { + "Pixmap": os.path.join( + os.path.dirname(os.path.abspath(__file__)), "iconz", "framebranch.svg" + ), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager", "FrameBranch Manager"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager", "Open FrameBranch Manager"), + } + class insertSection: - ''' - Dialog to create the set of profiles to be used in the model. - ''' - def Activated(self): - if FreeCAD.ActiveDocument: - import fForms - FreeCADGui.Control.showDialog(fForms.profEdit()) - - def GetResources(self): - return{'Pixmap':os.path.join(os.path.dirname(os.path.abspath(__file__)),"iconz","sect.svg"), - 'MenuText':QT_TRANSLATE_NOOP("Quetzal_InsertSection",'Insert sections'), - 'ToolTip':QT_TRANSLATE_NOOP("Quetzal_InsertSection",'Creates customized beam profiles 2D')} - -#--------------------------------------------------------------------------- + """ + Dialog to create the set of profiles to be used in the model. + """ + + def Activated(self): + if FreeCAD.ActiveDocument: + import fForms + + FreeCADGui.Control.showDialog(fForms.profEdit()) + + def GetResources(self): + return { + "Pixmap": os.path.join(os.path.dirname(os.path.abspath(__file__)), "iconz", "sect.svg"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertSection", "Insert sections"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_InsertSection", "Creates customized beam profiles 2D" + ), + } + + +# --------------------------------------------------------------------------- # Adds the commands to the FreeCAD command manager # --------------------------------------------------------------------------- addCommand("Quetzal_FrameIt", frameIt()) diff --git a/CUtils.py b/CUtils.py index 00a65fa..1be230e 100644 --- a/CUtils.py +++ b/CUtils.py @@ -101,13 +101,9 @@ def Activated(self): if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): import uCmd - s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt( - "gridSize" - ) + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") sc = [float(x * s) for x in [1, 1, 0.2]] - arrow = uCmd.arrow( - FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s - ) + arrow = uCmd.arrow(FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s) from PySide.QtGui import QInputDialog as qid translate = FreeCAD.Qt.translate @@ -163,7 +159,9 @@ def GetResources(self): "Pixmap": get_icon_path("moveHandle"), "Accel": "M,H", "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveHandle", "Move objects"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_MoveHandle", "Move quickly objects inside viewport"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_MoveHandle", "Move quickly objects inside viewport" + ), } diff --git a/Init.py b/Init.py index 671f2c8..a859e09 100644 --- a/Init.py +++ b/Init.py @@ -1,24 +1,23 @@ -#**************************************************************************** -#* * -#* Dodo Workbench: * -#* substitute of flamingo for Py3 / Qt5 * -#* Copyright (c) 2019 Riccardo Treu LGPL * -#* * -#* This program is free software; you can redistribute it and/or modify * -#* it under the terms of the GNU Lesser General Public License (LGPL) * -#* as published by the Free Software Foundation; either version 2 of * -#* the License, or (at your option) any later version. * -#* for detail see the LICENCE text file. * -#* * -#* This program is distributed in the hope that it will be useful, * -#* but WITHOUT ANY WARRANTY; without even the implied warranty of * -#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -#* GNU Library General Public License for more details. * -#* * -#* You should have received a copy of the GNU Library General Public * -#* License along with this program; if not, write to the Free Software * -#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * -#* USA * -#* * -#**************************************************************************** - +# **************************************************************************** +# * * +# * Dodo Workbench: * +# * substitute of flamingo for Py3 / Qt5 * +# * Copyright (c) 2019 Riccardo Treu LGPL * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# **************************************************************************** diff --git a/anyShapez.py b/anyShapez.py index d57fb82..61bc60a 100644 --- a/anyShapez.py +++ b/anyShapez.py @@ -4,136 +4,168 @@ from os import listdir from pFeatures import pypeType -class AnyThing(pypeType): #object): - '''Class for object TType="Anything" - AnyThing(obj,name="Thing", fileName="", ports="0:0:0") - obj: the "App::FeaturePython object" - TType (string): name of the thing - FileName (string): a valid .STEP .IGES or .brep - ports: a string in the form "x0:y0:z0/x1:y1:z1/..." representing the position of ports 0,1.... - ''' - def __init__(self, obj,name="valve",fileName='ballDN15.stp',ports='0:0:0'): - #obj.Proxy = self - super(AnyThing,self).__init__(obj) - # define common properties - obj.PType="Any" - # define specific properties - obj.addProperty("App::PropertyString","FileName","AnyThing","The file of the shape (inside ./shapez)").FileName=fileName - portslist=list() - if ports: - for port in ports.split('/'): - portslist.append(FreeCAD.Vector([float(i) for i in port.split(":")])) - obj.Ports=portslist - if fileName: - s=Part.Shape() - path=join(dirname(abspath(__file__)),"shapez",fileName) - if exists(path): - s.read(path) - obj.Shape=s - else: - FreeCAD.Console.PrintError("%s file doesn't exist" %fileName) - def onChanged(self, fp, prop): - pass - def execute(self, fp): - super(AnyThing,self).execute(fp) # perform common operations - -def makeThing(n='Valvola', fn='ballDN15.stp', p='0:0:0', pos=None, Z=None): - ''' - makeThing(n,fn,p,pos,Z) - n = name - fn = file name - p = ports string (e.g. "0:0:0/0:0:69") - pos = position Vector - Z = orientation Vector - ''' - if pos==None: - pos=FreeCAD.Vector(0,0,0) - if Z==None: - Z=FreeCAD.Vector(0,0,1) - a=FreeCAD.ActiveDocument.addObject("Part::FeaturePython",n) - AnyThing(a, name=n, fileName=fn, ports=p) - a.ViewObject.Proxy=0 - a.Placement.Base=pos - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),Z) - a.Placement.Rotation=rot.multiply(a.Placement.Rotation) - return a + +class AnyThing(pypeType): # object): + """Class for object TType="Anything" + AnyThing(obj,name="Thing", fileName="", ports="0:0:0") + obj: the "App::FeaturePython object" + TType (string): name of the thing + FileName (string): a valid .STEP .IGES or .brep + ports: a string in the form "x0:y0:z0/x1:y1:z1/..." representing the position of ports 0,1.... + """ + + def __init__(self, obj, name="valve", fileName="ballDN15.stp", ports="0:0:0"): + # obj.Proxy = self + super(AnyThing, self).__init__(obj) + # define common properties + obj.PType = "Any" + # define specific properties + obj.addProperty( + "App::PropertyString", "FileName", "AnyThing", "The file of the shape (inside ./shapez)" + ).FileName = fileName + portslist = list() + if ports: + for port in ports.split("/"): + portslist.append(FreeCAD.Vector([float(i) for i in port.split(":")])) + obj.Ports = portslist + if fileName: + s = Part.Shape() + path = join(dirname(abspath(__file__)), "shapez", fileName) + if exists(path): + s.read(path) + obj.Shape = s + else: + FreeCAD.Console.PrintError("%s file doesn't exist" % fileName) + + def onChanged(self, fp, prop): + pass + + def execute(self, fp): + super(AnyThing, self).execute(fp) # perform common operations + + +def makeThing(n="Valvola", fn="ballDN15.stp", p="0:0:0", pos=None, Z=None): + """ + makeThing(n,fn,p,pos,Z) + n = name + fn = file name + p = ports string (e.g. "0:0:0/0:0:69") + pos = position Vector + Z = orientation Vector + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", n) + AnyThing(a, name=n, fileName=fn, ports=p) + a.ViewObject.Proxy = 0 + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + return a + import dodoDialogs + class shapezDialog(dodoDialogs.protoTypeDialog): - 'dialog for to import conveniently any shape from a STEP, IGS or BREP file' - def __init__(self): - super(shapezDialog,self).__init__('shapes.ui') - self.shapesDir=join(dirname(abspath(__file__)),'shapez') - FreeCAD.Console.PrintMessage('Listing files in '+str(self.shapesDir)+'\n') - self.cwd=self.shapesDir - self.pipeDictList=list() - self.filesListed=list() - self.lastThing=None - for n in listdir(self.cwd): - absFile=join(self.cwd,n) - if isdir(absFile): self.form.comboDirs.addItem(n) - elif isfile(absFile)and n.upper().split(extsep)[-1] in ['STEP','STP','IGES','IGS','BREP','BRP']: self.form.listFiles.addItem(n) - self.form.listFiles.setCurrentRow(0) - self.form.comboDirs.currentIndexChanged.connect(self.fillFiles) - self.form.listFiles.itemClicked.connect(self.checkListed) - def accept(self): - fname=self.form.listFiles.currentItem().text() - row=None - pos=None - Z=None - if self.form.comboDirs.currentText()=='': sdir='' - else: sdir=self.form.comboDirs.currentText() - if fname in self.filesListed: - for r in self.pipeDictList: - if r["fileName"]==fname: - row=r - break - name=row["name"] - ports=row["ports"] - else: - name=fname.split('.')[0] - ports='0:0:0' - selex=FreeCADGui.Selection.getSelectionEx() - if selex: - vxs=[v for sx in selex for so in sx.SubObjects for v in so.Vertexes] - cedges=[e for e in fCmd.edges() if e.curvatureAt(0)!=0] - faces=fCmd.faces() - if faces: - x=(faces[0].ParameterRange[0]+faces[0].ParameterRange[1])/2 - y=(faces[0].ParameterRange[2]+faces[0].ParameterRange[3])/2 - pos=faces[0].valueAt(x,y) - Z=faces[0].normalAt(x,y) - elif cedges: - pos=cedges[0].centerOfCurvatureAt(0) - Z=cedges[0].tangentAt(0).cross(cedges[0].normalAt(0)) - elif vxs: - pos=vxs[0].Point - self.lastThing=makeThing(name,join(sdir,fname),ports,pos,Z) - if row: - self.lastThing.Kv=float(row["Kv"]) - self.lastThing.PSize=row["DN"] - self.lastThing.PRating=row["PN"] - def fillFiles(self): - self.form.listFiles.clear() - self.form.labListed.setText('-') - if self.form.comboDirs.currentText()!='': - self.cwd=join(self.shapesDir,self.form.comboDirs.currentText()) - else: - self.cwd=self.shapesDir - for n in listdir(self.cwd): - if isfile(join(self.cwd,n)) and n.upper().split(extsep)[-1] in ['STEP','STP','IGES','IGS','BREP','BRP']: - self.form.listFiles.addItem(n) - if n[:4]=='Any_' and n[-4:]=='.csv': - f=open(join(self.cwd,n),'r') - from csv import DictReader - reader=DictReader(f,delimiter=';') - self.pipeDictList=[DNx for DNx in reader] - f.close() - self.filesListed=[row['fileName'] for row in self.pipeDictList] - self.form.listFiles.setCurrentRow(0) - def checkListed(self): - if self.form.listFiles.currentItem().text() in self.filesListed: - self.form.labListed.setText('*** LISTED ***') - else: - self.form.labListed.setText('(unlisted)') + "dialog for to import conveniently any shape from a STEP, IGS or BREP file" + + def __init__(self): + super(shapezDialog, self).__init__("shapes.ui") + self.shapesDir = join(dirname(abspath(__file__)), "shapez") + FreeCAD.Console.PrintMessage("Listing files in " + str(self.shapesDir) + "\n") + self.cwd = self.shapesDir + self.pipeDictList = list() + self.filesListed = list() + self.lastThing = None + for n in listdir(self.cwd): + absFile = join(self.cwd, n) + if isdir(absFile): + self.form.comboDirs.addItem(n) + elif isfile(absFile) and n.upper().split(extsep)[-1] in [ + "STEP", + "STP", + "IGES", + "IGS", + "BREP", + "BRP", + ]: + self.form.listFiles.addItem(n) + self.form.listFiles.setCurrentRow(0) + self.form.comboDirs.currentIndexChanged.connect(self.fillFiles) + self.form.listFiles.itemClicked.connect(self.checkListed) + + def accept(self): + fname = self.form.listFiles.currentItem().text() + row = None + pos = None + Z = None + if self.form.comboDirs.currentText() == "": + sdir = "" + else: + sdir = self.form.comboDirs.currentText() + if fname in self.filesListed: + for r in self.pipeDictList: + if r["fileName"] == fname: + row = r + break + name = row["name"] + ports = row["ports"] + else: + name = fname.split(".")[0] + ports = "0:0:0" + selex = FreeCADGui.Selection.getSelectionEx() + if selex: + vxs = [v for sx in selex for so in sx.SubObjects for v in so.Vertexes] + cedges = [e for e in fCmd.edges() if e.curvatureAt(0) != 0] + faces = fCmd.faces() + if faces: + x = (faces[0].ParameterRange[0] + faces[0].ParameterRange[1]) / 2 + y = (faces[0].ParameterRange[2] + faces[0].ParameterRange[3]) / 2 + pos = faces[0].valueAt(x, y) + Z = faces[0].normalAt(x, y) + elif cedges: + pos = cedges[0].centerOfCurvatureAt(0) + Z = cedges[0].tangentAt(0).cross(cedges[0].normalAt(0)) + elif vxs: + pos = vxs[0].Point + self.lastThing = makeThing(name, join(sdir, fname), ports, pos, Z) + if row: + self.lastThing.Kv = float(row["Kv"]) + self.lastThing.PSize = row["DN"] + self.lastThing.PRating = row["PN"] + + def fillFiles(self): + self.form.listFiles.clear() + self.form.labListed.setText("-") + if self.form.comboDirs.currentText() != "": + self.cwd = join(self.shapesDir, self.form.comboDirs.currentText()) + else: + self.cwd = self.shapesDir + for n in listdir(self.cwd): + if isfile(join(self.cwd, n)) and n.upper().split(extsep)[-1] in [ + "STEP", + "STP", + "IGES", + "IGS", + "BREP", + "BRP", + ]: + self.form.listFiles.addItem(n) + if n[:4] == "Any_" and n[-4:] == ".csv": + f = open(join(self.cwd, n), "r") + from csv import DictReader + + reader = DictReader(f, delimiter=";") + self.pipeDictList = [DNx for DNx in reader] + f.close() + self.filesListed = [row["fileName"] for row in self.pipeDictList] + self.form.listFiles.setCurrentRow(0) + + def checkListed(self): + if self.form.listFiles.currentItem().text() in self.filesListed: + self.form.labListed.setText("*** LISTED ***") + else: + self.form.labListed.setText("(unlisted)") diff --git a/cut_list/__init__.py b/cut_list/__init__.py index 5957893..84ea15a 100644 --- a/cut_list/__init__.py +++ b/cut_list/__init__.py @@ -1,29 +1,28 @@ -#**************************************************************************** -#* * -#* Cut List Creation for Dodo Workbench * -#* * -#* Copyright (c) 2023 FilePhil LGPL * -#* * -#* This program is free software; you can redistribute it and/or modify * -#* it under the terms of the GNU Lesser General Public License (LGPL) * -#* as published by the Free Software Foundation; either version 2 of * -#* the License, or (at your option) any later version. * -#* for detail see the LICENCE text file. * -#* * -#* This program is distributed in the hope that it will be useful, * -#* but WITHOUT ANY WARRANTY; without even the implied warranty of * -#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -#* GNU Library General Public License for more details. * -#* * -#* You should have received a copy of the GNU Library General Public * -#* License along with this program; if not, write to the Free Software * -#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * -#* USA * -#* * -#**************************************************************************** +# **************************************************************************** +# * * +# * Cut List Creation for Dodo Workbench * +# * * +# * Copyright (c) 2023 FilePhil LGPL * +# * * +# * This program is free software; you can redistribute it and/or modify * +# * it under the terms of the GNU Lesser General Public License (LGPL) * +# * as published by the Free Software Foundation; either version 2 of * +# * the License, or (at your option) any later version. * +# * for detail see the LICENCE text file. * +# * * +# * This program is distributed in the hope that it will be useful, * +# * but WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +# * GNU Library General Public License for more details. * +# * * +# * You should have received a copy of the GNU Library General Public * +# * License along with this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# **************************************************************************** import os RESOURCE_PATH = os.path.join(os.path.dirname(__file__), "resources") - diff --git a/cut_list/cut_list_creation.py b/cut_list/cut_list_creation.py index 09bd48a..3dca7a3 100644 --- a/cut_list/cut_list_creation.py +++ b/cut_list/cut_list_creation.py @@ -18,16 +18,22 @@ class Cut: position: int = 0 def getKey(self): - """ Provide a Key to generate the Position Number - """ - return self.profil + "|" + str(round(self.length.getValueAs("mm"),2)) - + """Provide a Key to generate the Position Number""" + return self.profil + "|" + str(round(self.length.getValueAs("mm"), 2)) + def totalLength(self): return self.length + self.cutwidth def getRow(self): - """Provide the Information from the Cutted Piece in the form of a dict""" - return {"Label": self.label,"Profil": self.profil, "Length": self.length,"CutWidth": self.cutwidth,"Pos.":self.position} + """Provide the Information from the Cut Piece in the form of a dict""" + return { + "Label": self.label, + "Profil": self.profil, + "Length": self.length, + "CutWidth": self.cutwidth, + "Pos.": self.position, + } + @dataclass class Beam: @@ -38,9 +44,8 @@ class Beam: lengthLeft: object cuts: List[Cut] - def addCut(self,cut): - """ Try to fit the cutted piece on the Beam and provide a status if it fits - """ + def addCut(self, cut): + """Try to fit the cut piece on the Beam and provide a status if it fits""" if self.length.getValueAs("mm") > 0.1 and self.lengthLeft < cut.totalLength(): # Cut is not Possible on this Beam # Ignore if Beam has no length @@ -51,26 +56,25 @@ def addCut(self,cut): return True def getCutsAsDict(self): - """ Get a easy to work with Dict List of the Beams / Cuts""" + """Get a easy to work with Dict List of the Beams / Cuts""" return [x.getRow() for x in self.cuts] - + def lengthUsed(self): return self.length - self.lengthLeft -def queryStructures(profiles:list,rootObjs = None): - """ Find all Structure Elements that use one of the selected profiles - """ - +def queryStructures(profiles: list, rootObjs=None): + """Find all Structure Elements that use one of the selected profiles""" + resultObjs = [] if rootObjs is None: rootObjs = FreeCAD.ActiveDocument.Objects - for obj in rootObjs: + for obj in rootObjs: # Follow Link Groups - if obj.TypeId == "App::LinkGroup": - resultObjs = resultObjs + queryStructures(profiles,obj.ElementList) + if obj.TypeId == "App::LinkGroup": + resultObjs = resultObjs + queryStructures(profiles, obj.ElementList) # Get the base Profile Used for the Structure base = getattr(obj, "Base", None) @@ -85,39 +89,40 @@ def queryStructures(profiles:list,rootObjs = None): return resultObjs -def nestCuts(profiles:list,beamLength,cutwidth): - """ Nest a List of Cuts on a Standard Beam length to estimate the needed Beams. - """ - + +def nestCuts(profiles: list, beamLength, cutwidth): + """Nest a List of Cuts on a Standard Beam length to estimate the needed Beams.""" + allStructures = queryStructures(profiles) # Sort Cuts Big to Small - sortedStructures = sorted(allStructures, key=lambda x:x.ComputedLength, reverse=True) - - allCuts = [] - beams = [] # List of Lists to reference what is together in one beam [beamLength,[Cut1,Cut2...]] - beam = Beam(1, beamLength, beamLength,[]) + sortedStructures = sorted(allStructures, key=lambda x: x.ComputedLength, reverse=True) + + allCuts = [] + beams = ( + [] + ) # List of Lists to reference what is together in one beam [beamLength,[Cut1,Cut2...]] + beam = Beam(1, beamLength, beamLength, []) beams.append(beam) - + # Go through all Structure Objects and try to fit them onto the Beams for obj in sortedStructures: - - # Create Cut Object to hold all Attributes - label = obj.Label + # Create Cut Object to hold all Attributes + label = obj.Label profile = obj.Base.Label - length = round(obj.ComputedLength,2) + length = round(obj.ComputedLength, 2) cutObj = Cut(label, profile, length, cutwidth) - + cutKey = cutObj.getKey() - + # Use the Key to define the Position Number of the Cut if cutKey not in allCuts: - allCuts.append (cutKey) + allCuts.append(cutKey) cutObj.position = len(allCuts) else: - cutObj.position = allCuts.index(cutKey)+1 - - # Try to fit the Object on exsting Beam + cutObj.position = allCuts.index(cutKey) + 1 + + # Try to fit the Object on existing Beam nofit = True for beam in beams: if beam.addCut(cutObj): @@ -125,29 +130,29 @@ def nestCuts(profiles:list,beamLength,cutwidth): break # Add new Beam and add the Cut to it - if nofit: - beam = Beam(len(beams)+1, beamLength,beamLength,[]) + if nofit: + beam = Beam(len(beams) + 1, beamLength, beamLength, []) beams.append(beam) if not beam.addCut(cutObj): - raise ValueError('Cut longer than beam!') + raise ValueError("Cut longer than beam!") return beams def createSpreadSheetReport(beams, name="Result_Nest_Profile"): - """ Create a Spreadsheet as the Result of the Cut list Generation. - Each Piece will be displayed as One Row + """Create a Spreadsheet as the Result of the Cut list Generation. + Each Piece will be displayed as One Row """ result = FreeCAD.ActiveDocument.addObject("Spreadsheet::Sheet", name) - columnLabels = ["Pos.",'Profil','Label','Length'] + columnLabels = ["Pos.", "Profil", "Label", "Length"] result = resultSpreadsheet.ResultSpreadsheet(result, columnLabels) for beam in beams: result.printHeader(f"Beam No. {beam.number}") # Print the Used Length if a maximum Stock Value is given - beamLength = round(beam.length,2) + beamLength = round(beam.length, 2) if beamLength.getValueAs("mm") <= 0.1: result.printHeader(f"Used {round(beam.lengthUsed(),2)}") else: @@ -159,26 +164,27 @@ def createSpreadSheetReport(beams, name="Result_Nest_Profile"): result.recompute() + def createSpreadSheetReportGrouped(beams, name="Result_Nest_Profile"): - """ Create a Spreadsheet as the Result of the Cut list Generation. - The Pieces will be grouped by the Length and Profile. + """Create a Spreadsheet as the Result of the Cut list Generation. + The Pieces will be grouped by the Length and Profile. """ result = FreeCAD.ActiveDocument.addObject("Spreadsheet::Sheet", name) - columnLabels = ["Pos.","Profil","Length","Quantity"] + columnLabels = ["Pos.", "Profil", "Length", "Quantity"] result = resultSpreadsheet.ResultSpreadsheet(result, columnLabels) for beam in beams: result.printHeader(f"Beam No. {beam.number}") # Print the Used Length if a maximum Stock Value is given - beamLength = round(beam.length,2) + beamLength = round(beam.length, 2) if beamLength.getValueAs("mm") <= 0.1: result.printHeader(f"Used {round(beam.lengthUsed(),2)}") else: result.printHeader(f"Used {round(beam.lengthUsed(),2)} of {beamLength}") - + result.printColumnLabels() resultRows = [] @@ -188,11 +194,10 @@ def createSpreadSheetReportGrouped(beams, name="Result_Nest_Profile"): # Add only one Row for each Key on the Beam currentCutKey = cut.getKey() if currentCutKey not in usedKeys: - roWDict = cut.getRow() # Calculate the Number of the same pieces roWDict["Quantity"] = len([x for x in beam.cuts if x.getKey() == currentCutKey]) - + resultRows.append(roWDict) usedKeys.append(cut.getKey()) @@ -202,17 +207,15 @@ def createSpreadSheetReportGrouped(beams, name="Result_Nest_Profile"): result.recompute() -def createCutlist(profiles,maxBeamLength,cutWidth,GroupByLength=False): - """ Nest the Cuts to the Beams and create the Report Spreadsheet - """ +def createCutlist(profiles, maxBeamLength, cutWidth, GroupByLength=False): + """Nest the Cuts to the Beams and create the Report Spreadsheet""" profilesLabel = "_".join(profiles) tableName = f"Cut_List_{profilesLabel}" - beams = nestCuts(profiles,maxBeamLength,cutWidth) + beams = nestCuts(profiles, maxBeamLength, cutWidth) if GroupByLength: - createSpreadSheetReportGrouped(beams,tableName) + createSpreadSheetReportGrouped(beams, tableName) else: - createSpreadSheetReport(beams,tableName) - \ No newline at end of file + createSpreadSheetReport(beams, tableName) diff --git a/cut_list/cut_list_ui.py b/cut_list/cut_list_ui.py index 70f36d0..c937437 100644 --- a/cut_list/cut_list_ui.py +++ b/cut_list/cut_list_ui.py @@ -1,4 +1,4 @@ -import FreeCAD,FreeCADGui,Part +import FreeCAD, FreeCADGui, Part import os from FreeCAD import Units @@ -18,64 +18,62 @@ def __init__(self): maxStockDefault = Units.parseQuantity("6m") cutWidthDefault = Units.parseQuantity("5mm") - self.form.max_stock_length.setProperty("value",maxStockDefault) - self.form.max_stock_length.setProperty("minimum",0.0) + self.form.max_stock_length.setProperty("value", maxStockDefault) + self.form.max_stock_length.setProperty("minimum", 0.0) - self.form.cut_width.setProperty("value",cutWidthDefault) - self.form.cut_width.setProperty("minimum",0.0) + self.form.cut_width.setProperty("value", cutWidthDefault) + self.form.cut_width.setProperty("minimum", 0.0) # Set Default Options - self.form.use_nesting.stateChanged.connect(self.useNestingToggle) + self.form.use_nesting.stateChanged.connect(self.useNestingToggle) self.form.use_nesting.setChecked(False) - + self.form.use_group_by_size.setChecked(True) - + # Update the UI self.useNestingToggle() self.UpdateProfileList() self.selectProfilefromSelection() - def selectProfilefromSelection(self): - """ Select the selected Profile if some is used - """ + """Select the selected Profile if some is used""" for selected in FreeCADGui.Selection.getSelection(): selLabel = selected.Label - found = self.form.profile_list.findItems(selLabel,QtCore.Qt.MatchExactly) - if len(found)>0: + found = self.form.profile_list.findItems(selLabel, QtCore.Qt.MatchExactly) + if len(found) > 0: item = found[0] item.setSelected(True) - - def useNestingToggle(self): - """ Toggle the Nesting Options depending on the Need - """ + """Toggle the Nesting Options depending on the Need""" state = self.form.use_nesting.checkState() - self.form.max_stock_length.setProperty("enabled",state) - self.form.cut_width.setProperty("enabled",state) + self.form.max_stock_length.setProperty("enabled", state) + self.form.cut_width.setProperty("enabled", state) def UpdateProfileList(self): - """ Add all Sketches/Profiles/Sections that can be used for the Beam Creation - """ + """Add all Sketches/Profiles/Sections that can be used for the Beam Creation""" + + sketches = [ + s.Label for s in FreeCAD.ActiveDocument.Objects if s.TypeId == "Sketcher::SketchObject" + ] + obj2D = [ + s.Label + for s in FreeCAD.ActiveDocument.Objects + if hasattr(s, "Shape") and s.Shape.Faces and not s.Shape.Solids + ] - sketches = [s.Label for s in FreeCAD.ActiveDocument.Objects if s.TypeId=="Sketcher::SketchObject"] - obj2D = [s.Label for s in FreeCAD.ActiveDocument.Objects if hasattr (s,"Shape") and s.Shape.Faces and not s.Shape.Solids] - self.form.profile_list.clear() - self.form.profile_list.addItems(sketches) - + self.form.profile_list.addItems(sketches) + self.form.profile_list.addItems(obj2D) - - - def accept(self): - """ Start the Creation of the Cut List - """ + + def accept(self): + """Start the Creation of the Cut List""" # Get all selected Profiles sel = self.form.profile_list.currentItem() profils = [] - for item in self.form.profile_list.selectedItems(): + for item in self.form.profile_list.selectedItems(): profils.append(item.text()) if profils == []: @@ -87,20 +85,20 @@ def accept(self): maxStockLength = Units.parseQuantity("0mm") cutWidth = Units.parseQuantity("0mm") else: - maxStockLength = self.form.max_stock_length.property('value') - cutWidth = self.form.cut_width.property('value') - + maxStockLength = self.form.max_stock_length.property("value") + cutWidth = self.form.cut_width.property("value") + # Generate the Cut List - cut_list_creation.createCutlist(profils, - maxStockLength, - cutWidth, - self.form.use_group_by_size.checkState()) - + cut_list_creation.createCutlist( + profils, maxStockLength, cutWidth, self.form.use_group_by_size.checkState() + ) + FreeCADGui.Control.closeDialog() - + def reject(self): FreeCADGui.Control.closeDialog() - + + def openCutListDialog(): panel = cutListUI() - FreeCADGui.Control.showDialog(panel) \ No newline at end of file + FreeCADGui.Control.showDialog(panel) diff --git a/cut_list/resultSpreadsheet.py b/cut_list/resultSpreadsheet.py index d6b5e97..facbe6d 100644 --- a/cut_list/resultSpreadsheet.py +++ b/cut_list/resultSpreadsheet.py @@ -1,4 +1,4 @@ -# Heavily Inspired Code from +# Heavily Inspired Code from # https://github.com/furti/FreeCAD-Reporting/blob/master/report.py import FreeCAD @@ -8,15 +8,18 @@ COLUMN_NAMES = list(string.ascii_uppercase) + def literalText(text): return "'%s" % (text) + def lineRange(startColumn, endColumn, lineNumber): return cellRange(startColumn, lineNumber, endColumn, lineNumber) def cellRange(startColumn, startLine, endColumn, endLine): - return '%s%s:%s%s' % (startColumn, startLine, endColumn, endLine) + return "%s%s:%s%s" % (startColumn, startLine, endColumn, endLine) + def nextColumnName(actualColumnName): if actualColumnName is None: @@ -50,28 +53,29 @@ def getColumnName(self, label): return COLUMN_NAMES[nextIndex] - def clearAll(self): self.spreadsheet.clearAll() def printEmptyLine(self): self.lineNumber += 1 - def printHeader(self, header='HAEADER'): + def printHeader(self, header="HAEADER"): spreadsheet = self.spreadsheet - if header is None or header == '': + if header is None or header == "": return - headerCell = 'A%s' % (self.lineNumber) + headerCell = "A%s" % (self.lineNumber) self.setCellValue(headerCell, header) - spreadsheet.setStyle(headerCell, 'bold|underline', 'add') + spreadsheet.setStyle(headerCell, "bold|underline", "add") - spreadsheet.mergeCells(lineRange('A', COLUMN_NAMES[len(self.columnLabels)-1], self.lineNumber)) + spreadsheet.mergeCells( + lineRange("A", COLUMN_NAMES[len(self.columnLabels) - 1], self.lineNumber) + ) self.lineNumber += 1 - self.updateMaxColumn('A') + self.updateMaxColumn("A") self.clearLine(self.lineNumber) @@ -83,11 +87,10 @@ def printColumnLabels(self): for columnLabel in self.columnLabels: columnName = self.getColumnName(columnLabel) cellName = f"{columnName}{self.lineNumber}" - + self.setCellValue(cellName, columnLabel) - spreadsheet.setStyle( - lineRange('A', columnName, self.lineNumber), 'bold', 'add') + spreadsheet.setStyle(lineRange("A", columnName, self.lineNumber), "bold", "add") self.lineNumber += 1 self.updateMaxColumn(columnName) @@ -97,7 +100,7 @@ def printColumnLabels(self): def printRows(self, rows): lineNumberBefore = self.lineNumber - columnName = 'A' + columnName = "A" for row in rows: columnName = None @@ -110,18 +113,17 @@ def printRows(self, rows): self.lineNumber += 1 - #if printResultInBold: + # if printResultInBold: # self.spreadsheet.setStyle( # cellRange('A', lineNumberBefore, columnName, self.lineNumber), 'bold', 'add') self.clearLine(self.lineNumber) - self.updateMaxColumn(columnName) def setCellValue(self, cell, value): if value is None: - convertedValue = '' + convertedValue = "" elif isinstance(value, FreeCAD.Units.Quantity): convertedValue = value.UserString else: @@ -165,7 +167,6 @@ def clearLine(self, lineNumberToDelete): column = nextColumnName(column) cellName = f"{column}{lineNumberToDelete}" - self.spreadsheet.clear(cellName) def clearColumn(self, columnToDelete, maxLineNumber): diff --git a/dodoDialogs.py b/dodoDialogs.py index 5c5d0e2..f741f70 100644 --- a/dodoDialogs.py +++ b/dodoDialogs.py @@ -38,7 +38,8 @@ def __init__(self, dialog="anyFile.ui"): % ( self.actionS.shortcuts()[0].toString(), self.actionX.shortcuts()[0].toString(), - )+'\r\n' + ) + + "\r\n" ) try: self.view = FreeCADGui.activeDocument().activeView() @@ -46,9 +47,7 @@ def __init__(self, dialog="anyFile.ui"): "SoMouseButtonEvent", self.action ) # SoKeyboardEvents replaced by QAction' except: - FreeCAD.Console.PrintError( - translate("protoTypeDialog", "No view available.") - ) + FreeCAD.Console.PrintError(translate("protoTypeDialog", "No view available.")) def action(self, arg): 'Defines functions executed by the callback self.call when "SoMouseButtonEvent"' @@ -84,7 +83,8 @@ def reject(self): self.mw.removeAction(self.actionS) FreeCAD.Console.PrintMessage( translate("protoTypeDialog", 'Actions "%s" and "%s" removed') - % (self.actionX.objectName(), self.actionS.objectName())+'\r\n' + % (self.actionX.objectName(), self.actionS.objectName()) + + "\r\n" ) try: self.view.removeEventCallback("SoMouseButtonEvent", self.call) @@ -94,6 +94,7 @@ def reject(self): if FreeCAD.ActiveDocument: FreeCAD.ActiveDocument.recompute() + class protoPypeForm(QDialog): "prototype dialog for insert pFeatures" @@ -135,9 +136,7 @@ def __init__( self.firstCol = QWidget() self.firstCol.setLayout(QVBoxLayout()) self.mainHL.addWidget(self.firstCol) - self.currentRatingLab = QLabel( - translate("protoPypeForm", "Rating: ") + self.PRating - ) + self.currentRatingLab = QLabel(translate("protoPypeForm", "Rating: ") + self.PRating) self.firstCol.layout().addWidget(self.currentRatingLab) self.sizeList = QListWidget() self.firstCol.layout().addWidget(self.sizeList) @@ -177,9 +176,7 @@ def __init__( self.btn1 = QPushButton(translate("protoPypeForm", "Insert")) self.secondCol.layout().addWidget(self.btn1) self.mainHL.addWidget(self.secondCol) - self.resize( - max(350, int(self.mw.width() / 4)), max(350, int(self.mw.height() / 2)) - ) + self.resize(max(350, int(self.mw.width() / 4)), max(350, int(self.mw.height() / 2))) self.mainHL.setContentsMargins(0, 0, 0, 0) def setCurrentPL(self, PLName=None): @@ -207,9 +204,7 @@ def fillSizes(self): def changeRating(self, item): self.PRating = item.text() - self.currentRatingLab.setText( - translate("protoPypeForm", "Rating: ") + self.PRating - ) + self.currentRatingLab.setText(translate("protoPypeForm", "Rating: ") + self.PRating) self.fillSizes() def findDN(self, DN): diff --git a/dodoPM.py b/dodoPM.py index 56cd2cc..02369a4 100644 --- a/dodoPM.py +++ b/dodoPM.py @@ -130,9 +130,7 @@ def __init__(self): self.menu = QtGui.QMenu(mw) self.menuSize = 0 self.menu.setStyleSheet(styleContainer) - self.menu.setWindowFlags( - self.menu.windowFlags() | QtCore.Qt.FramelessWindowHint - ) + self.menu.setWindowFlags(self.menu.windowFlags() | QtCore.Qt.FramelessWindowHint) self.menu.setAttribute(QtCore.Qt.WA_TranslucentBackground) if compositingManager: pass @@ -186,12 +184,8 @@ def add_commands(self, commands): button.setDefaultAction(commands[commands.index(i)]) button.setGeometry(0, 0, buttonSize, buttonSize) button.setIconSize(QtCore.QSize(icon, icon)) - button.setProperty( - "ButtonX", self.radius * (math.cos(angle * num + angleStart)) - ) - button.setProperty( - "ButtonY", self.radius * (math.sin(angle * num + angleStart)) - ) + button.setProperty("ButtonX", self.radius * (math.cos(angle * num + angleStart))) + button.setProperty("ButtonY", self.radius * (math.sin(angle * num + angleStart))) self.buttons.append(button) num = num + 1 buttonClose = closeButton() @@ -210,10 +204,7 @@ def hide(self): def showAtMouse(self): actionDict = dict( - [ - (a.objectName(), a) - for a in FreeCADGui.getMainWindow().findChildren(QtGui.QAction) - ] + [(a.objectName(), a) for a in FreeCADGui.getMainWindow().findChildren(QtGui.QAction)] ) try: actions.pop("") @@ -245,9 +236,7 @@ def showAtMouse(self): ) i.setVisible(True) self.menu.popup( - QtCore.QPoint( - pos.x() - self.menuSize / 2, pos.y() - self.menuSize / 2 - ) + QtCore.QPoint(pos.x() - self.menuSize / 2, pos.y() - self.menuSize / 2) ) @@ -259,9 +248,7 @@ def setupUi(self, Dialog): self.gridLayout = QtGui.QGridLayout(Dialog) self.gridLayout.setObjectName("gridLayout") self.comboRating = QtGui.QComboBox(Dialog) - sizePolicy = QtGui.QSizePolicy( - QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed - ) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.comboRating.sizePolicy().hasHeightForWidth()) @@ -273,9 +260,7 @@ def setupUi(self, Dialog): self.labRating.setObjectName("labRating") self.gridLayout.addWidget(self.labRating, 1, 0, 1, 1) self.comboPL = QtGui.QComboBox(Dialog) - sizePolicy = QtGui.QSizePolicy( - QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed - ) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.comboPL.sizePolicy().hasHeightForWidth()) @@ -410,9 +395,7 @@ def go(self): L = float(self.QM.lineEdit.text()) else: L = 1000 - pCmd.doPipes( - [d["PSize"], float(d["OD"]), float(d["thk"]), L], FreeCAD.__activePypeLine__ - ) + pCmd.doPipes([d["PSize"], float(d["OD"]), float(d["thk"]), L], FreeCAD.__activePypeLine__) super(pQM, self).go() @@ -517,9 +500,7 @@ def __init__(self): def go(self): d = self.dictList[self.QM.listSize.currentRow()] proplist = [] - pCmd.doCaps( - [d["PSize"], float(d["OD"]), float(d["thk"])], FreeCAD.__activePypeLine__ - ) + pCmd.doCaps([d["PSize"], float(d["OD"]), float(d["thk"])], FreeCAD.__activePypeLine__) super(cQM, self).go() diff --git a/fCmd.py b/fCmd.py index 311769c..d69d54e 100644 --- a/fCmd.py +++ b/fCmd.py @@ -1,459 +1,510 @@ -#(c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD -__title__="frameTools functions" -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" +__title__ = "frameTools functions" +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" -import FreeCAD,FreeCADGui +import FreeCAD, FreeCADGui import DraftGeomUtils as dgu from DraftVecUtils import rounded ############## AUXILIARY FUNCTIONS ############### + def edges(selex=[], except1st=False): - '''returns the list of edges in the selection set''' - if len(selex)==0: - selex=FreeCADGui.Selection.getSelectionEx() - try: - if except1st: - eds=[e for sx in selex if sx!=selex[0] for so in sx.SubObjects for e in so.Edges] - else: - eds=[e for sx in selex for so in sx.SubObjects for e in so.Edges] - #FreeCAD.Console.PrintMessage('\nFound '+str(len(eds))+' edge(s).\n') - except: - FreeCAD.Console.PrintError('\nNo valid selection.\n') - return eds + """returns the list of edges in the selection set""" + if len(selex) == 0: + selex = FreeCADGui.Selection.getSelectionEx() + try: + if except1st: + eds = [e for sx in selex if sx != selex[0] for so in sx.SubObjects for e in so.Edges] + else: + eds = [e for sx in selex for so in sx.SubObjects for e in so.Edges] + # FreeCAD.Console.PrintMessage('\nFound '+str(len(eds))+' edge(s).\n') + except: + FreeCAD.Console.PrintError("\nNo valid selection.\n") + return eds + def beams(sel=[]): - ''' - Returns the selected "beams", i.e. FeaturePythons which have a Profile and an Height properties. - ''' - if len(sel)==0: - sel=FreeCADGui.Selection.getSelection() - return [i for i in sel if i.TypeId=="Part::FeaturePython" and hasattr(i,"Height") and hasattr(i,"Profile")] + """ + Returns the selected "beams", i.e. FeaturePythons which have a Profile and an Height properties. + """ + if len(sel) == 0: + sel = FreeCADGui.Selection.getSelection() + return [ + i + for i in sel + if i.TypeId == "Part::FeaturePython" and hasattr(i, "Height") and hasattr(i, "Profile") + ] + def faces(selex=[]): - '''returns the list of faces in the selection set''' - if len(selex)==0: - selex=FreeCADGui.Selection.getSelectionEx() - try: - fcs=[f for sx in selex for so in sx.SubObjects for f in so.Faces] - #FreeCAD.Console.PrintMessage('\nFound '+str(len(fcs))+' face(s).\n') - except: - FreeCAD.Console.PrintError('\nNo valid selection.\n') - return fcs + """returns the list of faces in the selection set""" + if len(selex) == 0: + selex = FreeCADGui.Selection.getSelectionEx() + try: + fcs = [f for sx in selex for so in sx.SubObjects for f in so.Faces] + # FreeCAD.Console.PrintMessage('\nFound '+str(len(fcs))+' face(s).\n') + except: + FreeCAD.Console.PrintError("\nNo valid selection.\n") + return fcs + def points(selex=[]): - '''returns a list of selected vertexes''' - if len(selex)==0: selex=FreeCADGui.Selection.getSelectionEx() - return [p for sx in selex for so in sx.SubObjects for p in so.Vertexes] - -def intersectionLines2(p1=None,v1=None,p2=None,v2=None): # TODO! - ''' - intersectionLines2(p1,v1,p2,v2) - Returns the intersection between one line and the plane that includes the - second line and orthogonal to the plane defined by both lines. - p1,v1: the reference point and direction of first line - p2,v2: the reference point and direction of second line - ''' - if None in [p1,p2,v1,v2]: - p1=edges()[0].valueAt(0) - v1=edges()[0].tangentAt(0) - p2=edges()[1].valueAt(0) - v2=edges()[1].tangentAt(0) - if isParallel(v1,v2): - FreeCAD.Console.PrintError("Directions are pallel\n") - return None - else: - dist=p1-p2 - norm=v2.cross(dist).cross(v1) - #P1=FreeCAD.Vector(p1.x,p1.y,p1.z) - return p1.projectToPlane(p2,norm) + """returns a list of selected vertexes""" + if len(selex) == 0: + selex = FreeCADGui.Selection.getSelectionEx() + return [p for sx in selex for so in sx.SubObjects for p in so.Vertexes] -def intersectionCLines(thing1=None, thing2=None): - ''' - intersectionCLines(thing1=None, thing2=None) - Returns the intersection (vector) of the center lines of thing1 and thing2. - Things can be any combination of intersecting beams, pipes or edges. - If less than 2 arguments are given, thing1 and thing2 are the first 2 beams - or pipes found in the selection set. - ''' - if not (thing1 and thing2): - try: - thing1,thing2=beams()[:2] - except: - FreeCAD.Console.PrintError('Insufficient arguments for intersectionCLines\n') - return None - edges=[] - for thing in [thing1,thing2]: - if beams([thing]): - edges.append(vec2edge(thing.Placement.Base,beamAx(thing))) - elif hasattr(thing,'ShapeType') and thing.ShapeType=='Edge': - edges.append(thing) - intersections=dgu.findIntersection(*edges, infinite1=True, infinite2=True) - if len(intersections): - return rounded(intersections[0]) - else: - FreeCAD.Console.PrintError('No intersection found\n') - return None - - -def intersectionLines(p1=None,v1=None,p2=None,v2=None): # OBSOLETE: replaced with intersectionCLines - ''' - intersectionLines(p1,v1,p2,v2) - If exist, returns the intersection (vector) between two lines - p1,v1: the reference point and direction of first line - p2,v2: the reference point and direction of second line - ''' - - if None in [p1,p2,v1,v2]: - eds=edges()[:2] - p1,p2=[e.valueAt(0) for e in eds] - v1,v2=[e.tangentAt(0) for e in eds] - if not isParallel(v1,v2): - dist=p1-p2 - import numpy - #M=numpy.matrix([list(v1),list(v2),list(dist)]) # does not work: it seems for lack of accuracy of FreeCAD.Base.Vector operations! - rowM1=[round(x,2) for x in v1] - rowM2=[round(x,2) for x in v2] - rowM3=[round(x,2) for x in dist] - M=numpy.matrix([rowM1,rowM2,rowM3]) - if numpy.linalg.det(M)==0: - #3 equations, 2 unknowns => 1 eq. must be dependent - a11,a21,a31=list(v1) - a12,a22,a32=list(v2*-1) - M1=numpy.matrix([[a11,a12],[a21,a22]]) - M2=numpy.matrix([[a21,a22],[a31,a32]]) - M3=numpy.matrix([[a31,a32],[a11,a12]]) - pl1=list(p1) - pl2=list(p2) - if numpy.linalg.det(M1)!=0: - k=numpy.linalg.inv(M1)*numpy.matrix([[pl2[0]-pl1[0]],[pl2[1]-pl1[1]]]) - elif numpy.linalg.det(M2)!=0: - k=numpy.linalg.inv(M2)*numpy.matrix([[pl2[1]-pl1[1]],[pl2[2]-pl1[2]]]) - else: - k=numpy.linalg.inv(M3)*numpy.matrix([[pl2[2]-pl1[2]],[pl2[0]-pl1[0]]]) - P=p1+v1*float(k[0]) # ..=p2+v2*float(k[1]) - #FreeCAD.Console.PrintWarning("k1 = "+str(float(k[0]))+"\nk2 = "+str(float(k[1]))+"\n") - return rounded(P) - else: #se i vettori non sono complanari <=> intersezione nulla - FreeCAD.Console.PrintError('Lines are not in the same plane.\n') - return None - else: #se i vettori sono paralleli <=> intersezione nulla - FreeCAD.Console.PrintError('Lines are parallel.\n') - return None -def intersectionPlane(base=None,v=None,face=None): - ''' - intersectionPlane(base,v,face) - Returns the point (vector) at the intersection of a line and a plane. - base (vector): the base point to be projected - v (vector): the direction of the line that intersect the plane - face (Face): the face that defines the plane to be intersect - ''' - # only for quick testing: - if base==v==face==None: - face = faces()[0] - beam=beams()[0] - base=beam.Placement.Base - v=beamAx(beam) - if isOrtho(v,face): - FreeCAD.Console.PrintError('Direction of projection and Face are parallel.\n') - return None - else: - # equation of plane: ax+by+cz+d=0 - a,b,c=list(face.normalAt(0,0)) - d=-face.CenterOfMass.dot(face.normalAt(0,0)) - #FreeCAD.Console.PrintMessage('a=%.2f b=%.2f c=%.2f d=%.2f\n' %(a,b,c,d)) - ## definition of line - #FreeCAD.Console.PrintMessage('base=(%.2f,%.2f,%.2f)\n' %(base.x,base.y,base.z)) - #FreeCAD.Console.PrintMessage('v=(%.2f,%.2f,%.2f)\n' %(v.x,v.y,v.z)) - ##intersection - k=-1*(a*base.x+b*base.y+c*base.z+d)/(a*v.x+b*v.y+c*v.z) - #FreeCAD.Console.PrintMessage('k=%f\n' %float(k)) - P=base+v*k - return rounded(P) - -def isOrtho(e1=None,e2=None): - '"True" if two Edges or Vectors or the normal of Faces are orthogonal (with a margin)' - v=[] - if (e1==None or e2==None): - if len(faces())>1: - e1,e2=faces()[:2] - elif len(edges())>1: - e1,e2=edges()[:2] - for e in [e1,e2]: - if hasattr(e,'ShapeType'): - if e.ShapeType=='Edge': - v.append(e.tangentAt(0)) - elif e.ShapeType=='Face': - v.append(e.normalAt(0,0)) +def intersectionLines2(p1=None, v1=None, p2=None, v2=None): # TODO! + """ + intersectionLines2(p1,v1,p2,v2) + Returns the intersection between one line and the plane that includes the + second line and orthogonal to the plane defined by both lines. + p1,v1: the reference point and direction of first line + p2,v2: the reference point and direction of second line + """ + if None in [p1, p2, v1, v2]: + p1 = edges()[0].valueAt(0) + v1 = edges()[0].tangentAt(0) + p2 = edges()[1].valueAt(0) + v2 = edges()[1].tangentAt(0) + if isParallel(v1, v2): + FreeCAD.Console.PrintError("Directions are pallel\n") + return None + else: + dist = p1 - p2 + norm = v2.cross(dist).cross(v1) + # P1=FreeCAD.Vector(p1.x,p1.y,p1.z) + return p1.projectToPlane(p2, norm) + + +def intersectionCLines(thing1=None, thing2=None): + """ + intersectionCLines(thing1=None, thing2=None) + Returns the intersection (vector) of the center lines of thing1 and thing2. + Things can be any combination of intersecting beams, pipes or edges. + If less than 2 arguments are given, thing1 and thing2 are the first 2 beams + or pipes found in the selection set. + """ + if not (thing1 and thing2): + try: + thing1, thing2 = beams()[:2] + except: + FreeCAD.Console.PrintError("Insufficient arguments for intersectionCLines\n") + return None + edges = [] + for thing in [thing1, thing2]: + if beams([thing]): + edges.append(vec2edge(thing.Placement.Base, beamAx(thing))) + elif hasattr(thing, "ShapeType") and thing.ShapeType == "Edge": + edges.append(thing) + intersections = dgu.findIntersection(*edges, infinite1=True, infinite2=True) + if len(intersections): + return rounded(intersections[0]) else: - v.append(e) - return round(v[0].dot(v[1]),2)==0 - -def isParallel(e1=None,e2=None): - '"True" if two Edges or Vectors or the normal of Faces are parallel (with a margin)' - v=[] - if (e1==None or e2==None): - if len(faces())>1: - e1,e2=faces()[:2] - elif len(edges())>1: - e1,e2=edges()[:2] - for e in [e1,e2]: - if hasattr(e,'ShapeType'): - if e.ShapeType=='Edge': - v.append(e.tangentAt(0)) - elif e.ShapeType=='Face': - v.append(e.normalAt(0,0)) + FreeCAD.Console.PrintError("No intersection found\n") + return None + + +def intersectionLines( + p1=None, v1=None, p2=None, v2=None +): # OBSOLETE: replaced with intersectionCLines + """ + intersectionLines(p1,v1,p2,v2) + If exist, returns the intersection (vector) between two lines + p1,v1: the reference point and direction of first line + p2,v2: the reference point and direction of second line + """ + + if None in [p1, p2, v1, v2]: + eds = edges()[:2] + p1, p2 = [e.valueAt(0) for e in eds] + v1, v2 = [e.tangentAt(0) for e in eds] + if not isParallel(v1, v2): + dist = p1 - p2 + import numpy + + # M=numpy.matrix([list(v1),list(v2),list(dist)]) # does not work: it seems for lack of accuracy of FreeCAD.Base.Vector operations! + rowM1 = [round(x, 2) for x in v1] + rowM2 = [round(x, 2) for x in v2] + rowM3 = [round(x, 2) for x in dist] + M = numpy.matrix([rowM1, rowM2, rowM3]) + if numpy.linalg.det(M) == 0: + # 3 equations, 2 unknowns => 1 eq. must be dependent + a11, a21, a31 = list(v1) + a12, a22, a32 = list(v2 * -1) + M1 = numpy.matrix([[a11, a12], [a21, a22]]) + M2 = numpy.matrix([[a21, a22], [a31, a32]]) + M3 = numpy.matrix([[a31, a32], [a11, a12]]) + pl1 = list(p1) + pl2 = list(p2) + if numpy.linalg.det(M1) != 0: + k = numpy.linalg.inv(M1) * numpy.matrix([[pl2[0] - pl1[0]], [pl2[1] - pl1[1]]]) + elif numpy.linalg.det(M2) != 0: + k = numpy.linalg.inv(M2) * numpy.matrix([[pl2[1] - pl1[1]], [pl2[2] - pl1[2]]]) + else: + k = numpy.linalg.inv(M3) * numpy.matrix([[pl2[2] - pl1[2]], [pl2[0] - pl1[0]]]) + P = p1 + v1 * float(k[0]) # ..=p2+v2*float(k[1]) + # FreeCAD.Console.PrintWarning("k1 = "+str(float(k[0]))+"\nk2 = "+str(float(k[1]))+"\n") + return rounded(P) + else: # se i vettori non sono complanari <=> intersezione nulla + FreeCAD.Console.PrintError("Lines are not in the same plane.\n") + return None + else: # se i vettori sono paralleli <=> intersezione nulla + FreeCAD.Console.PrintError("Lines are parallel.\n") + return None + + +def intersectionPlane(base=None, v=None, face=None): + """ + intersectionPlane(base,v,face) + Returns the point (vector) at the intersection of a line and a plane. + base (vector): the base point to be projected + v (vector): the direction of the line that intersect the plane + face (Face): the face that defines the plane to be intersect + """ + # only for quick testing: + if base == v == face == None: + face = faces()[0] + beam = beams()[0] + base = beam.Placement.Base + v = beamAx(beam) + if isOrtho(v, face): + FreeCAD.Console.PrintError("Direction of projection and Face are parallel.\n") + return None else: - v.append(e) - return round(v[0].cross(v[1]).Length,2)==0 #v[0].cross(v[1]).Length==0 + # equation of plane: ax+by+cz+d=0 + a, b, c = list(face.normalAt(0, 0)) + d = -face.CenterOfMass.dot(face.normalAt(0, 0)) + # FreeCAD.Console.PrintMessage('a=%.2f b=%.2f c=%.2f d=%.2f\n' %(a,b,c,d)) + ## definition of line + # FreeCAD.Console.PrintMessage('base=(%.2f,%.2f,%.2f)\n' %(base.x,base.y,base.z)) + # FreeCAD.Console.PrintMessage('v=(%.2f,%.2f,%.2f)\n' %(v.x,v.y,v.z)) + ##intersection + k = -1 * (a * base.x + b * base.y + c * base.z + d) / (a * v.x + b * v.y + c * v.z) + # FreeCAD.Console.PrintMessage('k=%f\n' %float(k)) + P = base + v * k + return rounded(P) + + +def isOrtho(e1=None, e2=None): + '"True" if two Edges or Vectors or the normal of Faces are orthogonal (with a margin)' + v = [] + if e1 == None or e2 == None: + if len(faces()) > 1: + e1, e2 = faces()[:2] + elif len(edges()) > 1: + e1, e2 = edges()[:2] + for e in [e1, e2]: + if hasattr(e, "ShapeType"): + if e.ShapeType == "Edge": + v.append(e.tangentAt(0)) + elif e.ShapeType == "Face": + v.append(e.normalAt(0, 0)) + else: + v.append(e) + return round(v[0].dot(v[1]), 2) == 0 + + +def isParallel(e1=None, e2=None): + '"True" if two Edges or Vectors or the normal of Faces are parallel (with a margin)' + v = [] + if e1 == None or e2 == None: + if len(faces()) > 1: + e1, e2 = faces()[:2] + elif len(edges()) > 1: + e1, e2 = edges()[:2] + for e in [e1, e2]: + if hasattr(e, "ShapeType"): + if e.ShapeType == "Edge": + v.append(e.tangentAt(0)) + elif e.ShapeType == "Face": + v.append(e.normalAt(0, 0)) + else: + v.append(e) + return round(v[0].cross(v[1]).Length, 2) == 0 # v[0].cross(v[1]).Length==0 + def beamAx(beam, vShapeRef=None): - ''' - beamAx(beam, vShapeRef=None) - Returns the new orientation of a vector referred to Shape's coordinates - rotated according the Placement of the object. - beam: the object (any) - vShapeRef: the Shape's reference vector (defaults Z axis of Shape) - ''' - if vShapeRef==None: - vShapeRef=FreeCAD.Vector(0.0,0.0,1.0) - return beam.Placement.Rotation.multVec(vShapeRef).normalize() + """ + beamAx(beam, vShapeRef=None) + Returns the new orientation of a vector referred to Shape's coordinates + rotated according the Placement of the object. + beam: the object (any) + vShapeRef: the Shape's reference vector (defaults Z axis of Shape) + """ + if vShapeRef == None: + vShapeRef = FreeCAD.Vector(0.0, 0.0, 1.0) + return beam.Placement.Rotation.multVec(vShapeRef).normalize() + def getDistance(shapes=None): - 'measure the lenght of an edge or the distance of two shapes' - if not shapes: - shapes=[y for x in FreeCADGui.Selection.getSelectionEx() for y in x.SubObjects if hasattr(y,'ShapeType')] - if len(shapes)==1 and shapes[0].ShapeType=='Edge': - return shapes[0].Length - elif len(shapes)>1: - return shapes[0].distToShape(shapes[1])[0] - else: - return None + "measure the length of an edge or the distance of two shapes" + if not shapes: + shapes = [ + y + for x in FreeCADGui.Selection.getSelectionEx() + for y in x.SubObjects + if hasattr(y, "ShapeType") + ] + if len(shapes) == 1 and shapes[0].ShapeType == "Edge": + return shapes[0].Length + elif len(shapes) > 1: + return shapes[0].distToShape(shapes[1])[0] + else: + return None + + +def bisect(w1=None, w2=None): + """ + bisect(w1=None,w2=None) + Returns the bisect vector between vectors w1 and w2. + If no argument is given the function takes the selected edges, if any. + """ + if w1 == w2 == None and len(edges()) >= 2: + w1, w2 = [(e.CenterOfMass - FreeCAD.Vector(0, 0, 0)).normalize() for e in edges()[:2]] + if w1 != None and w2 != None: + w1.normalize() + w2.normalize() + # b=w2-w1 + b = FreeCAD.Vector() + for i in range(3): + b[i] = (w1[i] + w2[i]) / 2 + return b.normalize() + + +def ortho(w1=None, w2=None): + """ + ortho(w1=None,w2=None) + Returns the orthogonal vector to vectors w1 and w2. + If no argument is given the function takes the selected edges, if any. + """ + if w1 == w2 == None and len(edges()) >= 2: + w1, w2 = [e.tangentAt(0) for e in edges()[:2]] + if w1 != None and w2 != None: + return w1.cross(w2).normalize() + + +def vec2edge(point, direct): + """ + vec2edge(point,direct) + Returns an edge placed at point with the orientation and length of direct. + """ + from Part import makeLine + + return makeLine(point, point + direct) + + +def edgeName(obj=None, edge=None): + if not obj or not edge: + try: + sx = FreeCADGui.Selection.getSelectionEx()[0] + edge = sx.SubObjects[0] + obj = sx.Object + except: + return None + if hasattr(obj, "Shape"): + i = 1 + for e in obj.Shape.Edges: + if e.isSame(edge): + return obj, "Edge" + str(i) + i += 1 + return None -def bisect(w1=None,w2=None): - ''' - bisect(w1=None,w2=None) - Returns the bisect vector between vectors w1 and w2. - If no argument is given the function takes the selected edges, if any. - ''' - if w1==w2==None and len(edges())>=2: - w1,w2=[(e.CenterOfMass-FreeCAD.Vector(0,0,0)).normalize() for e in edges()[:2]] - if w1!=None and w2!=None: - w1.normalize() - w2.normalize() - #b=w2-w1 - b=FreeCAD.Vector() - for i in range(3): - b[i]=(w1[i]+w2[i])/2 - return b.normalize() - -def ortho(w1=None,w2=None): - ''' - ortho(w1=None,w2=None) - Returns the orthogonal vector to vectors w1 and w2. - If no argument is given the function takes the selected edges, if any. - ''' - if w1==w2==None and len(edges())>=2: - w1,w2=[e.tangentAt(0) for e in edges()[:2]] - if w1!=None and w2!=None: - return w1.cross(w2).normalize() - -def vec2edge(point,direct): - ''' - vec2edge(point,direct) - Returns an edge placed at point with the orientation and length of direct. - ''' - from Part import makeLine - return makeLine(point,point+direct) - -def edgeName(obj=None,edge=None): - if not obj or not edge: - try: - sx=FreeCADGui.Selection.getSelectionEx()[0] - edge=sx.SubObjects[0] - obj=sx.Object - except: - return None - if hasattr(obj,'Shape'): - i=1 - for e in obj.Shape.Edges: - if e.isSame(edge): - return obj,"Edge"+str(i) - i+=1 - return None def isPartOfPart(obj): - ''' - returns the part to which obj belongs''' - for c in obj.InList: - if 'App.Part' in str(type(c)): return c - return None - + """ + returns the part to which obj belongs""" + for c in obj.InList: + if "App.Part" in str(type(c)): + return c + return None + + ############ COMMANDS ############# + def spinTheBeam(beam, angle): # OBSOLETE: replaced by rotateTheTubeAx - '''arg1=beam, arg2=angle: rotate the section of the beam - OBSOLETE: replaced by rotateTheTubeAx''' - if beam.TypeId=="Part::FeaturePython" and "Base" in beam.PropertiesList: - beam.Base.Placement=FreeCAD.Placement(FreeCAD.Vector(0.0,0.0,0.0),FreeCAD.Rotation(FreeCAD.Vector(0.0,0.0,1.0),angle)) + """arg1=beam, arg2=angle: rotate the section of the beam + OBSOLETE: replaced by rotateTheTubeAx""" + if beam.TypeId == "Part::FeaturePython" and "Base" in beam.PropertiesList: + beam.Base.Placement = FreeCAD.Placement( + FreeCAD.Vector(0.0, 0.0, 0.0), FreeCAD.Rotation(FreeCAD.Vector(0.0, 0.0, 1.0), angle) + ) + def placeTheBeam(beam, edge): - '''arg1= beam, arg2= edge: lay down the selected beam on the selected edge''' - vect=edge.tangentAt(0) - beam.Placement.Rotation=FreeCAD.Rotation(0,0,0,1) - rot=FreeCAD.Rotation(beam.Placement.Rotation.Axis,vect) - beam.Placement.Rotation=rot.multiply(beam.Placement.Rotation) - beam.Placement.Base=edge.valueAt(0) - beam.Height=edge.Length - -def rotTheBeam(beam,faceBase,faceAlign,invert=False): - '''arg1=beam, arg2=faceBase, arg3=faceToMakeParallel, arg4=invertTheNormal - Rotates the beams to make the flanges parallel to that of first selection.''' - from Part import Face - if type(faceBase)==Face: - n1=faceBase.normalAt(0,0) - elif type(faceBase)==FreeCAD.Base.Vector: - n1=faceBase - if invert: - n1=n1.negative() - n2=faceAlign.normalAt(0,0) - rot=FreeCAD.Rotation(n2,n1) - beam.Placement.Rotation=rot.multiply(beam.Placement.Rotation) - -def levelTheBeam(beam,faces): - '''arg1=beams2move, arg2=[faces]: Shifts the second selection to make its flange coplanar to that of the first selection''' - v=faces[0].CenterOfMass-faces[1].CenterOfMass - n=faces[0].normalAt(0,0) - dist=n.dot(v) - beam.Placement.move(n.multiply(dist)) - -def joinTheBeamsEdges(beam,e1,e2): - '''arg1=beam, arg2=edge target, arg3=edge start: aligns the edges''' - beam.Placement.move(e1.distToShape(e2)[1][0][0]-e1.distToShape(e2)[1][0][1]) - -def pivotTheBeam(ang=90, edge=None, beam=None): #OBSOLETE: replaced with rotateTheBeamAround - ''' - pivotTheBeam(ang=90) - Rotates the selected object around the selected pivot (one of its edges) - by ang degrees. - ''' - #if len(edges())!=1: - # FreeCAD.Console.PrintError('Wrong selection\n') - # return None - if not (edge and beam): - try: - edge=edges()[0] - beam=FreeCADGui.Selection.getSelection()[0] - except: - return - rot=FreeCAD.Rotation(edge.tangentAt(0),ang) - beam.Placement.Rotation=rot.multiply(beam.Placement.Rotation) - edgePost=edges()[0] #save position for revert - dist=edge.CenterOfMass-edgePost.CenterOfMass - beam.Placement.move(dist) - -def rotateTheBeamAround(b,e,ang=90): # for rotation around an axis - ''' - rotateTheBeamAround(b,e,ang=90): rotates any Body around an edge - b: any object with a Placement property - e: the edge being axis of rotation - ang: degrees of rotation - ''' - rot=FreeCAD.Rotation(e.tangentAt(0),ang) - from Part import Vertex - P0=Vertex(b.Placement.Base) - O=P0.distToShape(e)[1][0][1] - P1=O+rot.multVec(P0.Point-O) - b.Placement.Rotation=rot.multiply(b.Placement.Rotation) - b.Placement.Base=P1 #rot.multVec(b.Placement.Base) - -def stretchTheBeam(beam,L): - if beam!=None and beam.TypeId=="Part::FeaturePython" and hasattr(beam,"Height"): - beam.Height=L - -def extendTheBeam(beam,target): #TARGET [working]: make it work when target and beam belong to different App::Parts - '''arg1=beam, arg2=target: extend the beam to a plane, normal to its axis, defined by target. - If target is a Vertex or a Vector, the plane is the one that includes the point defined by target. - If target is a Face, the plane is the one that includes the intersection between the axis of beam and the plane of the face. - Else, the plane is the one normal to the axis of beam that includes the CenterOfMass of target''' - distBase=distTop=0 - vBase=beam.Placement.Base - vBeam=beamAx(beam) - h=beam.Height - vTop=vBase+vBeam.multiply(h) - if type(target)==FreeCAD.Vector: - distBase=vBase.distanceToPlane(target,vBeam) - distTop=vTop.distanceToPlane(target,vBeam) - elif target.ShapeType=="Vertex": - distBase=vBase.distanceToPlane(target.Point,vBeam) - distTop=vTop.distanceToPlane(target.Point,vBeam) - elif target.ShapeType=="Face": - if not isOrtho(target,vBeam): - from Part import Point - Pint=Point(intersectionPlane(beam.Placement.Base,beamAx(beam),target)).toShape() - distBase=vBase.distanceToPlane(Pint.Point,vBeam) - distTop=vTop.distanceToPlane(Pint.Point,vBeam) - elif hasattr(target,"CenterOfMass"): - distBase=vBase.distanceToPlane(target.CenterOfMass,vBeam) - distTop=vTop.distanceToPlane(target.CenterOfMass,vBeam) - if distBase*distTop>0: - if abs(distBase)>abs(distTop): - beam.Height+=FreeCAD.Units.Quantity(str(abs(distTop))+"mm") - else: - beam.Height+=FreeCAD.Units.Quantity(str(abs(distBase))+"mm") - vMove=vBeam.normalize().multiply(-distBase) - beam.Placement.move(vMove) - else: - if abs(distBase)>abs(distTop): - beam.Height-=FreeCAD.Units.Quantity(str(abs(distTop))+"mm") + """arg1= beam, arg2= edge: lay down the selected beam on the selected edge""" + vect = edge.tangentAt(0) + beam.Placement.Rotation = FreeCAD.Rotation(0, 0, 0, 1) + rot = FreeCAD.Rotation(beam.Placement.Rotation.Axis, vect) + beam.Placement.Rotation = rot.multiply(beam.Placement.Rotation) + beam.Placement.Base = edge.valueAt(0) + beam.Height = edge.Length + + +def rotTheBeam(beam, faceBase, faceAlign, invert=False): + """arg1=beam, arg2=faceBase, arg3=faceToMakeParallel, arg4=invertTheNormal + Rotates the beams to make the flanges parallel to that of first selection.""" + from Part import Face + + if type(faceBase) == Face: + n1 = faceBase.normalAt(0, 0) + elif type(faceBase) == FreeCAD.Base.Vector: + n1 = faceBase + if invert: + n1 = n1.negative() + n2 = faceAlign.normalAt(0, 0) + rot = FreeCAD.Rotation(n2, n1) + beam.Placement.Rotation = rot.multiply(beam.Placement.Rotation) + + +def levelTheBeam(beam, faces): + """arg1=beams2move, arg2=[faces]: Shifts the second selection to make its flange coplanar to that of the first selection""" + v = faces[0].CenterOfMass - faces[1].CenterOfMass + n = faces[0].normalAt(0, 0) + dist = n.dot(v) + beam.Placement.move(n.multiply(dist)) + + +def joinTheBeamsEdges(beam, e1, e2): + """arg1=beam, arg2=edge target, arg3=edge start: aligns the edges""" + beam.Placement.move(e1.distToShape(e2)[1][0][0] - e1.distToShape(e2)[1][0][1]) + + +def pivotTheBeam(ang=90, edge=None, beam=None): # OBSOLETE: replaced with rotateTheBeamAround + """ + pivotTheBeam(ang=90) + Rotates the selected object around the selected pivot (one of its edges) + by ang degrees. + """ + # if len(edges())!=1: + # FreeCAD.Console.PrintError('Wrong selection\n') + # return None + if not (edge and beam): + try: + edge = edges()[0] + beam = FreeCADGui.Selection.getSelection()[0] + except: + return + rot = FreeCAD.Rotation(edge.tangentAt(0), ang) + beam.Placement.Rotation = rot.multiply(beam.Placement.Rotation) + edgePost = edges()[0] # save position for revert + dist = edge.CenterOfMass - edgePost.CenterOfMass + beam.Placement.move(dist) + + +def rotateTheBeamAround(b, e, ang=90): # for rotation around an axis + """ + rotateTheBeamAround(b,e,ang=90): rotates any Body around an edge + b: any object with a Placement property + e: the edge being axis of rotation + ang: degrees of rotation + """ + rot = FreeCAD.Rotation(e.tangentAt(0), ang) + from Part import Vertex + + P0 = Vertex(b.Placement.Base) + O = P0.distToShape(e)[1][0][1] + P1 = O + rot.multVec(P0.Point - O) + b.Placement.Rotation = rot.multiply(b.Placement.Rotation) + b.Placement.Base = P1 # rot.multVec(b.Placement.Base) + + +def stretchTheBeam(beam, L): + if beam != None and beam.TypeId == "Part::FeaturePython" and hasattr(beam, "Height"): + beam.Height = L + + +def extendTheBeam( + beam, target +): # TARGET [working]: make it work when target and beam belong to different App::Parts + """arg1=beam, arg2=target: extend the beam to a plane, normal to its axis, defined by target. + If target is a Vertex or a Vector, the plane is the one that includes the point defined by target. + If target is a Face, the plane is the one that includes the intersection between the axis of beam and the plane of the face. + Else, the plane is the one normal to the axis of beam that includes the CenterOfMass of target + """ + distBase = distTop = 0 + vBase = beam.Placement.Base + vBeam = beamAx(beam) + h = beam.Height + vTop = vBase + vBeam.multiply(h) + if type(target) == FreeCAD.Vector: + distBase = vBase.distanceToPlane(target, vBeam) + distTop = vTop.distanceToPlane(target, vBeam) + elif target.ShapeType == "Vertex": + distBase = vBase.distanceToPlane(target.Point, vBeam) + distTop = vTop.distanceToPlane(target.Point, vBeam) + elif target.ShapeType == "Face": + if not isOrtho(target, vBeam): + from Part import Point + + Pint = Point(intersectionPlane(beam.Placement.Base, beamAx(beam), target)).toShape() + distBase = vBase.distanceToPlane(Pint.Point, vBeam) + distTop = vTop.distanceToPlane(Pint.Point, vBeam) + elif hasattr(target, "CenterOfMass"): + distBase = vBase.distanceToPlane(target.CenterOfMass, vBeam) + distTop = vTop.distanceToPlane(target.CenterOfMass, vBeam) + if distBase * distTop > 0: + if abs(distBase) > abs(distTop): + beam.Height += FreeCAD.Units.Quantity(str(abs(distTop)) + "mm") + else: + beam.Height += FreeCAD.Units.Quantity(str(abs(distBase)) + "mm") + vMove = vBeam.normalize().multiply(-distBase) + beam.Placement.move(vMove) else: - beam.Height-=FreeCAD.Units.Quantity(str(abs(distBase))+"mm") - vMove=vBeam.normalize().multiply(-distBase) - beam.Placement.move(vMove) - #FreeCAD.activeDocument().recompute() - -def rotjoinTheBeam(beam=None,e1=None,e2=None): - if not (beam and e1 and e2): - beam=beams()[1] - e1,e2=edges() - rot=FreeCAD.Rotation(e2.tangentAt(0),e1.tangentAt(0)) - dist=dgu.findDistance(beam.Placement.Base,e1) - delta=beam.Placement.Base-e2.CenterOfMass - beam.Placement.Rotation=rot.multiply(beam.Placement.Rotation) - beam.Placement.move(rounded(dist+rot.multVec(delta))) + if abs(distBase) > abs(distTop): + beam.Height -= FreeCAD.Units.Quantity(str(abs(distTop)) + "mm") + else: + beam.Height -= FreeCAD.Units.Quantity(str(abs(distBase)) + "mm") + vMove = vBeam.normalize().multiply(-distBase) + beam.Placement.move(vMove) + # FreeCAD.activeDocument().recompute() + + +def rotjoinTheBeam(beam=None, e1=None, e2=None): + if not (beam and e1 and e2): + beam = beams()[1] + e1, e2 = edges() + rot = FreeCAD.Rotation(e2.tangentAt(0), e1.tangentAt(0)) + dist = dgu.findDistance(beam.Placement.Base, e1) + delta = beam.Placement.Base - e2.CenterOfMass + beam.Placement.Rotation = rot.multiply(beam.Placement.Rotation) + beam.Placement.move(rounded(dist + rot.multVec(delta))) + def getSolids(allDoc=True): - ''' + """ Get solid objects inside the active document o just selected solid objects based on alldoc parameter config return solid objects into selection class - ''' - if allDoc: - objects=FreeCAD.ActiveDocument.Objects - else: - objects=FreeCADGui.Selection.getSelection() - FreeCADGui.Selection.clearSelection() - for o in objects: - if hasattr(o,'Shape') and o.Shape.Solids: - FreeCADGui.Selection.addSelection(o) - + """ + if allDoc: + objects = FreeCAD.ActiveDocument.Objects + else: + objects = FreeCADGui.Selection.getSelection() + FreeCADGui.Selection.clearSelection() + for o in objects: + if hasattr(o, "Shape") and o.Shape.Solids: + FreeCADGui.Selection.addSelection(o) + + def getFaces(allDoc=True): - ''' + """ Get faces from whole document or treview o viewport selection based on alldoc parameter config return faces into selection class - ''' - if allDoc: - objects=FreeCAD.ActiveDocument.Objects - else: - objects=FreeCADGui.Selection.getSelection() - FreeCADGui.Selection.clearSelection() - for o in objects: - if hasattr(o,'Shape'): - for i in range(len(o.Shape.Faces)): - print( str(o)+': '+str(i+1)) - FreeCADGui.Selection.addSelection(o,'Face'+str(i+1)) - + """ + if allDoc: + objects = FreeCAD.ActiveDocument.Objects + else: + objects = FreeCADGui.Selection.getSelection() + FreeCADGui.Selection.clearSelection() + for o in objects: + if hasattr(o, "Shape"): + for i in range(len(o.Shape.Faces)): + print(str(o) + ": " + str(i + 1)) + FreeCADGui.Selection.addSelection(o, "Face" + str(i + 1)) diff --git a/fForms.py b/fForms.py index f18fb55..1c463a5 100644 --- a/fForms.py +++ b/fForms.py @@ -1,6 +1,6 @@ -#(c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD -__license__="LGPL 3" +__license__ = "LGPL 3" from os.path import abspath, dirname, join @@ -19,572 +19,718 @@ class fillForm(dodoDialogs.protoTypeDialog): - 'dialog for fillFrame()' - def __init__(self): - super(fillForm,self).__init__('fillframe.ui') - self.beam=None - self.form.btn1.clicked.connect(self.selectAction) - def accept(self): - if self.beam!=None and len(fCmd.edges())>0: - FreeCAD.activeDocument().openTransaction('Fill frame') - if self.form.radio1.isChecked(): - fCmd.placeTheBeam(self.beam,fCmd.edges()[0]) - else: - for edge in fCmd.edges(): - struct=FreeCAD.activeDocument().copyObject(self.beam,True) - fCmd.placeTheBeam(struct,edge) - FreeCAD.activeDocument().recompute() - FreeCAD.ActiveDocument.recompute() - FreeCAD.activeDocument().commitTransaction() - def selectAction(self): - if len(fCmd.beams())>0: - self.beam=fCmd.beams()[0] - self.form.label.setText(self.beam.Label+':'+self.beam.Profile) - FreeCADGui.Selection.removeSelection(self.beam) + "dialog for fillFrame()" + + def __init__(self): + super(fillForm, self).__init__("fillframe.ui") + self.beam = None + self.form.btn1.clicked.connect(self.selectAction) + + def accept(self): + if self.beam != None and len(fCmd.edges()) > 0: + FreeCAD.activeDocument().openTransaction("Fill frame") + if self.form.radio1.isChecked(): + fCmd.placeTheBeam(self.beam, fCmd.edges()[0]) + else: + for edge in fCmd.edges(): + struct = FreeCAD.activeDocument().copyObject(self.beam, True) + fCmd.placeTheBeam(struct, edge) + FreeCAD.activeDocument().recompute() + FreeCAD.ActiveDocument.recompute() + FreeCAD.activeDocument().commitTransaction() + + def selectAction(self): + if len(fCmd.beams()) > 0: + self.beam = fCmd.beams()[0] + self.form.label.setText(self.beam.Label + ":" + self.beam.Profile) + FreeCADGui.Selection.removeSelection(self.beam) + class extendForm(dodoDialogs.protoTypeDialog): - 'dialog for fCmd.extendTheBeam()' - def __init__(self): - super(extendForm,self).__init__('extend.ui') - selex = FreeCADGui.Selection.getSelectionEx() - self.form.btn1.clicked.connect(self.selectAction) - if len(selex): - self.target=selex[0].SubObjects[0] - self.form.label.setText(selex[0].Object.Label+':'+self.target.ShapeType) - FreeCADGui.Selection.removeSelection(selex[0].Object) - else: - self.target=None - def selectAction(self): - selex = FreeCADGui.Selection.getSelectionEx() - if len(selex[0].SubObjects)>0 and hasattr(selex[0].SubObjects[0],'ShapeType'): - self.target=selex[0].SubObjects[0] - self.form.label.setText(selex[0].Object.Label+':'+self.target.ShapeType) - FreeCADGui.Selection.clearSelection() - def accept(self): # extend - if self.target!=None and len(fCmd.beams())>0: - FreeCAD.activeDocument().openTransaction('Extend beam') - for beam in fCmd.beams(): - fCmd.extendTheBeam(beam,self.target) - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - + "dialog for fCmd.extendTheBeam()" + + def __init__(self): + super(extendForm, self).__init__("extend.ui") + selex = FreeCADGui.Selection.getSelectionEx() + self.form.btn1.clicked.connect(self.selectAction) + if len(selex): + self.target = selex[0].SubObjects[0] + self.form.label.setText(selex[0].Object.Label + ":" + self.target.ShapeType) + FreeCADGui.Selection.removeSelection(selex[0].Object) + else: + self.target = None + + def selectAction(self): + selex = FreeCADGui.Selection.getSelectionEx() + if len(selex[0].SubObjects) > 0 and hasattr(selex[0].SubObjects[0], "ShapeType"): + self.target = selex[0].SubObjects[0] + self.form.label.setText(selex[0].Object.Label + ":" + self.target.ShapeType) + FreeCADGui.Selection.clearSelection() + + def accept(self): # extend + if self.target != None and len(fCmd.beams()) > 0: + FreeCAD.activeDocument().openTransaction("Extend beam") + for beam in fCmd.beams(): + fCmd.extendTheBeam(beam, self.target) + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + class stretchForm(dodoDialogs.protoTypeDialog): - '''dialog for stretchTheBeam() + """dialog for stretchTheBeam() [Get Length] measures the min. distance of the selected objects or the length of the selected edge or the Height of the selected beam [ Stretch ] changes the Height of the selected beams - ''' - def __init__(self): - self.L=None - super(stretchForm,self).__init__('beamstretch.ui') - self.form.edit1.setValidator(QDoubleValidator()) - self.form.edit1.editingFinished.connect(self.edit12L) - self.form.btn1.clicked.connect(self.selectAction) - self.form.slider.setMinimum(-100) - self.form.slider.setMaximum(100) - self.form.slider.setValue(0) - self.form.slider.valueChanged.connect(self.changeL) - self.labTail=None - def edit12L(self): - if self.form.edit1.text(): - self.L=float(self.form.edit1.text()) - self.form.slider.setValue(0) - def changeL(self): - if self.L: - ext=self.L*(1+self.form.slider.value()/100.0) - self.form.edit1.setText("%.3f" %ext) - def selectAction(self): - if self.labTail: - self.labTail.removeLabel() - self.labTail=None - self.L=fCmd.getDistance() - if self.L: - self.form.edit1.setText("%.3f"%self.L) - elif fCmd.beams(): - beam=fCmd.beams()[0] - self.L=float(beam.Height) - self.form.edit1.setText("%.3f"%self.L) - else: - self.form.edit1.setText('') - self.form.slider.setValue(0) - # self.writeTail() - # def writeTail(self): + """ + + def __init__(self): + self.L = None + super(stretchForm, self).__init__("beamstretch.ui") + self.form.edit1.setValidator(QDoubleValidator()) + self.form.edit1.editingFinished.connect(self.edit12L) + self.form.btn1.clicked.connect(self.selectAction) + self.form.slider.setMinimum(-100) + self.form.slider.setMaximum(100) + self.form.slider.setValue(0) + self.form.slider.valueChanged.connect(self.changeL) + self.labTail = None + + def edit12L(self): + if self.form.edit1.text(): + self.L = float(self.form.edit1.text()) + self.form.slider.setValue(0) + + def changeL(self): + if self.L: + ext = self.L * (1 + self.form.slider.value() / 100.0) + self.form.edit1.setText("%.3f" % ext) + + def selectAction(self): + if self.labTail: + self.labTail.removeLabel() + self.labTail = None + self.L = fCmd.getDistance() + if self.L: + self.form.edit1.setText("%.3f" % self.L) + elif fCmd.beams(): + beam = fCmd.beams()[0] + self.L = float(beam.Height) + self.form.edit1.setText("%.3f" % self.L) + else: + self.form.edit1.setText("") + self.form.slider.setValue(0) + # self.writeTail() + + # def writeTail(self): # if fCmd.beams(): - # beam=fCmd.beams()[0] - # from uCmd import label3D - # self.labTail=label3D(pl=beam.Placement, text='____TAIL') - def accept(self): - if self.labTail: - self.labTail.removeLabel() - self.labTail=None - self.L=fCmd.getDistance() - if self.form.edit1.text(): - length=float(self.form.edit1.text()) - FreeCAD.activeDocument().openTransaction('Stretch beam') - for beam in fCmd.beams(): - delta=float(beam.Height)-length - fCmd.stretchTheBeam(beam,length) - if self.form.tail.isChecked(): - disp=fCmd.beamAx(beam).multiply(delta) - beam.Placement.move(disp) - elif self.form.both.isChecked(): - disp=fCmd.beamAx(beam).multiply(delta/2.0) - beam.Placement.move(disp) - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - def reject(self): # redefined to remove label from the scene - if self.labTail: - self.labTail.removeLabel() - super(stretchForm,self).reject() - def mouseActionB1(self, CtrlAltShift): - v = FreeCADGui.ActiveDocument.ActiveView - i = v.getObjectInfo(v.getCursorPos()) - if i: - labText=i['Object'] - obj=FreeCAD.ActiveDocument.getObject(i['Object']) - if hasattr(obj,'Height'): + # beam=fCmd.beams()[0] + # from uCmd import label3D + # self.labTail=label3D(pl=beam.Placement, text='____TAIL') + def accept(self): if self.labTail: - self.labTail.removeLabel() - self.labTail=label3D(pl=obj.Placement, text='____TAIL') - else: + self.labTail.removeLabel() + self.labTail = None + self.L = fCmd.getDistance() + if self.form.edit1.text(): + length = float(self.form.edit1.text()) + FreeCAD.activeDocument().openTransaction("Stretch beam") + for beam in fCmd.beams(): + delta = float(beam.Height) - length + fCmd.stretchTheBeam(beam, length) + if self.form.tail.isChecked(): + disp = fCmd.beamAx(beam).multiply(delta) + beam.Placement.move(disp) + elif self.form.both.isChecked(): + disp = fCmd.beamAx(beam).multiply(delta / 2.0) + beam.Placement.move(disp) + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def reject(self): # redefined to remove label from the scene if self.labTail: - self.labTail.removeLabel() - self.labTail=label3D(pl=FreeCAD.Placement(), text='') - else: - if self.labTail: - self.labTail.removeLabel() - self.labTail=label3D(pl=FreeCAD.Placement(), text='') - -class translateForm(dodoDialogs.protoTypeDialog): - 'dialog for moving blocks' - def __init__(self): - super(translateForm,self).__init__("beamshift.ui") - for e in [self.form.edit1,self.form.edit2,self.form.edit3,self.form.edit4,self.form.edit5]: - e.setValidator(QDoubleValidator()) - self.form.btn1.clicked.connect(self.selectAction) - self.arrow=None - def getDistance(self): - self.deleteArrow() - roundDigits=3 - shapes=[y for x in FreeCADGui.Selection.getSelectionEx() for y in x.SubObjects if hasattr(y,'ShapeType')][:2] - if len(shapes)>1: # if at least 2 shapes selected.... - base,target=shapes[:2] - disp=None - if base.ShapeType==target.ShapeType=='Vertex': - disp=target.Point-base.Point - elif base.ShapeType==target.ShapeType=='Edge': - if base.curvatureAt(0): - P1=base.centerOfCurvatureAt(0) + self.labTail.removeLabel() + super(stretchForm, self).reject() + + def mouseActionB1(self, CtrlAltShift): + v = FreeCADGui.ActiveDocument.ActiveView + i = v.getObjectInfo(v.getCursorPos()) + if i: + labText = i["Object"] + obj = FreeCAD.ActiveDocument.getObject(i["Object"]) + if hasattr(obj, "Height"): + if self.labTail: + self.labTail.removeLabel() + self.labTail = label3D(pl=obj.Placement, text="____TAIL") + else: + if self.labTail: + self.labTail.removeLabel() + self.labTail = label3D(pl=FreeCAD.Placement(), text="") else: - P1=base.CenterOfMass - if target.curvatureAt(0): - P2=target.centerOfCurvatureAt(0) + if self.labTail: + self.labTail.removeLabel() + self.labTail = label3D(pl=FreeCAD.Placement(), text="") + + +class translateForm(dodoDialogs.protoTypeDialog): + "dialog for moving blocks" + + def __init__(self): + super(translateForm, self).__init__("beamshift.ui") + for e in [ + self.form.edit1, + self.form.edit2, + self.form.edit3, + self.form.edit4, + self.form.edit5, + ]: + e.setValidator(QDoubleValidator()) + self.form.btn1.clicked.connect(self.selectAction) + self.arrow = None + + def getDistance(self): + self.deleteArrow() + roundDigits = 3 + shapes = [ + y + for x in FreeCADGui.Selection.getSelectionEx() + for y in x.SubObjects + if hasattr(y, "ShapeType") + ][:2] + if len(shapes) > 1: # if at least 2 shapes selected.... + base, target = shapes[:2] + disp = None + if base.ShapeType == target.ShapeType == "Vertex": + disp = target.Point - base.Point + elif base.ShapeType == target.ShapeType == "Edge": + if base.curvatureAt(0): + P1 = base.centerOfCurvatureAt(0) + else: + P1 = base.CenterOfMass + if target.curvatureAt(0): + P2 = target.centerOfCurvatureAt(0) + else: + P2 = target.CenterOfMass + disp = P2 - P1 + elif set([base.ShapeType, target.ShapeType]) == {"Vertex", "Edge"}: + P = list() + i = 0 + for o in [base, target]: + if o.ShapeType == "Vertex": + P.append(o.Point) + elif o.curvatureAt(0): + P.append(o.centerOfCurvatureAt(0)) + else: + return + i += 1 + disp = P[1] - P[0] + elif base.ShapeType == "Vertex" and target.ShapeType == "Face": + disp = ( + fCmd.intersectionPlane(base.Point, target.normalAt(0, 0), target) - base.Point + ) + elif base.ShapeType == "Face" and target.ShapeType == "Vertex": + disp = target.Point - fCmd.intersectionPlane( + target.Point, base.normalAt(0, 0), base + ) + disp = P[1] - P[0] + if disp != None: + self.form.edit4.setText(str(disp.Length)) + self.form.edit5.setText("1") + disp.normalize() + dx, dy, dz = list(disp) + self.form.edit1.setText(str(round(dx, roundDigits))) + self.form.edit2.setText(str(round(dy, roundDigits))) + self.form.edit3.setText(str(round(dz, roundDigits))) + FreeCADGui.Selection.clearSelection() + + def getLength(self): + roundDigits = 3 + if len(fCmd.edges()) > 0: + edge = fCmd.edges()[0] + self.form.edit4.setText(str(edge.Length)) + self.form.edit5.setText("1") + dx, dy, dz = list(edge.tangentAt(0)) + self.form.edit1.setText(str(round(dx, roundDigits))) + self.form.edit2.setText(str(round(dy, roundDigits))) + self.form.edit3.setText(str(round(dz, roundDigits))) + self.deleteArrow() + from uCmd import arrow + + where = FreeCAD.Placement() + where.Base = edge.valueAt(0) + where.Rotation = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), edge.tangentAt(0)) + # obj=fCmd.edgeName[0] #TARGET [working]: make "where" deal with App::Parts + # if fCmd.isPartOfPart(obj): + # part=fCmd.isPartOfPart(obj) + # where=part.Placement.multiply(where) + size = [edge.Length / 20.0, edge.Length / 10.0, edge.Length / 20.0] + self.arrow = arrow(pl=where, scale=size, offset=edge.Length / 2.0) + FreeCADGui.Selection.clearSelection() + + def selectAction(self): + shapes = [ + y + for x in FreeCADGui.Selection.getSelectionEx() + for y in x.SubObjects + if hasattr(y, "ShapeType") + ][:2] + if len(shapes) > 1: + self.getDistance() + elif len(fCmd.edges()) > 0: + self.getLength() + + def accept(self): # translate + self.deleteArrow() + scale = float(self.form.edit4.text()) / float(self.form.edit5.text()) + disp = FreeCAD.Vector( + float(self.form.edit1.text()) * self.form.cbX.isChecked(), + float(self.form.edit2.text()) * self.form.cbY.isChecked(), + float(self.form.edit3.text()) * self.form.cbZ.isChecked(), + ).scale(scale, scale, scale) + FreeCAD.activeDocument().openTransaction("Translate") + for o in set(FreeCADGui.Selection.getSelection()): + if self.form.cbCopy.isChecked(): + for i in range(self.form.spinBox.value()): + FreeCAD.activeDocument().copyObject(o, True).Placement.move(disp * (i + 1)) + else: + o.Placement.move(disp) + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + def deleteArrow(self): + if self.arrow: + self.arrow.closeArrow() # FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(self.arrow.node) + self.arrow = None + + def reject(self): # redefined to remove arrow from scene + self.deleteArrow() + super(translateForm, self).reject() + + +class alignForm(dodoDialogs.protoTypeDialog): + "dialog to flush faces" + + def __init__(self): + super(alignForm, self).__init__("align.ui") + self.faceRef = None + self.selectAction() + self.form.btn1.clicked.connect(self.selectAction) + self.form.btnXY.clicked.connect(lambda: self.refPlane(FreeCAD.Vector(0, 0, 1))) + self.form.btnXZ.clicked.connect(lambda: self.refPlane(FreeCAD.Vector(0, 1, 0))) + self.form.btnYZ.clicked.connect(lambda: self.refPlane(FreeCAD.Vector(1, 0, 0))) + self.form.X.setValidator(QDoubleValidator()) + self.form.btnNorm.clicked.connect( + lambda: self.refPlane( + FreeCAD.Vector( + float(self.form.X.text()), float(self.form.Y.text()), float(self.form.Z.text()) + ) + ) + ) + self.form.Y.setValidator(QDoubleValidator()) + self.form.Z.setValidator(QDoubleValidator()) + + def selectAction(self): + if fCmd.faces(): + a = [ + (o, fCmd.faces([o])[0]) + for o in FreeCADGui.Selection.getSelectionEx() + if fCmd.faces([o]) + ][0] + self.faceRef = a[1] + self.form.label.setText(a[0].Object.Label + ":Face") + FreeCADGui.Selection.clearSelection() + + def refPlane(self, norm): + self.faceRef = norm + if norm == FreeCAD.Vector(0, 0, 1): + self.form.label.setText("plane XY") + elif norm == FreeCAD.Vector(0, 1, 0): + self.form.label.setText("plane XZ") + elif norm == FreeCAD.Vector(1, 0, 0): + self.form.label.setText("plane YZ") else: - P2=target.CenterOfMass - disp=P2-P1 - elif set([base.ShapeType,target.ShapeType])=={'Vertex','Edge'}: - P=list() - i=0 - for o in [base,target]: - if o.ShapeType=='Vertex': - P.append(o.Point) - elif o.curvatureAt(0): - P.append(o.centerOfCurvatureAt(0)) - else: - return - i+=1 - disp=P[1]-P[0] - elif base.ShapeType=='Vertex' and target.ShapeType=='Face': - disp=fCmd.intersectionPlane(base.Point,target.normalAt(0,0),target)-base.Point - elif base.ShapeType=='Face' and target.ShapeType=='Vertex': - disp=target.Point-fCmd.intersectionPlane(target.Point,base.normalAt(0,0),base) - disp=P[1]-P[0] - if disp!=None: - self.form.edit4.setText(str(disp.Length)) - self.form.edit5.setText('1') - disp.normalize() - dx,dy,dz=list(disp) - self.form.edit1.setText(str(round(dx,roundDigits))) - self.form.edit2.setText(str(round(dy,roundDigits))) - self.form.edit3.setText(str(round(dz,roundDigits))) - FreeCADGui.Selection.clearSelection() - def getLength(self): - roundDigits=3 - if len(fCmd.edges())>0: - edge=fCmd.edges()[0] - self.form.edit4.setText(str(edge.Length)) - self.form.edit5.setText('1') - dx,dy,dz=list(edge.tangentAt(0)) - self.form.edit1.setText(str(round(dx,roundDigits))) - self.form.edit2.setText(str(round(dy,roundDigits))) - self.form.edit3.setText(str(round(dz,roundDigits))) - self.deleteArrow() - from uCmd import arrow - where=FreeCAD.Placement() - where.Base=edge.valueAt(0) - where.Rotation=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),edge.tangentAt(0)) - # obj=fCmd.edgeName[0] #TARGET [working]: make "where" deal with App::Parts - # if fCmd.isPartOfPart(obj): - # part=fCmd.isPartOfPart(obj) - # where=part.Placement.multiply(where) - size=[edge.Length/20.0,edge.Length/10.0,edge.Length/20.0] - self.arrow=arrow(pl=where,scale=size,offset=edge.Length/2.0) - FreeCADGui.Selection.clearSelection() - def selectAction(self): - shapes=[y for x in FreeCADGui.Selection.getSelectionEx() for y in x.SubObjects if hasattr(y,'ShapeType')][:2] - if len(shapes)>1: - self.getDistance() - elif len(fCmd.edges())>0: - self.getLength() - def accept(self): # translate - self.deleteArrow() - scale=float(self.form.edit4.text())/float(self.form.edit5.text()) - disp=FreeCAD.Vector(float(self.form.edit1.text())*self.form.cbX.isChecked(),float(self.form.edit2.text())*self.form.cbY.isChecked(),float(self.form.edit3.text())*self.form.cbZ.isChecked()).scale(scale,scale,scale) - FreeCAD.activeDocument().openTransaction('Translate') - for o in set(FreeCADGui.Selection.getSelection()): - if self.form.cbCopy.isChecked(): - for i in range(self.form.spinBox.value()): - FreeCAD.activeDocument().copyObject(o,True).Placement.move(disp*(i+1)) - else: - o.Placement.move(disp) - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - def deleteArrow(self): - if self.arrow: self.arrow.closeArrow() #FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(self.arrow.node) - self.arrow=None - def reject(self): # redefined to remove arrow from scene - self.deleteArrow() - super(translateForm,self).reject() - -class alignForm(dodoDialogs.protoTypeDialog): - 'dialog to flush faces' - def __init__(self): - super(alignForm,self).__init__('align.ui') - self.faceRef=None - self.selectAction() - self.form.btn1.clicked.connect(self.selectAction) - self.form.btnXY.clicked.connect(lambda: self.refPlane(FreeCAD.Vector(0,0,1))) - self.form.btnXZ.clicked.connect(lambda: self.refPlane(FreeCAD.Vector(0,1,0))) - self.form.btnYZ.clicked.connect(lambda: self.refPlane(FreeCAD.Vector(1,0,0))) - self.form.X.setValidator(QDoubleValidator()) - self.form.btnNorm.clicked.connect(lambda: self.refPlane(FreeCAD.Vector(float(self.form.X.text()),float(self.form.Y.text()),float(self.form.Z.text())))) - self.form.Y.setValidator(QDoubleValidator()) - self.form.Z.setValidator(QDoubleValidator()) - def selectAction(self): - if fCmd.faces(): - a=[(o,fCmd.faces([o])[0]) for o in FreeCADGui.Selection.getSelectionEx() if fCmd.faces([o])][0] - self.faceRef=a[1] - self.form.label.setText(a[0].Object.Label+':Face') - FreeCADGui.Selection.clearSelection() - def refPlane(self,norm): - self.faceRef=norm - if norm==FreeCAD.Vector(0,0,1): - self.form.label.setText('plane XY') - elif norm==FreeCAD.Vector(0,1,0): - self.form.label.setText('plane XZ') - elif norm==FreeCAD.Vector(1,0,0): - self.form.label.setText('plane YZ') - else: - self.form.label.setText('normal: X=%.2f Y=%.2f Z=%.2f' %(norm.x,norm.y,norm.z)) - for edit in [self.form.X, self.form.Y, self.form.Z]: - edit.clear() - def accept(self): - faces=fCmd.faces() - objs=FreeCADGui.Selection.getSelection() #beams=fCmd.beams() - if len(faces)==len(objs)>0 and self.faceRef: - FreeCAD.activeDocument().openTransaction('AlignFlange') - if self.form.cbInvert.isChecked(): - for i in range(len(objs)): - fCmd.rotTheBeam(objs[i],self.faceRef,faces[i],True) - else: - for i in range(len(objs)): - fCmd.rotTheBeam(objs[i],self.faceRef,faces[i]) - FreeCAD.activeDocument().recompute() - FreeCAD.activeDocument().commitTransaction() - + self.form.label.setText("normal: X=%.2f Y=%.2f Z=%.2f" % (norm.x, norm.y, norm.z)) + for edit in [self.form.X, self.form.Y, self.form.Z]: + edit.clear() + + def accept(self): + faces = fCmd.faces() + objs = FreeCADGui.Selection.getSelection() # beams=fCmd.beams() + if len(faces) == len(objs) > 0 and self.faceRef: + FreeCAD.activeDocument().openTransaction("AlignFlange") + if self.form.cbInvert.isChecked(): + for i in range(len(objs)): + fCmd.rotTheBeam(objs[i], self.faceRef, faces[i], True) + else: + for i in range(len(objs)): + fCmd.rotTheBeam(objs[i], self.faceRef, faces[i]) + FreeCAD.activeDocument().recompute() + FreeCAD.activeDocument().commitTransaction() + + class rotateAroundForm(dodoDialogs.protoTypeDialog): - ''' - Dialog for rotateTheBeamAround(). - It allows to rotate one object around one edge or the axis of a circular edge (or one principal axis.) - ''' - def __init__(self): - super(rotateAroundForm,self).__init__('rotAround.ui') - self.form.edit1.setValidator(QDoubleValidator()) - self.form.btn1.clicked.connect(self.selectAction) - self.form.btn2.clicked.connect(self.reverse) - self.form.btnX.clicked.connect(lambda: self.getPrincipalAx('X')) - self.form.btnY.clicked.connect(lambda: self.getPrincipalAx('Y')) - self.form.btnZ.clicked.connect(lambda: self.getPrincipalAx('Z')) - self.form.dial.valueChanged.connect(lambda: self.form.edit1.setText(str(self.form.dial.value()))) - self.form.edit1.editingFinished.connect(lambda: self.form.dial.setValue(int(self.form.edit1.text()))) - self.Axis=None - self.arrow=None - self.selectAction() - def accept(self, ang=None): #TARGET [working]: not correct if objects belong to different App::Part - if not ang: - ang=float(self.form.edit1.text()) - self.deleteArrow() - objects=FreeCADGui.Selection.getSelection() - if objects and self.Axis: - FreeCAD.ActiveDocument.openTransaction('rotateTheBeamAround') - for o in objects: - if self.form.copyCB.isChecked(): - FreeCAD.activeDocument().copyObject(o,True) - fCmd.rotateTheBeamAround(o,self.Axis,ang) - FreeCAD.ActiveDocument.commitTransaction() - def reverse(self): - ang=float(self.form.edit1.text())*-1 - self.form.edit1.setText('%.0f'%ang) - self.form.dial.setValue(int(self.form.edit1.text())) - self.accept(ang*2) - def getPrincipalAx(self, ax='Z'): - self.deleteArrow() - from Part import Edge,Line - O=FreeCAD.Vector() - l=Line(O,FreeCAD.Vector(0,0,1000)) - if ax=='X': - l=Line(O,FreeCAD.Vector(1000,0,0)) - elif ax=='Y': - l=Line(O,FreeCAD.Vector(0,1000,0)) - self.Axis=Edge(l) - self.form.lab1.setText("Principal: "+ax) - def selectAction(self): - edged = [objex for objex in FreeCADGui.Selection.getSelectionEx() if fCmd.edges([objex])] - if edged: - self.Axis=fCmd.edges([edged[0]])[0] - self.deleteArrow() - from uCmd import arrow - where=FreeCAD.Placement() - where.Base=self.Axis.valueAt(self.Axis.LastParameter) - where.Rotation=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),self.Axis.tangentAt(self.Axis.LastParameter)) - obj=edged[0].Object #TARGET [solved]: make "where" deal with App::Parts - if fCmd.isPartOfPart(obj): - part=fCmd.isPartOfPart(obj) - where=part.Placement.multiply(where) - size=[self.Axis.Length/20.0,self.Axis.Length/10.0,self.Axis.Length/20.0] - self.arrow=arrow(pl=where,scale=size,offset=self.Axis.Length/10.0) - if self.Axis.curvatureAt(0): - O=self.Axis.centerOfCurvatureAt(0) - n=self.Axis.tangentAt(0).cross(self.Axis.normalAt(0)) + """ + Dialog for rotateTheBeamAround(). + It allows to rotate one object around one edge or the axis of a circular edge (or one principal axis.) + """ + + def __init__(self): + super(rotateAroundForm, self).__init__("rotAround.ui") + self.form.edit1.setValidator(QDoubleValidator()) + self.form.btn1.clicked.connect(self.selectAction) + self.form.btn2.clicked.connect(self.reverse) + self.form.btnX.clicked.connect(lambda: self.getPrincipalAx("X")) + self.form.btnY.clicked.connect(lambda: self.getPrincipalAx("Y")) + self.form.btnZ.clicked.connect(lambda: self.getPrincipalAx("Z")) + self.form.dial.valueChanged.connect( + lambda: self.form.edit1.setText(str(self.form.dial.value())) + ) + self.form.edit1.editingFinished.connect( + lambda: self.form.dial.setValue(int(self.form.edit1.text())) + ) + self.Axis = None + self.arrow = None + self.selectAction() + + def accept( + self, ang=None + ): # TARGET [working]: not correct if objects belong to different App::Part + if not ang: + ang = float(self.form.edit1.text()) + self.deleteArrow() + objects = FreeCADGui.Selection.getSelection() + if objects and self.Axis: + FreeCAD.ActiveDocument.openTransaction("rotateTheBeamAround") + for o in objects: + if self.form.copyCB.isChecked(): + FreeCAD.activeDocument().copyObject(o, True) + fCmd.rotateTheBeamAround(o, self.Axis, ang) + FreeCAD.ActiveDocument.commitTransaction() + + def reverse(self): + ang = float(self.form.edit1.text()) * -1 + self.form.edit1.setText("%.0f" % ang) + self.form.dial.setValue(int(self.form.edit1.text())) + self.accept(ang * 2) + + def getPrincipalAx(self, ax="Z"): + self.deleteArrow() from Part import Edge, Line - self.Axis=(Edge(Line(FreeCAD.Vector(O),FreeCAD.Vector(O+n)))) - self.form.lab1.setText(edged[0].Object.Label+": edge") - def deleteArrow(self): - if self.arrow: self.arrow.closeArrow() - self.arrow=None - def reject(self): # redefined to remove arrow from scene - self.deleteArrow() - super(rotateAroundForm,self).reject() + + O = FreeCAD.Vector() + l = Line(O, FreeCAD.Vector(0, 0, 1000)) + if ax == "X": + l = Line(O, FreeCAD.Vector(1000, 0, 0)) + elif ax == "Y": + l = Line(O, FreeCAD.Vector(0, 1000, 0)) + self.Axis = Edge(l) + self.form.lab1.setText("Principal: " + ax) + + def selectAction(self): + edged = [objex for objex in FreeCADGui.Selection.getSelectionEx() if fCmd.edges([objex])] + if edged: + self.Axis = fCmd.edges([edged[0]])[0] + self.deleteArrow() + from uCmd import arrow + + where = FreeCAD.Placement() + where.Base = self.Axis.valueAt(self.Axis.LastParameter) + where.Rotation = FreeCAD.Rotation( + FreeCAD.Vector(0, 0, 1), self.Axis.tangentAt(self.Axis.LastParameter) + ) + obj = edged[0].Object # TARGET [solved]: make "where" deal with App::Parts + if fCmd.isPartOfPart(obj): + part = fCmd.isPartOfPart(obj) + where = part.Placement.multiply(where) + size = [self.Axis.Length / 20.0, self.Axis.Length / 10.0, self.Axis.Length / 20.0] + self.arrow = arrow(pl=where, scale=size, offset=self.Axis.Length / 10.0) + if self.Axis.curvatureAt(0): + O = self.Axis.centerOfCurvatureAt(0) + n = self.Axis.tangentAt(0).cross(self.Axis.normalAt(0)) + from Part import Edge, Line + + self.Axis = Edge(Line(FreeCAD.Vector(O), FreeCAD.Vector(O + n))) + self.form.lab1.setText(edged[0].Object.Label + ": edge") + + def deleteArrow(self): + if self.arrow: + self.arrow.closeArrow() + self.arrow = None + + def reject(self): # redefined to remove arrow from scene + self.deleteArrow() + super(rotateAroundForm, self).reject() + ###### PROFILE EDITOR ######## import fFeatures -# the icons -pixs=[pixSquare,pixT,pixU,pixH,pixL,pixZ,pixOmega,pixCircle]=[QPixmap(join(dirname(abspath(__file__)),"iconz","sectionz",fileName)) for fileName in ["square.png","T.png","U.png","H.png","L.png","Z.png","omega.png","circle.png"]] +# the icons +pixs = [pixSquare, pixT, pixU, pixH, pixL, pixZ, pixOmega, pixCircle] = [ + QPixmap(join(dirname(abspath(__file__)), "iconz", "sectionz", fileName)) + for fileName in [ + "square.png", + "T.png", + "U.png", + "H.png", + "L.png", + "Z.png", + "omega.png", + "circle.png", + ] +] + class profEdit(dodoDialogs.protoTypeDialog): - def __init__(self): - super(profEdit,self).__init__("sections.ui") - self.setProfile('square') - self.form.editB.editingFinished.connect(lambda: self.form.editD.setText(self.form.editB.text())) - self.form.editT2.editingFinished.connect(lambda: self.form.editT3.setText(self.form.editT2.text())) - self.form.tbSquare.clicked.connect(lambda: self.setProfile('square')) - self.form.tbCircle.clicked.connect(lambda: self.setProfile('circle')) - self.form.tbT.clicked.connect(lambda: self.setProfile('T')) - self.form.tbU.clicked.connect(lambda: self.setProfile('U')) - self.form.tbH.clicked.connect(lambda: self.setProfile('H')) - self.form.tbL.clicked.connect(lambda: self.setProfile('L')) - self.form.tbZ.clicked.connect(lambda: self.setProfile('Z')) - self.form.btn1.clicked.connect(self.apply) - self.form.btn2.clicked.connect(lambda: self.shiftProfile(None)) - self.form.tbOmega.clicked.connect(lambda: self.setProfile('omega')) - for z in list(zip(pixs,[self.form.tbSquare,self.form.tbT,self.form.tbU,self.form.tbH,self.form.tbL,self.form.tbZ,self.form.tbOmega,self.form.tbCircle])): - icon = QIcon() - icon.addPixmap(z[0], QIcon.Normal, QIcon.Off) - z[1].setIcon(icon) - # TODO: translation - def setProfile(self, typeS): - if typeS=='square': - self.form.labImg.setPixmap(pixSquare) - self.type="R" - self.label=translate("profEdit", "Square", "Profile name in the Tree View") - elif typeS=='T': - self.form.labImg.setPixmap(pixT) - self.type="T" - self.label=translate("profEdit", "T-profile", "Profile name in the Tree View") - elif typeS=='U': - self.form.labImg.setPixmap(pixU) - self.type="U" - self.label=translate("profEdit", "U-profile", "Profile name in the Tree View") - elif typeS=='H': - self.form.labImg.setPixmap(pixH) - self.type="H" - self.label=translate("profEdit", "H-profile", "Profile name in the Tree View") - elif typeS=='L': - self.form.labImg.setPixmap(pixL) - self.type="L" - self.label=translate("profEdit", "L-profile", "Profile name in the Tree View") - elif typeS=='Z': - self.form.labImg.setPixmap(pixZ) - self.type="Z" - self.label=translate("profEdit", "Z-profile", "Profile name in the Tree View") - elif typeS=='omega': - self.form.labImg.setPixmap(pixOmega) - self.type="omega" - self.label=translate("profEdit", "Omega-profile", "Profile name in the Tree View") - elif typeS=='circle': - self.form.labImg.setPixmap(pixCircle) - self.type="circle" - self.label=translate("profEdit", "Circle-profile", "Profile name in the Tree View") - def accept(self): - D, H, B, t1, t2, t3 = float(self.form.editD.text()),\ - float(self.form.editH.text()),\ - float(self.form.editB.text()),\ - float(self.form.editT1.text()),\ - float(self.form.editT2.text()),\ - float(self.form.editT3.text()) - if not self.form.lineEdit.text(): label=self.label - else: label= self.form.lineEdit.text() - if FreeCAD.ActiveDocument: - FreeCAD.activeDocument().openTransaction(translate("profEdit", "Insert profile", "Transaction, used on undo/redo lists")) - if self.type=='R': - if not self.form.cbFull.isChecked() and t2') + v = FreeCADGui.ActiveDocument.ActiveView + i = v.getObjectInfo(v.getCursorPos()) + if i: + labText = i["Object"] + obj = FreeCAD.ActiveDocument.getObject(i["Object"]) + if hasattr(obj, "FType") and obj.FType in FTypes: + if obj.FType == "R": + self.setProfile("R") + elif obj.FType == "circle": + self.setProfile("circle") + elif obj.FType == "T": + self.setProfile("T") + elif obj.FType == "H": + self.setProfile("H") + elif obj.FType == "L": + self.setProfile("L") + elif obj.FType == "U": + self.setProfile("U") + elif obj.FType == "Z": + self.setProfile("Z") + elif obj.FType == "omega": + self.setProfile("omega") + ############### + self.form.lineEdit.setText(obj.Label) + if hasattr(obj, "H"): + self.form.editH.setText(str(float(obj.H.Value))) + else: + self.form.editH.setText("0") + if hasattr(obj, "W"): + self.form.editB.setText(str(float(obj.W))) + else: + self.form.editW.setText("0") + if hasattr(obj, "D"): + self.form.editD.setText(str(float(obj.D))) + else: + self.form.editD.setText("0") + if hasattr(obj, "t1"): + self.form.editT1.setText(str(float(obj.t1))) + else: + self.form.editT1.setText("0") + if hasattr(obj, "t2"): + self.form.editT2.setText(str(float(obj.t2))) + else: + self.form.editT2.setText("0") + if hasattr(obj, "t3"): + self.form.editT3.setText(str(float(obj.t3))) + else: + self.form.editT3.setText("0") + # self.form.labSelect.setText(obj.Label) else: - sect=fFeatures.doProfile(self.type,label,[D,t1]) - FreeCAD.ActiveDocument.recompute() - self.shiftProfile(sect) - FreeCAD.activeDocument().commitTransaction() - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() - def apply(self): - D, H, B, t1, t2, t3 = float(self.form.editD.text()),\ - float(self.form.editH.text()),\ - float(self.form.editB.text()),\ - float(self.form.editT1.text()),\ - float(self.form.editT2.text()),\ - float(self.form.editT3.text()) - sel=FreeCADGui.Selection.getSelection() - if sel: - obj=sel[0] - if hasattr(obj,'Shape') and obj.Shape.ShapeType in ('Face','Shell'): - FreeCAD.ActiveDocument.openTransaction(translate("profEdit", "Modify profile", "Transaction, used on undo/redo lists")) - if self.form.lineEdit.text(): - obj.Label = self.form.lineEdit.text() - if hasattr(obj,'H'): - obj.H=H - if hasattr(obj,'W'): - obj.W=B - if hasattr(obj,'D'): - obj.D=D - if hasattr(obj,'t1'): - obj.t1=t1 - if hasattr(obj,'t2'): - obj.t2=t2 - if hasattr(obj,'t3'): - obj.t3=t3 - FreeCAD.ActiveDocument.commitTransaction() - #self.shiftProfile(obj) - FreeCAD.ActiveDocument.recompute() - def mouseActionB1(self,CtrlAltShift): - # self.form.labSelect.setText('') - v = FreeCADGui.ActiveDocument.ActiveView - i = v.getObjectInfo(v.getCursorPos()) - if i: - labText=i['Object'] - obj=FreeCAD.ActiveDocument.getObject(i['Object']) - if hasattr(obj,'FType') and obj.FType in FTypes: - if obj.FType=='R': - self.setProfile('R') - elif obj.FType=='circle': - self.setProfile('circle') - elif obj.FType=='T': - self.setProfile('T') - elif obj.FType=='H': - self.setProfile('H') - elif obj.FType=='L': - self.setProfile('L') - elif obj.FType=='U': - self.setProfile('U') - elif obj.FType=='Z': - self.setProfile('Z') - elif obj.FType=='omega': - self.setProfile('omega') - ############### - self.form.lineEdit.setText(obj.Label) - if hasattr(obj,'H'): self.form.editH.setText(str(float(obj.H.Value))) - else: self.form.editH.setText('0') - if hasattr(obj,'W'): self.form.editB.setText(str(float(obj.W))) - else: self.form.editW.setText('0') - if hasattr(obj,'D'): self.form.editD.setText(str(float(obj.D))) - else: self.form.editD.setText('0') - if hasattr(obj,'t1'): self.form.editT1.setText(str(float(obj.t1))) - else: self.form.editT1.setText('0') - if hasattr(obj,'t2'): self.form.editT2.setText(str(float(obj.t2))) - else: self.form.editT2.setText('0') - if hasattr(obj,'t3'): self.form.editT3.setText(str(float(obj.t3))) - else: self.form.editT3.setText('0') - # self.form.labSelect.setText(obj.Label) - else: - self.form.editH.setText('80') - self.form.editB.setText('45') - self.form.editD.setText('45') - self.form.editT1.setText('5') - self.form.editT2.setText('5') - self.form.editT3.setText('5') - # self.form.labSelect.setText('') - self.form.lineEdit.setText('') - def shiftProfile (self,sect=None): - if not sect: - sel=FreeCADGui.Selection.getSelection() - if sel and hasattr(sel[0],'FType'): sect=sel[0] - if sect: - sect.Placement.move(sect.Shape.CenterOfMass.negative()) - FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.openTransaction(translate("profEdit", "Shift profile", "Transaction, used on undo/redo lists")) - B=sect.Shape.BoundBox - O=sect.Shape.CenterOfMass - N=FreeCAD.Vector(0,O.y-B.YMin,0) - S=FreeCAD.Vector(0,O.y-B.YMax,0) - E=FreeCAD.Vector(O.x-B.XMin,0,0) - W=FreeCAD.Vector(O.x-B.XMax,0,0) - delta=FreeCAD.Vector() - if self.form.rbN.isChecked(): - delta=S - elif self.form.rbS.isChecked(): - delta=N - elif self.form.rbE.isChecked(): - delta=W - elif self.form.rbW.isChecked(): - delta=E - elif self.form.rbNE.isChecked(): - delta=S.add(W) - elif self.form.rbNW.isChecked(): - delta=S.add(E) - elif self.form.rbSE.isChecked(): - delta=N.add(W) - elif self.form.rbSW.isChecked(): - delta=N.add(E) - elif self.form.rbC.isChecked(): - delta=O*-1 - sect.Placement.move(delta) - FreeCAD.ActiveDocument.commitTransaction() + self.form.editH.setText("80") + self.form.editB.setText("45") + self.form.editD.setText("45") + self.form.editT1.setText("5") + self.form.editT2.setText("5") + self.form.editT3.setText("5") + # self.form.labSelect.setText('') + self.form.lineEdit.setText("") + + def shiftProfile(self, sect=None): + if not sect: + sel = FreeCADGui.Selection.getSelection() + if sel and hasattr(sel[0], "FType"): + sect = sel[0] + if sect: + sect.Placement.move(sect.Shape.CenterOfMass.negative()) + FreeCAD.ActiveDocument.recompute() + FreeCAD.ActiveDocument.openTransaction( + translate("profEdit", "Shift profile", "Transaction, used on undo/redo lists") + ) + B = sect.Shape.BoundBox + O = sect.Shape.CenterOfMass + N = FreeCAD.Vector(0, O.y - B.YMin, 0) + S = FreeCAD.Vector(0, O.y - B.YMax, 0) + E = FreeCAD.Vector(O.x - B.XMin, 0, 0) + W = FreeCAD.Vector(O.x - B.XMax, 0, 0) + delta = FreeCAD.Vector() + if self.form.rbN.isChecked(): + delta = S + elif self.form.rbS.isChecked(): + delta = N + elif self.form.rbE.isChecked(): + delta = W + elif self.form.rbW.isChecked(): + delta = E + elif self.form.rbNE.isChecked(): + delta = S.add(W) + elif self.form.rbNW.isChecked(): + delta = S.add(E) + elif self.form.rbSE.isChecked(): + delta = N.add(W) + elif self.form.rbSW.isChecked(): + delta = N.add(E) + elif self.form.rbC.isChecked(): + delta = O * -1 + sect.Placement.move(delta) + FreeCAD.ActiveDocument.commitTransaction() diff --git a/fObservers.py b/fObservers.py index d986fa6..e91a5dd 100644 --- a/fObservers.py +++ b/fObservers.py @@ -47,18 +47,13 @@ def addSelection(self, doc, obj, sub, pnt): if self.beam == None and hasattr(selex[len(selex) - 1].Object, "Height"): self.beam = selex[len(selex) - 1].Object FreeCAD.Console.PrintMessage("Beam selected\n") - elif ( - self.edge == None - and selex[len(selex) - 1].SubObjects[0].ShapeType == "Edge" - ): + elif self.edge == None and selex[len(selex) - 1].SubObjects[0].ShapeType == "Edge": self.edge = selex[len(selex) - 1].SubObjects[0] FreeCAD.Console.PrintMessage("Edge selected\n") if self.edge != None and self.beam != None: fCmd.placeTheBeam(self.beam, self.edge) FreeCAD.Console.PrintMessage("Beam placed.\n") - FreeCAD.Console.PrintWarning( - "Select another beam and another edge.\n[ESC] to exit.\n" - ) + FreeCAD.Console.PrintWarning("Select another beam and another edge.\n[ESC] to exit.\n") self.beam = self.edge = None FreeCAD.activeDocument().recompute() @@ -80,17 +75,13 @@ def addSelection(self, doc, obj, sub, pnt): else: subObject = FreeCAD.getDocument(doc).getObject(obj).Shape.getElement(sub) if subObject.ShapeType == "Edge" and self.beam != None: - fCmd.placeTheBeam( - FreeCAD.activeDocument().copyObject(self.beam, True), subObject - ) + fCmd.placeTheBeam(FreeCAD.activeDocument().copyObject(self.beam, True), subObject) class levelBeamObserver(frameObserverPrototype): def __init__(self): super(levelBeamObserver, self).__init__( - translate( - "fObservers", "First select the target plane, then the faces to align" - ) + translate("fObservers", "First select the target plane, then the faces to align") ) self.targetFace = None @@ -128,9 +119,7 @@ def addSelection(self, doc, obj, sub, pnt): FreeCAD.activeDocument().openTransaction( translate("fObservers", "alignFlange", "Transaction") ) - fCmd.rotTheBeam( - FreeCAD.getDocument(doc).getObject(obj), self.faceBase, subObject - ) + fCmd.rotTheBeam(FreeCAD.getDocument(doc).getObject(obj), self.faceBase, subObject) FreeCAD.activeDocument().commitTransaction() @@ -168,11 +157,7 @@ def __init__(self): def addSelection(self, doc, obj, sub, pnt): Obj = FreeCAD.getDocument(doc).getObject(obj) - if ( - self.beam == None - and Obj.TypeId == "Part::FeaturePython" - and hasattr(Obj, "Height") - ): + if self.beam == None and Obj.TypeId == "Part::FeaturePython" and hasattr(Obj, "Height"): self.beam = Obj FreeCAD.Console.PrintMessage("Beam type selected.\n") from PySide.QtGui import QInputDialog as qid @@ -194,9 +179,7 @@ def addSelection(self, doc, obj, sub, pnt): class extendObserver(frameObserverPrototype): # OBSOLETE: replaced with dialog def __init__(self): super(extendObserver, self).__init__( - translate( - "fObservers", "First Select the target shape, then the beams to extend." - ) + translate("fObservers", "First Select the target shape, then the beams to extend.") ) self.target = None @@ -216,9 +199,7 @@ def addSelection(self, doc, obj, sub, pnt): class adjustAngleObserver(frameObserverPrototype): def __init__(self): - super(adjustAngleObserver, self).__init__( - translate("fObservers", "Select 2 edges") - ) + super(adjustAngleObserver, self).__init__(translate("fObservers", "Select 2 edges")) self.edges = [] self.beams = [] diff --git a/pCmd.py b/pCmd.py index 2562274..8c8a286 100644 --- a/pCmd.py +++ b/pCmd.py @@ -90,10 +90,7 @@ def moveToPyLi(obj, plName): if obj.PType in objToPaint: obj.ViewObject.ShapeColor = pl.ViewObject.ShapeColor elif obj.PType == "PypeBranch": - for e in [ - FreeCAD.ActiveDocument.getObject(name) - for name in obj.Tubes + obj.Curves - ]: + for e in [FreeCAD.ActiveDocument.getObject(name) for name in obj.Tubes + obj.Curves]: e.ViewObject.ShapeColor = pl.ViewObject.ShapeColor @@ -126,11 +123,7 @@ def portsDir(o): dirs.append(rounded(o.Placement.Rotation.multVec(p).normalize())) else: dirs.append( - rounded( - o.Placement.Rotation.multVec( - FreeCAD.Vector(0, 0, -1) - ).normalize() - ) + rounded(o.Placement.Rotation.multVec(FreeCAD.Vector(0, 0, -1)).normalize()) ) return dirs @@ -225,9 +218,7 @@ def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): for face in fCmd.faces(): x = (face.ParameterRange[0] + face.ParameterRange[1]) / 2 y = (face.ParameterRange[2] + face.ParameterRange[3]) / 2 - plist.append( - makePipe(propList, face.valueAt(x, y), face.normalAt(x, y)) - ) + plist.append(makePipe(propList, face.valueAt(x, y), face.normalAt(x, y))) FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() else: @@ -308,11 +299,7 @@ def makeElbowBetweenThings(thing1=None, thing2=None, propList=None): if fCmd.beams([thing]): directions.append( rounded( - ( - fCmd.beamAx(thing).multiply(thing.Height / 2) - + thing.Placement.Base - ) - - P + (fCmd.beamAx(thing).multiply(thing.Height / 2) + thing.Placement.Base) - P ) ) elif hasattr(thing, "ShapeType") and thing.ShapeType == "Edge": @@ -326,9 +313,7 @@ def makeElbowBetweenThings(thing1=None, thing2=None, propList=None): propList = ["DN50", 60.3, 3.91, ang, 45.24] else: propList[3] = ang - elb = makeElbow( - propList, P, directions[0].negative().cross(directions[1].negative()) - ) + elb = makeElbow(propList, P, directions[0].negative().cross(directions[1].negative())) # mate the elbow ends with the pipes or edges b = fCmd.bisect(directions[0], directions[1]) elbBisect = rounded( @@ -389,8 +374,7 @@ def doElbow(propList=["DN50", 60.3, 3, 90, 45.225], pypeline=None): elb.Placement.move(P - Port0) elif isElbow(selex[0].Object): # ..on the edge of an elbow p0, p1 = [ - selex[0].Object.Placement.Rotation.multVec(p) - for p in selex[0].Object.Ports + selex[0].Object.Placement.Rotation.multVec(p) for p in selex[0].Object.Ports ] if fCmd.isParallel(p0, N): elb.Placement.Rotation = FreeCAD.Rotation(elb.Ports[0], p0 * -1) @@ -469,9 +453,7 @@ def makeFlange(propList=[], pos=None, Z=None): return a -def doFlanges( - propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0], pypeline=None -): +def doFlanges(propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0], pypeline=None): """ propList = [ DN (string): nominal diameter @@ -548,7 +530,7 @@ def makeReduct(propList=[], pos=None, Z=None, conc=True): H (float): length of reduction pos (vector): position of insertion; default = 0,0,0 Z (vector): orientation: default = 0,0,1 - conc (bool): True for concentric or Flase for eccentric reduction + conc (bool): True for concentric or False for eccentric reduction Remember: property PRating must be defined afterwards """ if pos == None: @@ -673,10 +655,7 @@ def doCaps(propList=["DN50", 60.3, 3], pypeline=None): ] Z = None if len(objs) > 0: # ...pype objects are selected - Z = ( - edge.centerOfCurvatureAt(0) - - objs[0].Shape.Solids[0].CenterOfMass - ) + Z = edge.centerOfCurvatureAt(0) - objs[0].Shape.Solids[0].CenterOfMass else: # ...no pype objects are selected Z = edge.tangentAt(0).cross(edge.normalAt(0)) clist.append(makeCap(propList, edge.centerOfCurvatureAt(0), Z)) @@ -752,9 +731,7 @@ def makePypeLine2( a.ViewObject.ShapeColor = color if len(FreeCADGui.Selection.getSelection()) == 1: obj = FreeCADGui.Selection.getSelection()[0] - isWire = ( - hasattr(obj, "Shape") and obj.Shape.Edges - ) # type(obj.Shape)==Part.Wire + isWire = hasattr(obj, "Shape") and obj.Shape.Edges # type(obj.Shape)==Part.Wire isSketch = hasattr(obj, "TypeId") and obj.TypeId == "Sketcher::SketchObject" if isWire or isSketch: a.Base = obj @@ -769,9 +746,7 @@ def makePypeLine2( a = FreeCAD.ActiveDocument.getObjectsByLabel(pl)[0] group = FreeCAD.ActiveDocument.getObjectsByLabel(a.Group)[0] a.Proxy.update(a, fCmd.edges()) - FreeCAD.Console.PrintWarning( - "Objects added to pypeline's group " + a.Group + "\n" - ) + FreeCAD.Console.PrintWarning("Objects added to pypeline's group " + a.Group + "\n") return a @@ -826,8 +801,7 @@ def updatePLColor(sel=None, color=None): o.ViewObject.ShapeColor = color elif o.PType == "PypeBranch": for e in [ - FreeCAD.ActiveDocument.getObject(name) - for name in o.Tubes + o.Curves + FreeCAD.ActiveDocument.getObject(name) for name in o.Tubes + o.Curves ]: e.ViewObject.ShapeColor = color else: @@ -863,9 +837,7 @@ def alignTheTube(): com1, com2 = [t.Shape.Solids[0].CenterOfMass for t in [t1, t2]] if isElbow(t2): pass - elif (com1 - d1.centerOfCurvatureAt(0)).dot( - com2 - d1.centerOfCurvatureAt(0) - ) > 0: + elif (com1 - d1.centerOfCurvatureAt(0)).dot(com2 - d1.centerOfCurvatureAt(0)) > 0: reverseTheTube(FreeCADGui.Selection.getSelectionEx()[:2][1]) except: pass @@ -947,9 +919,7 @@ def placeTheElbow(c, v1=None, v2=None, P=None): c.BendAngle = ang rot1 = FreeCAD.Rotation(rounded(fCmd.beamAx(c, FreeCAD.Vector(0, 0, 1))), ortho) c.Placement.Rotation = rot1.multiply(c.Placement.Rotation) - rot2 = FreeCAD.Rotation( - rounded(fCmd.beamAx(c, FreeCAD.Vector(1, 1, 0))), bisect - ) + rot2 = FreeCAD.Rotation(rounded(fCmd.beamAx(c, FreeCAD.Vector(1, 1, 0))), bisect) c.Placement.Rotation = rot2.multiply(c.Placement.Rotation) if not P: P = c.Placement.Base @@ -993,9 +963,7 @@ def placeThePype(pypeObject, port=0, target=None, targetPort=0): The pype shall be selected to the circular edge nearest to the port concerned. """ pos = Z = FreeCAD.Vector() - if ( - target and hasattr(target, "PType") and hasattr(target, "Ports") - ): # target is given + if target and hasattr(target, "PType") and hasattr(target, "Ports"): # target is given pos = portsPos(target)[targetPort] Z = portsDir(target)[targetPort] else: # find target @@ -1055,9 +1023,7 @@ def extendTheTubes2intersection(pipe1=None, pipe2=None, both=True): try: pipe1, pipe2 = fCmd.beams()[:2] except: - FreeCAD.Console.PrintError( - "Insufficient arguments for extendTheTubes2intersection\n" - ) + FreeCAD.Console.PrintError("Insufficient arguments for extendTheTubes2intersection\n") P = fCmd.intersectionCLines(pipe1, pipe2) if P != None: fCmd.extendTheBeam(pipe1, P) @@ -1140,9 +1106,7 @@ def laydownTheTube(pipe=None, refFace=None, support=None): ): dist = rounded( refFace.normalAt(0, 0).multiply( - refFace.normalAt(0, 0).dot( - pipe.Placement.Base - refFace.CenterOfMass - ) + refFace.normalAt(0, 0).dot(pipe.Placement.Base - refFace.CenterOfMass) - float(pipe.OD) / 2 ) ) @@ -1151,9 +1115,7 @@ def laydownTheTube(pipe=None, refFace=None, support=None): else: pipe.Placement.move(dist.multiply(-1)) else: - FreeCAD.Console.PrintError( - "Face is not flat or not parallel to axis of pipe\n" - ) + FreeCAD.Console.PrintError("Face is not flat or not parallel to axis of pipe\n") except: FreeCAD.Console.PrintError("Wrong selection\n") @@ -1205,7 +1167,7 @@ def getElbowPort(elbow, portId=0): def rotateTheElbowPort(curve=None, port=0, ang=45): """ rotateTheElbowPort(curve=None, port=0, ang=45) - Rotates one curve aroud one of its circular edges. + Rotates one curve around one of its circular edges. """ if curve == None: try: @@ -1389,13 +1351,9 @@ def attachToTube(port=None): if p.PType == "Elbow": p.AttachmentOffset = FreeCAD.Placement( FreeCAD.Vector(0, 0, p.Ports[0].Length), - FreeCAD.Rotation( - p.Ports[1], FreeCAD.Vector(0, 0, 1).negative() - ), + FreeCAD.Rotation(p.Ports[1], FreeCAD.Vector(0, 0, 1).negative()), ) - FreeCAD.Console.PrintMessage( - "%s attached to %s\n" % (p.Label, tube.Label) - ) + FreeCAD.Console.PrintMessage("%s attached to %s\n" % (p.Label, tube.Label)) else: for p in pypes: p.MapMode = "Deactivated" diff --git a/pFeatures.py b/pFeatures.py index 59a2e08..f410e5c 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -27,6 +27,7 @@ ################ CLASSES ########################### + class pypeType(object): def __init__(self, obj): obj.Proxy = self @@ -106,6 +107,7 @@ def nearestPort(self, point=None): nearest = i return nearest, pos, Z + class Pipe(pypeType): """Class for object PType="Pipe" Pipe(obj,[PSize="DN50",OD=60.3,thk=3, H=100]) @@ -140,7 +142,9 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, H=100): "ID", "Pipe", QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), - ).ID = obj.OD - 2 * obj.thk + ).ID = ( + obj.OD - 2 * obj.thk + ) obj.addProperty( "App::PropertyLength", "Height", @@ -152,7 +156,9 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, H=100): "Profile", "Pipe", QT_TRANSLATE_NOOP("App::Property", "Section dim."), - ).Profile = str(obj.OD) + "x" + str(obj.thk) + ).Profile = ( + str(obj.OD) + "x" + str(obj.thk) + ) def onChanged(self, fp, prop): if prop == "ID" and fp.ID < fp.OD: @@ -194,6 +200,7 @@ def execute(self, fp): fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.Height))] super(Pipe, self).execute(fp) # perform common operations + class Elbow(pypeType): """Class for object PType="Elbow" Elbow(obj,[PSize="DN50",OD=60.3,thk=3,BA=90,BR=45.225]) @@ -229,7 +236,9 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, BA=90, BR=45.225): "ID", "Elbow", QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), - ).ID = obj.OD - 2 * obj.thk + ).ID = ( + obj.OD - 2 * obj.thk + ) obj.addProperty( "App::PropertyAngle", "BendAngle", @@ -247,7 +256,9 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, BA=90, BR=45.225): "Profile", "Elbow", QT_TRANSLATE_NOOP("App::Property", "Section dim."), - ).Profile = str(obj.OD) + "x" + str(obj.thk) + ).Profile = ( + str(obj.OD) + "x" + str(obj.thk) + ) # obj.Ports=[FreeCAD.Vector(1,0,0),FreeCAD.Vector(0,1,0)] self.execute(obj) @@ -261,8 +272,8 @@ def execute(self, fp): try: edges = parent.Base.Shape.Edges i = parent.Curves.index(fp.Name) - v1,v2=[e.tangentAt(0) for e in edges[i:i+2]] - pCmd.placeTheElbow(fp,v1,v2) + v1, v2 = [e.tangentAt(0) for e in edges[i : i + 2]] + pCmd.placeTheElbow(fp, v1, v2) except Exception as e: # FreeCAD.Console.PrintWarning(str(e) + "\n") pass @@ -283,25 +294,17 @@ def execute(self, fp): ## move the cl so that Placement.Base is the center of elbow ## from math import pi, cos, sqrt - d = fp.BendRadius * sqrt(2) - fp.BendRadius / cos( - fp.BendAngle / 180 * pi / 2 - ) + d = fp.BendRadius * sqrt(2) - fp.BendRadius / cos(fp.BendAngle / 180 * pi / 2) P = FreeCAD.Vector(-d * cos(pi / 4), -d * cos(pi / 4), 0) R.translate(P) ## calculate Ports position ## fp.Ports = [R.valueAt(R.FirstParameter), R.valueAt(R.LastParameter)] ## make the shape of the elbow ## - c = Part.makeCircle( - fp.OD / 2, fp.Ports[0], R.tangentAt(R.FirstParameter) * -1 - ) + c = Part.makeCircle(fp.OD / 2, fp.Ports[0], R.tangentAt(R.FirstParameter) * -1) b = Part.makeSweepSurface(R, c) p1 = Part.Face(Part.Wire(c)) p2 = Part.Face( - Part.Wire( - Part.makeCircle( - fp.OD / 2, fp.Ports[1], R.tangentAt(R.LastParameter) - ) - ) + Part.Wire(Part.makeCircle(fp.OD / 2, fp.Ports[1], R.tangentAt(R.LastParameter))) ) try: sol = Part.Solid(Part.Shell([b.Faces[0], p1.Faces[0], p2.Faces[0]])) @@ -314,7 +317,8 @@ def execute(self, fp): fp.Shape = sol super(Elbow, self).execute(fp) # perform common operations except Part.OCCError as occer: - FreeCAD.Console.PrintWarning(str(occer) + "\n") + FreeCAD.Console.PrintWarning(str(occer) + "\n") + class Flange(pypeType): """Class for object PType="Flange" @@ -449,14 +453,10 @@ def execute(self, fp): ) ) ) - hole.rotate( - FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n / 2 - ) + hole.rotate(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n / 2) for i in list(range(fp.n)): base = base.cut(hole) - hole.rotate( - FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n - ) + hole.rotate(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n) flange = base.extrude(FreeCAD.Vector(0, 0, fp.t)) try: # Flange2: raised-face and welding-neck if fp.trf > 0 and fp.drf > 0: @@ -465,9 +465,9 @@ def execute(self, fp): ) flange = flange.fuse(rf) if fp.dwn > 0 and fp.twn > 0 and fp.ODp > 0: - wn = Part.makeCone( - fp.dwn / 2, fp.ODp / 2, fp.twn, vZ * float(fp.t) - ).cut(Part.makeCylinder(fp.d / 2, fp.twn, vZ * float(fp.t))) + wn = Part.makeCone(fp.dwn / 2, fp.ODp / 2, fp.twn, vZ * float(fp.t)).cut( + Part.makeCylinder(fp.d / 2, fp.twn, vZ * float(fp.t)) + ) flange = flange.fuse(wn) except: pass @@ -475,6 +475,7 @@ def execute(self, fp): fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.t))] super(Flange, self).execute(fp) # perform common operations + class Reduct(pypeType): """Class for object PType="Reduct" Reduct(obj,[PSize="DN50",OD=60.3, OD2= 48.3, thk=3, thk2=None, H=None, conc=True]) @@ -490,9 +491,7 @@ class Reduct(pypeType): If H is None or 0, the length of the reduction is calculated as 3x(OD-OD2). """ - def __init__( - self, obj, DN="DN50", OD=60.3, OD2=48.3, thk=3, thk2=None, H=None, conc=True - ): + def __init__(self, obj, DN="DN50", OD=60.3, OD2=48.3, thk=3, thk2=None, H=None, conc=True): # initialize the parent class super(Reduct, self).__init__(obj) # define common properties @@ -551,7 +550,9 @@ def __init__( "Profile", "Reduct", QT_TRANSLATE_NOOP("App::Property", "Section dim."), - ).Profile = str(obj.OD) + "x" + str(obj.OD2) + ).Profile = ( + str(obj.OD) + "x" + str(obj.OD2) + ) obj.addProperty( "App::PropertyBool", "conc", @@ -571,20 +572,14 @@ def execute(self, fp): sol = Part.makeCone(fp.OD / 2, fp.OD2 / 2, fp.Height) if fp.thk < fp.OD / 2 and fp.thk2 < fp.OD2 / 2: fp.Shape = sol.cut( - Part.makeCone( - fp.OD / 2 - fp.thk, fp.OD2 / 2 - fp.thk2, fp.Height - ) + Part.makeCone(fp.OD / 2 - fp.thk, fp.OD2 / 2 - fp.thk2, fp.Height) ) else: fp.Shape = sol fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.Height))] else: - C = Part.makeCircle( - fp.OD / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1) - ) - c = Part.makeCircle( - fp.OD2 / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1) - ) + C = Part.makeCircle(fp.OD / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1)) + c = Part.makeCircle(fp.OD2 / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1)) c.translate(FreeCAD.Vector((fp.OD - fp.OD2) / 2, 0, fp.Height)) sol = Part.makeLoft([c, C], True) if fp.thk < fp.OD / 2 and fp.thk2 < fp.OD2 / 2: @@ -608,6 +603,7 @@ def execute(self, fp): ] super(Reduct, self).execute(fp) # perform common operations + class Cap(pypeType): """Class for object PType="Cap" Cap(obj,[PSize="DN50",OD=60.3,thk=3]) @@ -641,13 +637,17 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3): "ID", "Cap", QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), - ).ID = obj.OD - 2 * obj.thk + ).ID = ( + obj.OD - 2 * obj.thk + ) obj.addProperty( "App::PropertyString", "Profile", "Cap", QT_TRANSLATE_NOOP("App::Property", "Section dim."), - ).Profile = str(obj.OD) + "x" + str(obj.thk) + ).Profile = ( + str(obj.OD) + "x" + str(obj.thk) + ) def onChanged(self, fp, prop): return None @@ -669,17 +669,14 @@ def execute(self, fp): common = sfera.common(cilindro) fil = common.makeFillet(D / 6.5, common.Edges) cut = fil.cut( - Part.makeCylinder( - D * 1.1, D * 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, -1) - ) - ) - cap = cut.makeThickness( - [f for f in cut.Faces if type(f.Surface) == Part.Plane], -s, 1.0e-3 + Part.makeCylinder(D * 1.1, D * 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, -1)) ) + cap = cut.makeThickness([f for f in cut.Faces if type(f.Surface) == Part.Plane], -s, 1.0e-3) fp.Shape = cap fp.Ports = [FreeCAD.Vector()] super(Cap, self).execute(fp) # perform common operations + class PypeLine2(pypeType): """Class for object PType="PypeLine2" This object represent a collection of objects "PType" that are updated with the @@ -700,9 +697,7 @@ class PypeLine2(pypeType): with possibility to group them automatically and extract the part-list. """ - def __init__( - self, obj, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None, lab=None - ): + def __init__(self, obj, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None, lab=None): # initialize the parent class super(PypeLine2, self).__init__(obj) # define common properties @@ -737,10 +732,10 @@ def __init__( "Group", "PypeLine2", QT_TRANSLATE_NOOP("App::Property", "The group."), - ).Group = obj.Label + "_pieces" - group = FreeCAD.activeDocument().addObject( - "App::DocumentObjectGroup", obj.Group + ).Group = ( + obj.Label + "_pieces" ) + group = FreeCAD.activeDocument().addObject("App::DocumentObjectGroup", obj.Group) group.addObject(obj) FreeCAD.Console.PrintWarning("Created group " + obj.Group + "\n") obj.addProperty("App::PropertyLink", "Base", "PypeLine2", "the edges") @@ -750,9 +745,7 @@ def onChanged(self, fp, prop): fp.InList[0].Label = fp.Label + "_pieces" fp.Group = fp.Label + "_pieces" if hasattr(fp, "Base") and prop == "Base" and fp.Base: - FreeCAD.Console.PrintWarning( - fp.Label + " Base has changed to " + fp.Base.Label + "\n" - ) + FreeCAD.Console.PrintWarning(fp.Label + " Base has changed to " + fp.Base.Label + "\n") if prop == "OD": fp.BendRadius = 0.75 * fp.OD @@ -782,9 +775,7 @@ def update(self, fp, edges=None): pCmd.moveToPyLi(p, fp.Label) pipes.append(p) n = len(pipes) - 1 - if n and not fCmd.isParallel( - fCmd.beamAx(pipes[n]), fCmd.beamAx(pipes[n - 1]) - ): + if n and not fCmd.isParallel(fCmd.beamAx(pipes[n]), fCmd.beamAx(pipes[n - 1])): # ---Create the curve--- propList = [fp.PSize, fp.OD, fp.thk, 90, fp.BendRadius] c = pCmd.makeElbowBetweenThings(edges[n], edges[n - 1], propList) @@ -799,19 +790,16 @@ def update(self, fp, edges=None): def execute(self, fp): return None + class ViewProviderPypeLine: - def __getstate__(self): - return None - def __setstate__(self, data): - return None - def __init__(self,vobj): - vobj.Proxy = self - def getIcon(self): - from os.path import join, dirname, abspath - return join(dirname(abspath(__file__)),"iconz","pypeline.svg") - def attach(self, vobj): - self.ViewObject = vobj - self.Object = vobj.Object + def __getstate__(self): + return None + + def __setstate__(self, data): + return None + + def __init__(self, vobj): + vobj.Proxy = self def getIcon(self): from os.path import join, dirname, abspath @@ -822,6 +810,16 @@ def attach(self, vobj): self.ViewObject = vobj self.Object = vobj.Object + def getIcon(self): + from os.path import join, dirname, abspath + + return join(dirname(abspath(__file__)), "iconz", "pypeline.svg") + + def attach(self, vobj): + self.ViewObject = vobj + self.Object = vobj.Object + + class Ubolt: """Class for object PType="Clamp" UBolt(obj,[PSize="DN50",ClampType="U-bolt", C=76, H=109, d=10]) @@ -889,9 +887,7 @@ def onChanged(self, fp, prop): def execute(self, fp): fp.thread = "M" + str(float(fp.d)) - c = Part.makeCircle( - fp.C / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 0, 180 - ) + c = Part.makeCircle(fp.C / 2, FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 0, 180) l1 = Part.makeLine((fp.C / 2, 0, 0), (fp.C / 2, fp.C / 2 - fp.H, 0)) l2 = Part.makeLine((-fp.C / 2, 0, 0), (-fp.C / 2, fp.C / 2 - fp.H, 0)) p = Part.Face( @@ -905,6 +901,7 @@ def execute(self, fp): fp.Shape = path.makePipe(p) fp.Ports = [FreeCAD.Vector(0, 0, 1)] + class Shell: """ Class for a lateral-shell-of-tank object @@ -961,9 +958,7 @@ def execute(self, fp): base = [vectL, vectW, vectH] outline = [] for i in range(3): - f1 = Part.Face( - Part.makePolygon([O, base[0], base[0] + base[1], base[1], O]) - ) + f1 = Part.Face(Part.makePolygon([O, base[0], base[0] + base[1], base[1], O])) outline.append(f1) f2 = f1.copy() f2.translate(base[2]) @@ -979,6 +974,7 @@ def execute(self, fp): ) fp.Shape = Part.makeCompound([tank, top]) + class ViewProviderPypeBranch: def __init__(self, vobj): vobj.Proxy = self @@ -1025,6 +1021,7 @@ def claimChildren(self): def onDelete(self, feature, subelements): # subelements is a tuple of strings return True + class Valve(pypeType): """Class for object PType="Valve" Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100]) @@ -1064,9 +1061,7 @@ def __init__(self, obj, DN="DN50", VType="ball", OD=72, ID=50, H=40, Kv=150): def execute(self, fp): c = Part.makeCone(fp.OD / 2, fp.OD / 5, fp.Height / 2) - v = c.fuse( - c.mirror(FreeCAD.Vector(0, 0, fp.Height / 2), FreeCAD.Vector(0, 0, 1)) - ) + v = c.fuse(c.mirror(FreeCAD.Vector(0, 0, fp.Height / 2), FreeCAD.Vector(0, 0, 1))) if fp.PRating.find("ball") + 1 or fp.PRating.find("globe") + 1: r = min(fp.Height * 0.45, fp.OD / 2) v = v.fuse(Part.makeSphere(r, FreeCAD.Vector(0, 0, fp.Height / 2))) @@ -1074,6 +1069,7 @@ def execute(self, fp): fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.Height))] super(Valve, self).execute(fp) # perform common operations + class PypeBranch2(pypeType): # use AttachExtensionPython """Class for object PType="PypeBranch2" Single-line pipe branch linked to its center-line using AttachExtensionPython @@ -1082,9 +1078,7 @@ class PypeBranch2(pypeType): # use AttachExtensionPython type(base)=DWire or SketchObject """ - def __init__( - self, obj, base, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None - ): + def __init__(self, obj, base, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None): # initialize the parent class super(PypeBranch2, self).__init__(obj) # define common properties @@ -1154,18 +1148,14 @@ def onChanged(self, fp, prop): curve.BendRadius = BR if prop == "OD" and hasattr(fp, "Tubes") and hasattr(fp, "Curves"): OD = fp.OD - for obj in [ - FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves - ]: + for obj in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves]: if obj.PType == "Elbow": obj.BendRadius = OD * 0.75 obj.OD = OD fp.BendRadius = OD * 0.75 if prop == "thk" and hasattr(fp, "Tubes") and hasattr(fp, "Curves"): thk = fp.thk - for obj in [ - FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves - ]: + for obj in [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves]: if hasattr(obj, "thk"): obj.thk = thk @@ -1188,17 +1178,11 @@ def redraw(self, fp): offset = 0 # ---Create the tube--- if i > 0: - alfa = ( - e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i - 1].tangentAt(0)) - / 2 - ) + alfa = e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i - 1].tangentAt(0)) / 2 L -= R * tan(alfa) offset = R * tan(alfa) if i < (len(fp.Base.Shape.Edges) - 1): - alfa = ( - e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i + 1].tangentAt(0)) - / 2 - ) + alfa = e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i + 1].tangentAt(0)) / 2 L -= R * tan(alfa) eSupport = "Edge" + str(i + 1) t = pCmd.makePipe([fp.PSize, float(fp.OD), float(fp.thk), L]) @@ -1233,16 +1217,12 @@ def redraw(self, fp): def purge(self, fp): if hasattr(fp, "Tubes"): - fp.removeObjects( - [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes] - ) + fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes]) for name in fp.Tubes: FreeCAD.ActiveDocument.removeObject(name) fp.Tubes = [] if hasattr(fp, "Curves"): - fp.removeObjects( - [FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves] - ) + fp.removeObjects([FreeCAD.ActiveDocument.getObject(name) for name in fp.Curves]) for name in fp.Curves: FreeCAD.ActiveDocument.removeObject(name) fp.Curves = [] diff --git a/pForms.py b/pForms.py index 856d58b..0039e30 100644 --- a/pForms.py +++ b/pForms.py @@ -75,9 +75,7 @@ def redraw(self): pl.Proxy.update(pl) i += 1 else: - FreeCAD.Console.PrintError( - "%s has no Base: nothing to redraw\n" % cb.text() - ) + FreeCAD.Console.PrintError("%s has no Base: nothing to redraw\n" % cb.text()) FreeCAD.ActiveDocument.recompute() FreeCAD.Console.PrintMessage("Redrawn %i pipelines.\n" % i) FreeCAD.activeDocument().commitTransaction() @@ -90,6 +88,7 @@ def clearAll(self): for cb in self.checkBoxes: cb.setChecked(False) + class insertPipeForm(dodoDialogs.protoPypeForm): """ Dialog to insert tubes. @@ -164,8 +163,7 @@ def insert(self): # insert the pipe if hasattr(o, "PSize") and hasattr(o, "OD") and hasattr(o, "thk"): if ( o.PType == "Reduct" - and o.Proxy.nearestPort(objex.SubObjects[0].CenterOfMass)[0] - == 1 + and o.Proxy.nearestPort(objex.SubObjects[0].CenterOfMass)[0] == 1 ): # props of a reduction propList = [o.PSize, o.OD2, o.thk2, self.H] break @@ -220,6 +218,7 @@ def changeL(self): self.lastPipe.Height = newL FreeCAD.ActiveDocument.recompute() + class insertElbowForm(dodoDialogs.protoPypeForm): """ Dialog to insert one elbow. @@ -346,9 +345,7 @@ def trim(self): FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() else: - FreeCAD.Console.PrintError( - translate("insertElbowForm", "Wrong selection\n") - ) + FreeCAD.Console.PrintError(translate("insertElbowForm", "Wrong selection\n")) def rotatePort(self): if self.lastElbow: @@ -382,6 +379,7 @@ def reverse(self): self.lastElbow.Placement.Rotation.multVec(self.lastElbow.Ports[0]) * -2 ) + class insertFlangeForm(dodoDialogs.protoPypeForm): """ Dialog to insert flanges. @@ -433,9 +431,7 @@ def reverse(self): def insert(self): tubes = [t for t in fCmd.beams() if hasattr(t, "PSize")] - if len(tubes) > 0 and tubes[0].PSize in [ - prop["PSize"] for prop in self.pipeDictList - ]: + if len(tubes) > 0 and tubes[0].PSize in [prop["PSize"] for prop in self.pipeDictList]: for prop in self.pipeDictList: if prop["PSize"] == tubes[0].PSize: d = prop @@ -480,6 +476,7 @@ def apply(self): obj.PRating = self.PRating FreeCAD.activeDocument().recompute() + class insertReductForm(dodoDialogs.protoPypeForm): """ Dialog to insert concentric reductions. @@ -566,9 +563,7 @@ def applyProp(self): def fillOD2(self): self.OD2list.clear() - self.OD2list.addItems( - self.pipeDictList[self.sizeList.currentRow()]["OD2"].split(">") - ) + self.OD2list.addItems(self.pipeDictList[self.sizeList.currentRow()]["OD2"].split(">")) self.OD2list.setCurrentRow(0) def reverse(self): @@ -587,11 +582,7 @@ def insert(self): r = self.pipeDictList[self.sizeList.currentRow()] pos = Z = H = None selex = FreeCADGui.Selection.getSelectionEx() - pipes = [ - p.Object - for p in selex - if hasattr(p.Object, "PType") and p.Object.PType == "Pipe" - ] + pipes = [p.Object for p in selex if hasattr(p.Object, "PType") and p.Object.PType == "Pipe"] if len(pipes) > 1 and fCmd.isParallel( fCmd.beamAx(pipes[0]), fCmd.beamAx(pipes[1]) ): # if at least 2 pipes are selected... @@ -639,9 +630,7 @@ def insert(self): else: pos = edge.valueAt(0) Z = edge.tangentAt(0) - elif ( - selex and selex[0].SubObjects[0].ShapeType == "Vertex" - ): # ...or 1 vertex.. + elif selex and selex[0].SubObjects[0].ShapeType == "Vertex": # ...or 1 vertex.. pos = selex[0].SubObjects[0].Point if not H: # calculate length if it's not defined H = float(3 * (OD1 - OD2)) @@ -662,6 +651,7 @@ def changeRating2(self, item): self.sizeList.setCurrentRow(0) self.fillOD2() + class insertUboltForm(dodoDialogs.protoPypeForm): """ Dialog to insert U-bolts. @@ -737,11 +727,7 @@ def insert(self): FreeCAD.activeDocument().openTransaction("Insert clamp on tube") for objex in selex: if hasattr(objex.Object, "PType") and objex.Object.PType == "Pipe": - d = [ - typ - for typ in self.pipeDictList - if typ["PSize"] == objex.Object.PSize - ] + d = [typ for typ in self.pipeDictList if typ["PSize"] == objex.Object.PSize] if len(d) > 0: d = d[0] else: @@ -782,6 +768,7 @@ def insert(self): FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() + class insertCapForm(dodoDialogs.protoPypeForm): """ Dialog to insert caps. @@ -845,6 +832,7 @@ def apply(self): obj.PRating = self.PRating FreeCAD.activeDocument().recompute() + class insertPypeLineForm(dodoDialogs.protoPypeForm): """ Dialog to insert pypelines. @@ -894,7 +882,7 @@ def __init__(self): self.show() def summary(self, pl=None): - if self.combo.currentText() != translate("insertPypeLineForm",""): + if self.combo.currentText() != translate("insertPypeLineForm", ""): pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] FreeCAD.Console.PrintMessage( "\n%s: %s - %s\nProfile: %.1fx%.1f\nRGB color: %.3f, %.3f, %.3f\n" @@ -916,7 +904,7 @@ def summary(self, pl=None): def apply(self): d = self.pipeDictList[self.sizeList.currentRow()] - if self.combo.currentText() != translate("insertPypeLineForm",""): + if self.combo.currentText() != translate("insertPypeLineForm", ""): pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] pl.PSize = d["PSize"] pl.PRating = self.PRating @@ -929,7 +917,7 @@ def apply(self): def insert(self): d = self.pipeDictList[self.sizeList.currentRow()] FreeCAD.activeDocument().openTransaction("Insert pype-line") - if self.combo.currentText() == translate("insertPypeLineForm",""): + if self.combo.currentText() == translate("insertPypeLineForm", ""): plLabel = self.edit1.text() if not plLabel: plLabel = "Tubatura" @@ -944,11 +932,7 @@ def insert(self): self.combo.addItem(a.Label) else: plname = self.combo.currentText() - plcolor = ( - FreeCAD.activeDocument() - .getObjectsByLabel(plname)[0] - .ViewObject.ShapeColor - ) + plcolor = FreeCAD.activeDocument().getObjectsByLabel(plname)[0].ViewObject.ShapeColor pCmd.makePypeLine2( DN=d["PSize"], PRating=self.PRating, @@ -962,17 +946,13 @@ def insert(self): FreeCAD.ActiveDocument.recompute() def getBase(self): - if self.combo.currentText() != translate("insertPypeLineForm",""): + if self.combo.currentText() != translate("insertPypeLineForm", ""): pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] sel = FreeCADGui.Selection.getSelection() if sel: base = sel[0] - isWire = ( - hasattr(base, "Shape") and base.Shape.Edges - ) # type(base.Shape)==Part.Wire - isSketch = ( - hasattr(base, "TypeId") and base.TypeId == "Sketcher::SketchObject" - ) + isWire = hasattr(base, "Shape") and base.Shape.Edges # type(base.Shape)==Part.Wire + isSketch = hasattr(base, "TypeId") and base.TypeId == "Sketcher::SketchObject" if isWire or isSketch: FreeCAD.activeDocument().openTransaction("Assign Base") pl.Base = base @@ -981,9 +961,7 @@ def getBase(self): pCmd.moveToPyLi(pl.Base, self.combo.currentText()) FreeCAD.activeDocument().commitTransaction() else: - FreeCAD.Console.PrintError( - "Not valid Base: select a Wire or a Sketch.\n" - ) + FreeCAD.Console.PrintError("Not valid Base: select a Wire or a Sketch.\n") else: pl.Base = None FreeCAD.Console.PrintWarning(pl.Label + "-> deleted Base\n") @@ -998,10 +976,8 @@ def changeColor(self): col = QColorDialog.getColor() if col.isValid(): self.color = tuple([c / 255.0 for c in col.toTuple()[:3]]) - if self.combo.currentText() != translate("insertPypeLineForm",""): - pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[ - 0 - ] + if self.combo.currentText() != translate("insertPypeLineForm", ""): + pl = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] pl.ViewObject.ShapeColor = self.color pCmd.updatePLColor([pl]) self.show() @@ -1012,7 +988,7 @@ def partList(self): f = None f = qfd.getSaveFileName()[0] if f: - if self.combo.currentText() != translate("insertPypeLineForm",""): + if self.combo.currentText() != translate("insertPypeLineForm", ""): group = FreeCAD.activeDocument().getObjectsByLabel( FreeCAD.__activePypeLine__ + "_pieces" )[0] @@ -1052,6 +1028,7 @@ def partList(self): plist.close() FreeCAD.Console.PrintMessage("Data saved in %s.\n" % f) + class insertBranchForm(dodoDialogs.protoPypeForm): """ Dialog to insert branches. @@ -1143,6 +1120,7 @@ def insert(self): FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute() + class breakForm(QDialog): """ Dialog to break one pipe and create a gap. @@ -1226,7 +1204,10 @@ def __init__( self.show() def setCurrentPL(self, PLName=None): - if self.combo.currentText() not in [translate("breakForm",""), translate("breakForm","")]: + if self.combo.currentText() not in [ + translate("breakForm", ""), + translate("breakForm", ""), + ]: FreeCAD.__activePypeLine__ = self.combo.currentText() else: FreeCAD.__activePypeLine__ = None @@ -1273,16 +1254,13 @@ def updateSlider(self): if self.edit1.text() and self.edit1.text()[-1] == "%": self.slider.setValue(int(float(self.edit1.text().rstrip("%").strip()))) elif self.edit1.text() and float(self.edit1.text().strip()) < self.refL: - self.slider.setValue( - int(float(self.edit1.text().strip()) / self.refL * 100) - ) + self.slider.setValue(int(float(self.edit1.text().strip()) / self.refL * 100)) def calcGapPercent(self): if self.edit2.text() and self.edit2.text()[-1] == "%": if self.refL: self.edit2.setText( - "%.2f" - % (float(self.edit2.text().rstrip("%").strip()) / 100 * self.refL) + "%.2f" % (float(self.edit2.text().rstrip("%").strip()) / 100 * self.refL) ) else: self.edit2.setText("0") @@ -1295,9 +1273,7 @@ def breakPipe(self): pipes = [p for p in fCmd.beams() if pCmd.isPipe(p)] for p in pipes: p2nd = pCmd.breakTheTubes( - float(p.Height) - * float(self.edit1.text().rstrip("%").strip()) - / 100, + float(p.Height) * float(self.edit1.text().rstrip("%").strip()) / 100, pipes=[p], gap=float(self.edit2.text()), ) @@ -1305,17 +1281,17 @@ def breakPipe(self): for p in p2nd: pCmd.moveToPyLi(p, self.combo.currentText()) else: - p2nd = pCmd.breakTheTubes( - float(self.edit1.text()), gap=float(self.edit2.text()) - ) + p2nd = pCmd.breakTheTubes(float(self.edit1.text()), gap=float(self.edit2.text())) if p2nd and self.combo.currentText() != "": for p in p2nd: pCmd.moveToPyLi(p, self.combo.currentText()) FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() + import pObservers as po + class joinForm(dodoDialogs.protoTypeDialog): def __init__(self): super(joinForm, self).__init__("joinPypes.ui") @@ -1344,6 +1320,7 @@ def reset(self): po.pCmd.arrows1 = [] po.pCmd.arrows2 = [] + class insertValveForm(dodoDialogs.protoPypeForm): """ Dialog to insert Valves. @@ -1422,9 +1399,7 @@ def insert(self): ] if pipes: pos = self.sli.value() - self.lastValve = pCmd.doValves( - propList, FreeCAD.__activePypeLine__, pos - )[-1] + self.lastValve = pCmd.doValves(propList, FreeCAD.__activePypeLine__, pos)[-1] else: self.lastValve = pCmd.doValves(propList, FreeCAD.__activePypeLine__)[-1] @@ -1440,9 +1415,11 @@ def apply(self): obj.Kv = float(d["Kv"]) FreeCAD.activeDocument().recompute() + import DraftTools, Draft, uForms, uCmd from PySide.QtGui import * + class point2pointPipe(DraftTools.Line): """ Draw pipes by sequence point. @@ -1465,15 +1442,9 @@ def __init__(self, wireFlag=True): self.hackedUI = FreeCADGui.PySideUic.loadUi(dialogPath) self.hackedUI.btnRot.clicked.connect(self.rotateWP) self.hackedUI.btnOff.clicked.connect(self.offsetWP) - self.hackedUI.btnXY.clicked.connect( - lambda: self.alignWP(FreeCAD.Vector(0, 0, 1)) - ) - self.hackedUI.btnXZ.clicked.connect( - lambda: self.alignWP(FreeCAD.Vector(0, 1, 0)) - ) - self.hackedUI.btnYZ.clicked.connect( - lambda: self.alignWP(FreeCAD.Vector(1, 0, 0)) - ) + self.hackedUI.btnXY.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(0, 0, 1))) + self.hackedUI.btnXZ.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(0, 1, 0))) + self.hackedUI.btnYZ.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(1, 0, 0))) self.ui.layout.addWidget(self.hackedUI) self.start = None self.lastPipe = None @@ -1485,13 +1456,9 @@ def alignWP(self, norm): def offsetWP(self): if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): - s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt( - "gridSize" - ) + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") sc = [float(x * s) for x in [1, 1, 0.2]] - varrow = uCmd.arrow( - FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s - ) + varrow = uCmd.arrow(FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s) offset = QInputDialog.getInt( None, translate("pForms", "Offset Work Plane"), @@ -1499,9 +1466,7 @@ def offsetWP(self): ) if offset[1]: uCmd.offsetWP(offset[0]) - FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild( - varrow.node - ) + FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(varrow.node) def rotateWP(self): self.form = uForms.rotWPForm() @@ -1548,9 +1513,7 @@ def action(self, arg): # re-defintition of the method of parent prev = self.lastPipe else: prev = None - d = self.pform.pipeDictList[ - self.pform.sizeList.currentRow() - ] + d = self.pform.pipeDictList[self.pform.sizeList.currentRow()] v = self.point - self.start propList = [ d["PSize"], @@ -1560,9 +1523,7 @@ def action(self, arg): # re-defintition of the method of parent ] self.lastPipe = pCmd.makePipe(propList, self.start, v) if self.pform.combo.currentText() != "": - pCmd.moveToPyLi( - self.lastPipe, self.pform.combo.currentText() - ) + pCmd.moveToPyLi(self.lastPipe, self.pform.combo.currentText()) self.start = self.point FreeCAD.ActiveDocument.recompute() if prev: @@ -1583,9 +1544,7 @@ def action(self, arg): # re-defintition of the method of parent if self.pform.cb1.isChecked(): rot = FreeCAD.DraftWorkingPlane.getPlacement().Rotation normal = rot.multVec(FreeCAD.Vector(0, 0, 1)) - FreeCAD.DraftWorkingPlane.alignToPointAndAxis( - self.point, normal - ) + FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.point, normal) FreeCADGui.Snapper.setGrid() if not self.isWire and len(self.node) == 2: self.finish(False, cont=True) @@ -1595,6 +1554,7 @@ def action(self, arg): # re-defintition of the method of parent self.finish(True, cont=True) FreeCAD.activeDocument().commitTransaction() + class insertTankForm(dodoDialogs.protoTypeDialog): def __init__(self): self.nozzles = list() @@ -1656,10 +1616,7 @@ def combine(self): f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") reader = csv.DictReader(f, delimiter=";") pipes = dict( - [ - [line["PSize"], [float(line["OD"]), float(line["thk"])]] - for line in reader - ] + [[line["PSize"], [float(line["OD"]), float(line["thk"])]] for line in reader] ) f.close() fileName = "Flange_" + self.form.comboFlange.currentText() + ".csv" @@ -1688,9 +1645,7 @@ def combine(self): print(translate("insertTankForm", "files not read")) return listNozzles = [ - [p[0], p[1] + flanges[p[0]]] - for p in pipes.items() - if p[0] in flanges.keys() + [p[0], p[1] + flanges[p[0]]] for p in pipes.items() if p[0] in flanges.keys() ] print(translate("insertTankForm", "listNozzles: %s") % str(listNozzles)) self.nozzles = dict(listNozzles) @@ -1742,9 +1697,7 @@ def accept(self, ang=None): if e.curvatureAt(0): pCmd.makeRoute(self.normal) else: - s = FreeCAD.ActiveDocument.addObject( - "Sketcher::SketchObject", "pipeRoute" - ) + s = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject", "pipeRoute") s.MapMode = "NormalToEdge" s.Support = [(self.obj, self.edge)] s.AttachmentOffset = FreeCAD.Placement( @@ -1761,9 +1714,7 @@ def selectAction(self): self.normal = fCmd.edges()[0].tangentAt(0) else: self.normal = FreeCAD.Vector(0, 0, 1) - self.form.lab1.setText( - "%.1f,%.1f,%.1f " % (self.normal.x, self.normal.y, self.normal.z) - ) + self.form.lab1.setText("%.1f,%.1f,%.1f " % (self.normal.x, self.normal.y, self.normal.z)) def mouseActionB1(self, CtrlAltShift=[False, False, False]): v = FreeCADGui.ActiveDocument.ActiveView diff --git a/pObservers.py b/pObservers.py index 90b1a72..c44f2f7 100644 --- a/pObservers.py +++ b/pObservers.py @@ -1,99 +1,115 @@ -#(c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD -__title__="frameTools toolbar" -__author__="oddtopus" -__url__="github.com/oddtopus/dodo" -__license__="LGPL 3" +__title__ = "frameTools toolbar" +__author__ = "oddtopus" +__url__ = "github.com/oddtopus/dodo" +__license__ = "LGPL 3" # import FreeCAD modules import FreeCAD, FreeCADGui, pCmd from fObservers import frameObserverPrototype from uCmd import arrow -pCmd.o1=None -pCmd.port1=None -pCmd.o2=None -pCmd.port2=None -pCmd.arrows1=list() -pCmd.arrows2=list() +pCmd.o1 = None +pCmd.port1 = None +pCmd.o2 = None +pCmd.port2 = None +pCmd.arrows1 = list() +pCmd.arrows2 = list() + class arrow_insert(arrow): - def __init__(self, name, pype, portNr, scale=100): - self.stop=False - self.pype=pype - self.portDir=pCmd.portsDir(pype)[portNr] - self.portPos=pCmd.portsPos(pype)[portNr] - rot=FreeCAD.Rotation(FreeCAD.Vector(0,0,1),self.portDir.negative()) - placement=FreeCAD.Placement(self.portPos,rot) - super(arrow_insert,self).__init__(pl=placement, scale=[-scale,scale,scale/5], offset=-scale, name=name) - def pickAction(self,path=None,event=None,arg=None): # sample - if path: - for n in path: - if str(n.getName())==self.name: - if self.name[:4]=='obj1': - pCmd.port1=int(self.name[-1]) - FreeCAD.Console.PrintMessage('Destination port changed to %i\n' %pCmd.port1) - if FreeCADGui.Control.activeDialog(): - pass # to understand how to refer to the dialog to update labels - elif self.name[:4]=='obj2': - pCmd.port2=int(self.name[-1]) - FreeCAD.Console.PrintMessage('%s %s joined at port %i to %s\n' %(pCmd.o2.PType, pCmd.o2.Label, pCmd.port2,pCmd.o1.Label)) - # move o2 - if type(pCmd.port1)==int and type(pCmd.port2)==int: - FreeCAD.activeDocument().openTransaction('Join') - pCmd.join(pCmd.o1,pCmd.port1,pCmd.o2,pCmd.port2) - FreeCAD.activeDocument().commitTransaction() - else: - FreeCAD.Console.PrintError('Port(s) not selected yet\n') - self.stop=True - if self.stop: - for a in pCmd.arrows2: - a.closeArrow() - pCmd.arrows2=[] - pCmd.o2=None - pCmd.port2=None - self.stop=False + def __init__(self, name, pype, portNr, scale=100): + self.stop = False + self.pype = pype + self.portDir = pCmd.portsDir(pype)[portNr] + self.portPos = pCmd.portsPos(pype)[portNr] + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), self.portDir.negative()) + placement = FreeCAD.Placement(self.portPos, rot) + super(arrow_insert, self).__init__( + pl=placement, scale=[-scale, scale, scale / 5], offset=-scale, name=name + ) + + def pickAction(self, path=None, event=None, arg=None): # sample + if path: + for n in path: + if str(n.getName()) == self.name: + if self.name[:4] == "obj1": + pCmd.port1 = int(self.name[-1]) + FreeCAD.Console.PrintMessage( + "Destination port changed to %i\n" % pCmd.port1 + ) + if FreeCADGui.Control.activeDialog(): + pass # to understand how to refer to the dialog to update labels + elif self.name[:4] == "obj2": + pCmd.port2 = int(self.name[-1]) + FreeCAD.Console.PrintMessage( + "%s %s joined at port %i to %s\n" + % (pCmd.o2.PType, pCmd.o2.Label, pCmd.port2, pCmd.o1.Label) + ) + # move o2 + if type(pCmd.port1) == int and type(pCmd.port2) == int: + FreeCAD.activeDocument().openTransaction("Join") + pCmd.join(pCmd.o1, pCmd.port1, pCmd.o2, pCmd.port2) + FreeCAD.activeDocument().commitTransaction() + else: + FreeCAD.Console.PrintError("Port(s) not selected yet\n") + self.stop = True + if self.stop: + for a in pCmd.arrows2: + a.closeArrow() + pCmd.arrows2 = [] + pCmd.o2 = None + pCmd.port2 = None + self.stop = False + + +class joinObserver(frameObserverPrototype): + """ + Mate together the Ports of different Pypes by clicking on + arrows in the scene-graph. + """ + + def __init__(self): + super(joinObserver, self).__init__("Select pypes and ports") + self.o1 = pCmd.o1 = None + pCmd.port1 = None + self.o2 = pCmd.o2 = None + pCmd.port2 = None + pCmd.arrows1 = list() + pCmd.arrows2 = list() + # self.o1=pCmd.o1 + # self.o2=pCmd.o2 + FreeCADGui.Selection.clearSelection() + + def goOut(self, info): + down = info["State"] == "DOWN" + k = info["Key"] + if k == "ESCAPE": + FreeCAD.Console.PrintMessage("I'm escaping.\n") + for arrow in pCmd.arrows1 + pCmd.arrows2: + arrow.closeArrow() + self.av.removeEventCallback("SoKeyboardEvent", self.stop) + FreeCADGui.Selection.removeObserver(self) -class joinObserver(frameObserverPrototype): - ''' - Mate together the Ports of different Pypes by clicking on - arrows in the scene-graph. - ''' - def __init__(self): - super(joinObserver,self).__init__('Select pypes and ports') - self.o1=pCmd.o1=None - pCmd.port1=None - self.o2=pCmd.o2=None - pCmd.port2=None - pCmd.arrows1=list() - pCmd.arrows2=list() - #self.o1=pCmd.o1 - #self.o2=pCmd.o2 - FreeCADGui.Selection.clearSelection() - def goOut(self,info): - down = (info["State"] == "DOWN") - k=info['Key'] - if k=="ESCAPE": - FreeCAD.Console.PrintMessage("I'm escaping.\n") - for arrow in pCmd.arrows1+pCmd.arrows2: - arrow.closeArrow() - self.av.removeEventCallback("SoKeyboardEvent",self.stop) - FreeCADGui.Selection.removeObserver(self) - def addSelection(self,doc,obj,sub,pnt): - sel=FreeCADGui.Selection.getSelection()[0] - scale=min(sel.Shape.BoundBox.XLength,sel.Shape.BoundBox.YLength,sel.Shape.BoundBox.ZLength)*1.1 - FreeCADGui.Selection.clearSelection() - if hasattr(sel,'PType') and not pCmd.o1: - pCmd.o1=self.o1=sel - for i in range(len(sel.Ports)): - name='obj1_port'+str(i) - pCmd.arrows1.append(arrow_insert(name,sel,i,scale)) - else: #if hasattr(sel,'PType') and not pCmd.o2: - for a in pCmd.arrows2: - a.closeArrow() - pCmd.o2=self.o2=sel - for i in range(len(sel.Ports)): - name='obj2_port'+str(i) - a=arrow_insert(name,sel,i,scale) - a.color.rgb=0,0,.8 - pCmd.arrows2.append(a) + def addSelection(self, doc, obj, sub, pnt): + sel = FreeCADGui.Selection.getSelection()[0] + scale = ( + min(sel.Shape.BoundBox.XLength, sel.Shape.BoundBox.YLength, sel.Shape.BoundBox.ZLength) + * 1.1 + ) + FreeCADGui.Selection.clearSelection() + if hasattr(sel, "PType") and not pCmd.o1: + pCmd.o1 = self.o1 = sel + for i in range(len(sel.Ports)): + name = "obj1_port" + str(i) + pCmd.arrows1.append(arrow_insert(name, sel, i, scale)) + else: # if hasattr(sel,'PType') and not pCmd.o2: + for a in pCmd.arrows2: + a.closeArrow() + pCmd.o2 = self.o2 = sel + for i in range(len(sel.Ports)): + name = "obj2_port" + str(i) + a = arrow_insert(name, sel, i, scale) + a.color.rgb = 0, 0, 0.8 + pCmd.arrows2.append(a) diff --git a/uCmd.py b/uCmd.py index 965d50b..20700b4 100644 --- a/uCmd.py +++ b/uCmd.py @@ -36,9 +36,7 @@ def setWP(): # TARGET [working]: deal with App::Parts elif curves: normal = curves[0].tangentAt(0).cross(curves[0].normalAt(0)) elif len(straight) > 1: - if straight and not fCmd.isParallel( - straight[0].tangentAt(0), straight[1].tangentAt(0) - ): + if straight and not fCmd.isParallel(straight[0].tangentAt(0), straight[1].tangentAt(0)): normal = straight[0].tangentAt(0).cross(straight[1].tangentAt(0)) elif FreeCADGui.Selection.getSelection(): normal = FreeCAD.DraftWorkingPlane.getRotation().multVec(Z) @@ -137,9 +135,7 @@ def __init__(self, pl=None, scale=[100, 100, 20], offset=100, name="ARROW"): self.moveto(pl) def closeArrow(self): - self.view.removeEventCallbackPivy( - coin.SoMouseButtonEvent.getClassTypeId(), self.cb - ) + self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.cb) self.sg.removeChild(self.node) def moveto(self, pl): @@ -147,9 +143,7 @@ def moveto(self, pl): rotx90 = FreeCAD.Base.Rotation(FreeCAD.Vector(0, 1, 0), FreeCAD.Vector(0, 0, 1)) self.Placement = pl - self.transform.rotation.setValue( - tuple(self.Placement.Rotation.multiply(rotx90).Q) - ) + self.transform.rotation.setValue(tuple(self.Placement.Rotation.multiply(rotx90).Q)) offsetV = self.Placement.Rotation.multVec(FreeCAD.Vector(0, 0, self.offset)) self.transform.translation.setValue(tuple(self.Placement.Base + offsetV)) @@ -204,14 +198,10 @@ def __init__(self, edit, edit2, pl=None, direct=None, M=100.0, objs=None): if not pl: pl = FreeCAD.Placement() # draw arrow - super(arrow_move, self).__init__( - pl=pl, scale=[M / 2, M / 2, M / 10], offset=M / 2 - ) + super(arrow_move, self).__init__(pl=pl, scale=[M / 2, M / 2, M / 10], offset=M / 2) def pickAction(self, path=None, event=None, arg=None): - FreeCAD.activeDocument().openTransaction( - translate("uCmd", "Quick move", "Transaction") - ) + FreeCAD.activeDocument().openTransaction(translate("uCmd", "Quick move", "Transaction")) if event.wasCtrlDown(): k = -1 * float(self.edit.text()) else: @@ -264,9 +254,7 @@ def selectAction(self): if self.arrow: self.arrow.closeArrow() M = 100.0 - moveSet = [ - o for o in FreeCADGui.Selection.getSelection() if hasattr(o, "Shape") - ] + moveSet = [o for o in FreeCADGui.Selection.getSelection() if hasattr(o, "Shape")] if moveSet: bb = moveSet[0].Shape.BoundBox for o in moveSet: @@ -284,9 +272,7 @@ def selectAction(self): direct = fCmd.edges()[0].tangentAt(0) # create the arrow_move object if direct: - pl.Rotation = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), direct).multiply( - pl.Rotation - ) + pl.Rotation = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), direct).multiply(pl.Rotation) self.arrow = arrow_move( self.form.edit1, self.form.edit2, @@ -365,15 +351,9 @@ def __init__(self, wireFlag=True): self.hackedUI = FreeCADGui.PySideUic.loadUi(dialogPath) self.hackedUI.btnRot.clicked.connect(self.rotateWP) self.hackedUI.btnOff.clicked.connect(self.offsetWP) - self.hackedUI.btnXY.clicked.connect( - lambda: self.alignWP(FreeCAD.Vector(0, 0, 1)) - ) - self.hackedUI.btnXZ.clicked.connect( - lambda: self.alignWP(FreeCAD.Vector(0, 1, 0)) - ) - self.hackedUI.btnYZ.clicked.connect( - lambda: self.alignWP(FreeCAD.Vector(1, 0, 0)) - ) + self.hackedUI.btnXY.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(0, 0, 1))) + self.hackedUI.btnXZ.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(0, 1, 0))) + self.hackedUI.btnYZ.clicked.connect(lambda: self.alignWP(FreeCAD.Vector(1, 0, 0))) self.ui.layout.addWidget(self.hackedUI) def alignWP(self, norm): @@ -382,9 +362,7 @@ def alignWP(self, norm): def offsetWP(self): if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): - s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt( - "gridSize" - ) + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") sc = [float(x * s) for x in [1, 1, 0.2]] varrow = arrow(FreeCAD.DraftWorkingPlane.getPlacement(), scale=sc, offset=s) offset = QInputDialog.getInt( @@ -394,9 +372,7 @@ def offsetWP(self): ) if offset[1]: offsetWP(offset[0]) - FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild( - varrow.node - ) + FreeCADGui.ActiveDocument.ActiveView.getSceneGraph().removeChild(varrow.node) def rotateWP(self): self.form = uForms.rotWPForm() @@ -437,9 +413,7 @@ def action(self, arg): # re-defintition of the method of parent if self.hackedUI.cb1.isChecked(): rot = FreeCAD.DraftWorkingPlane.getPlacement().Rotation normal = rot.multVec(FreeCAD.Vector(0, 0, 1)) - FreeCAD.DraftWorkingPlane.alignToPointAndAxis( - self.point, normal - ) + FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.point, normal) FreeCADGui.Snapper.setGrid() if not self.isWire and len(self.node) == 2: self.finish(False, cont=True) diff --git a/uForms.py b/uForms.py index 4b7415e..962a259 100644 --- a/uForms.py +++ b/uForms.py @@ -41,9 +41,7 @@ def initUI(self): self.subFLayout3 = QtGui.QFormLayout() self.subFLayout3.addRow(translate("uForms", "Rotation axis: "), self.labRotAx) # 5th row - self.labSubObj = QtGui.QLabel( - translate("uForms", "(Sub object property)"), self - ) + self.labSubObj = QtGui.QLabel(translate("uForms", "(Sub object property)"), self) # 6th row self.labBeam = QtGui.QLabel(translate("uForms", "(Beam property)"), self) # 7th row @@ -79,12 +77,8 @@ def onPushButton1(self): try: obj = self.Selection.getSelection()[0] self.labName.setText(obj.Label) - self.labBaseVal.setText( - str("P = %.1f,%.1f,%.1f" % tuple(obj.Placement.Base)) - ) - self.labRotAng.setText( - str("%.2f " % (degrees(obj.Placement.Rotation.Angle))) - ) + self.labBaseVal.setText(str("P = %.1f,%.1f,%.1f" % tuple(obj.Placement.Base))) + self.labRotAng.setText(str("%.2f " % (degrees(obj.Placement.Rotation.Angle)))) ax = obj.Placement.Rotation.Axis self.labRotAx.setText( str("v = (%(x).2f,%(y).2f,%(z).2f)" % {"x": ax.x, "y": ax.y, "z": ax.z}) @@ -99,23 +93,19 @@ def onPushButton1(self): sub = shapes[0] if sub.ShapeType == "Edge": if sub.curvatureAt(0) == 0: - self.labSubObj.setText( - sub.ShapeType + ":\tL = %.1f mm" % sub.Length - ) + self.labSubObj.setText(sub.ShapeType + ":\tL = %.1f mm" % sub.Length) else: x, y, z = sub.centerOfCurvatureAt(0) d = 2 / sub.curvatureAt(0) self.labSubObj.setText( - sub.ShapeType - + ":\tD = %.1f mm\n\tC = %.1f,%.1f,%.1f" % (d, x, y, z) + sub.ShapeType + ":\tD = %.1f mm\n\tC = %.1f,%.1f,%.1f" % (d, x, y, z) ) elif sub.ShapeType == "Face": self.labSubObj.setText(sub.ShapeType + ":\tA = %.1f mm2" % sub.Area) elif sub.ShapeType == "Vertex": self.labSubObj.setText( sub.ShapeType - + ": pos = (%(x).1f,%(y).1f,%(z).1f)" - % {"x": sub.X, "y": sub.Y, "z": sub.Z} + + ": pos = (%(x).1f,%(y).1f,%(z).1f)" % {"x": sub.X, "y": sub.Y, "z": sub.Z} ) elif len(shapes) > 1: self.labSubObj.setText( @@ -191,9 +181,7 @@ def __init__(self, winTitle=translate("uForms", "Rotate WP"), icon="rotWP.svg"): self.grid.addWidget(self.btn1, 2, 0, 1, 3, Qt.AlignCenter) self.show() self.sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph() - s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt( - "gridSize" - ) + s = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetInt("gridSize") sc = [float(x * s) for x in [1, 1, 0.2]] from uCmd import arrow @@ -246,9 +234,7 @@ def __init__(self): self.form.radioLiquid.released.connect(self.setLiquid) self.form.radioGas.released.connect(self.setGas) self.form.butExport.clicked.connect(self.export) - self.form.comboWhat.currentIndexChanged.connect( - lambda: self.form.labResult.setText("---") - ) + self.form.comboWhat.currentIndexChanged.connect(lambda: self.form.labResult.setText("---")) f = open(join(dirname(abspath(__file__)), "tablez", "roughness.csv"), "r") reader = csv.DictReader(f, delimiter=";") self.materials = [m for m in reader] @@ -271,8 +257,7 @@ def __init__(self): [ o.Label for o in FreeCAD.ActiveDocument.Objects - if hasattr(o, "PType") - and (o.PType == "PypeBranch" or o.PType == "PypeLine") + if hasattr(o, "PType") and (o.PType == "PypeBranch" or o.PType == "PypeLine") ] ) self.checkFluid() @@ -291,14 +276,9 @@ def accept(self): if self.form.comboWhat.currentText() == "": elements = FreeCADGui.Selection.getSelection() else: - o = FreeCAD.ActiveDocument.getObjectsByLabel( - self.form.comboWhat.currentText() - )[0] + o = FreeCAD.ActiveDocument.getObjectsByLabel(self.form.comboWhat.currentText())[0] if hasattr(o, "PType") and o.PType == "PypeBranch": - elements = [ - FreeCAD.ActiveDocument.getObject(name) - for name in o.Tubes + o.Curves - ] + elements = [FreeCAD.ActiveDocument.getObject(name) for name in o.Tubes + o.Curves] elif hasattr(o, "PType") and o.PType == "PypeLine": group = FreeCAD.ActiveDocument.getObjectsByLabel(o.Label + "_pieces")[0] elements = group.OutList @@ -322,8 +302,7 @@ def accept(self): Ltot += L loss = v**2 / 2 * self.Rho * f * L / ID self.form.editResults.append( - "%s\t%.1f mm\t%.1f m/s\t%.5f bar" - % (o.Label, ID * 1000, v, loss / 1e5) + "%s\t%.1f mm\t%.1f m/s\t%.5f bar" % (o.Label, ID * 1000, v, loss / 1e5) ) elif o.PType == "Elbow": ang = float(o.BendAngle) @@ -338,8 +317,7 @@ def accept(self): ) # Rennels loss = self.Rho * K * v**2 / 2 self.form.editResults.append( - "%s\t%.1f mm\t%.1f m/s\t%.5f bar" - % (o.Label, ID * 1000, v, loss / 1e5) + "%s\t%.1f mm\t%.1f m/s\t%.5f bar" % (o.Label, ID * 1000, v, loss / 1e5) ) elif o.PType == "Reduct": ID1 = float(o.OD - o.thk * 2) @@ -352,16 +330,12 @@ def accept(self): K = 0.5 * sqrt(sin(teta / 2)) * (1 - beta**2) loss = self.Rho * K * v**2 / 2 self.form.editResults.append( - "%s\t%.1f mm\t%.1f m/s\t%.5f bar" - % (o.Label, ID * 1000, v, loss / 1e5) + "%s\t%.1f mm\t%.1f m/s\t%.5f bar" % (o.Label, ID * 1000, v, loss / 1e5) ) elif hasattr(o, "Kv") and o.Kv > 0: if self.isLiquid: loss = (Q * 3600 / o.Kv) ** 2 * 100000 * self.Rho / 1000 - elif ( - self.form.comboFluid.currentText() == translate("water") - and not self.isLiquid - ): + elif self.form.comboFluid.currentText() == translate("water") and not self.isLiquid: pass # TODO: formula for steam else: pass # TODO: formula for gases @@ -372,8 +346,7 @@ def accept(self): v = 0 ID = 0 self.form.editResults.append( - "%s\t%.1f mm\t%.1f m/s\t%.5f bar" - % (o.Label, ID * 1000, v, loss / 1e5) + "%s\t%.1f mm\t%.1f m/s\t%.5f bar" % (o.Label, ID * 1000, v, loss / 1e5) ) Dp += loss if Dp > 200: @@ -407,9 +380,7 @@ def setLiquid(self): QMessageBox.warning( None, translate("dpCalcDialog", "No data found"), - translate( - "dpCalcDialog", "It seems the fluid has not a liquid state." - ), + translate("dpCalcDialog", "It seems the fluid has not a liquid state."), ) self.form.radioGas.setChecked(True) return @@ -431,9 +402,7 @@ def setGas(self): QMessageBox.warning( None, translate("dpCalcDialog", "No data found"), - translate( - "dpCalcDialog", "It seems the fluid has not a gas state." - ), + translate("dpCalcDialog", "It seems the fluid has not a gas state."), ) self.form.radioLiquid.setChecked(True) return From fd8907e8148c74f36f3d4734990c894d6a8ce161 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 7 Nov 2024 14:04:44 -0600 Subject: [PATCH 076/135] Move `addCommand()` function to quetzal_config module --- CFrame.py | 22 ++++------------------ CPipe.py | 20 ++------------------ CUtils.py | 20 ++------------------ quetzal_config.py | 21 +++++++++++++++++++++ 4 files changed, 29 insertions(+), 54 deletions(-) diff --git a/CFrame.py b/CFrame.py index 8b4c8df..433472f 100644 --- a/CFrame.py +++ b/CFrame.py @@ -6,30 +6,16 @@ __license__ = "LGPL 3" # import FreeCAD modules +import os + import FreeCAD import FreeCADGui -import inspect -import os + +from quetzal_config import addCommand QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP translate = FreeCAD.Qt.translate -# helper ------------------------------------------------------------------- -# FreeCAD TemplatePyMod module -# (c) 2007 Juergen Riegel LGPL - - -def addCommand(name, cmdObject): - (list, num) = inspect.getsourcelines(cmdObject.Activated) - pos = 0 - # check for indentation - while list[1][pos] == " " or list[1][pos] == "\t": - pos += 1 - source = "" - for i in range(len(list) - 1): - source += list[i + 1][pos:] - FreeCADGui.addCommand(name, cmdObject, source) - # --------------------------------------------------------------------------- # The command classes diff --git a/CPipe.py b/CPipe.py index 7084e98..625c1cc 100644 --- a/CPipe.py +++ b/CPipe.py @@ -8,28 +8,11 @@ # import FreeCAD modules import FreeCAD import FreeCADGui -import inspect -from quetzal_config import get_icon_path +from quetzal_config import addCommand, get_icon_path QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP translate = FreeCAD.Qt.translate -# helper ------------------------------------------------------------------- -# FreeCAD TemplatePyMod module -# (c) 2007 Juergen Riegel LGPL - - -def addCommand(name, cmdObject): - (list, num) = inspect.getsourcelines(cmdObject.Activated) - pos = 0 - # check for indentation - while list[1][pos] == " " or list[1][pos] == "\t": - pos += 1 - source = "" - for i in range(len(list) - 1): - source += list[i + 1][pos:] - FreeCADGui.addCommand(name, cmdObject, source) - # print(name+":\n"+str(source)) def updatesPL(dialogqm): @@ -448,6 +431,7 @@ def GetResources(self): return { "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertAnyz", "Insert any shape"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertAnyz", "Insert a STEP, IGES or BREP"), + # TODO: Create an icon } diff --git a/CUtils.py b/CUtils.py index 1be230e..0aff878 100644 --- a/CUtils.py +++ b/CUtils.py @@ -3,30 +3,14 @@ __license__ = "LGPL 3" # import FreeCAD modules + import FreeCAD import FreeCADGui -import inspect -from quetzal_config import get_icon_path +from quetzal_config import addCommand, get_icon_path QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP -# helper ------------------------------------------------------------------- -# FreeCAD TemplatePyMod module -# (c) 2007 Juergen Riegel LGPL - - -def addCommand(name, cmdObject): - (list, num) = inspect.getsourcelines(cmdObject.Activated) - pos = 0 - # check for indentation - while list[1][pos] == " " or list[1][pos] == "\t": - pos += 1 - source = "" - for i in range(len(list) - 1): - source += list[i + 1][pos:] - FreeCADGui.addCommand(name, cmdObject, source) - # --------------------------------------------------------------------------- # The command classes diff --git a/quetzal_config.py b/quetzal_config.py index 1ae8675..3ca0f20 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -1,5 +1,8 @@ +import inspect import os + import FreeCAD +import FreeCADGui __version__ = "1.1.0" @@ -14,3 +17,21 @@ def get_icon_path(icon_name: str) -> str: """Returns the path to the SVG icon.""" return os.path.join(ICONPATH, icon_name + ".svg") + + +# helper ------------------------------------------------------------------- +# FreeCAD TemplatePyMod module +# (c) 2007 Juergen Riegel LGPL + + +def addCommand(name, cmdObject): + (list, num) = inspect.getsourcelines(cmdObject.Activated) + pos = 0 + # check for indentation + while list[1][pos] == " " or list[1][pos] == "\t": + pos += 1 + source = "" + for i in range(len(list) - 1): + source += list[i + 1][pos:] + FreeCADGui.addCommand(name, cmdObject, source) + # FreeCAD.Console.PrintMessage("Quetzal " + name + "source: <<< " + source + " >>>\n") From b180b6a3726e7133533d23366f9f37b0fbe0c25c Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 7 Nov 2024 14:15:15 -0600 Subject: [PATCH 077/135] Add templates for bug and feature-request actions --- .github/ISSUE_TEMPLATE/bug-report.yml | 78 ++++++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 11 +++ .github/ISSUE_TEMPLATE/feature-request.yml | 36 ++++++++++ 3 files changed, 125 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..6c5b3e4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,78 @@ +name: Bug Report +description: Report a bug +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Please fill out the sections below to help everyone identify and fix the bug + - type: textarea + id: description + attributes: + label: Describe your issue + placeholder: When I use the X command this happens + description: Describe the problem and how it impacts user experience, workflow, maintainability or speed of the code. If the problem appears to be a bug with the current functionality, provide as test case or recipe that reproduces the error. Ideally record a macro and attach it. + validations: + required: true + - type: textarea + id: full_version + attributes: + label: FreeCAD version info + Quetzal WB version + placeholder: | + OS: Arch Linux, btw (Hyprland/hyprland/wayland) + Architecture: x86_64 + Version: 1.1.0dev.36460 +2653 (Git) + Build type: Release + Branch: main + Hash: 440b96eaf3a2a12a9079b3944101a11cb53a25fe + Python 3.12.7, Qt 6.8.0, Coin 4.0.3, Vtk 9.3.1, OCC 7.8.1 + Locale: English/United States (en_US) + Stylesheet/Theme/QtStyle: OpenDark.qss/OpenDark/ + Installed mods: + * Quetzal 1.0.0 + description: Please use the About FreeCAD dialog to copy your full version information and paste it here, include the Quetzal WB version on it. + render: shell + - type: dropdown + id: category + attributes: + label: What is the feature affected? + options: + - Frame tools + - Tube tools + - Utilities + - Icons + - Translations + - type: textarea + id: steps + attributes: + label: Steps to reproduce + placeholder: | + 1. Switch to Quetzal WB + 2. Click on X command + validations: + required: true + - type: textarea + id: expected + attributes: + label: What was the expected result? + placeholder: I expected this to happen + - type: textarea + id: screenshots + attributes: + label: Put here any screenshots or videos (optional) + description: | + Add links, references, screenshots or anything that will give us more context about the issue you are encountering! + If there is a discussion about the problem on the forum, provide link(s) here. + You can upload or copy your macro here to speed up the diagnosis and debugging. + + Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. To attach a FCStd file, ZIP it first (GitHub won't recognize the extension otherwise). + - type: dropdown + id: assign + attributes: + label: "Would you like to work on this issue?" + options: + - "Yes" + - type: markdown + attributes: + value: | + Thanks for reporting this issue! We will get back to you as soon as possible. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..516bf1d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: true +contact_links: + - name: Read the documentation + url: https://wiki.freecad.org/Flamingo_Workbench + about: Read the FreeGrid workbench documentation on the FreeCAD Wiki + - name: General questions about the workbench + url: https://forum.freecad.org/viewtopic.php?t=22711 + about: You can join the discussions on the FreeCAD forum. + - name: Dudas y preguntas del banco de trabajo en español/castellano + url: https://t.me/FreeCAD_Es/93055 + about: Sección dedicada al sistema Flamingo/Dodo/Quetzal en el grupo de FreeCAD en español/castellano en Telegram diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..65474fb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,36 @@ +name: New feature +description: Suggest or request a new feature +labels: ["enhancement"] +body: + - type: markdown + attributes: + value: | + Please fill out the sections below to properly describe the new feature you are suggesting. + - type: textarea + id: description + attributes: + label: Describe the feature + placeholder: A new command to generate this new part + validations: + required: true + - type: textarea + id: rationale + attributes: + label: It should be implemented because + placeholder: It's needed to build this model, it's a very common part + - type: textarea + id: context + attributes: + label: Additional context + placeholder: | + Add any other context or screenshots about the feature request here. + - type: dropdown + id: assign + attributes: + label: "Would you like to work on this issue?" + options: + - "Yes" + - type: markdown + attributes: + value: | + Thanks for your suggestion! Let's see together if it can be implemented. From c54a3e5a36e1e17015f0f1eee0b556469109d0b5 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 7 Nov 2024 14:56:20 -0600 Subject: [PATCH 078/135] Add `CHANGELOG.md` file --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ README.md | 3 +++ 2 files changed, 35 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..88d6a34 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,32 @@ +# Changelog + +## [1.0.0] - 2024-10-20 + +🌱 Initial release of Quetzal WB based on the work of **oddtopus** on [Dodo WB][dodo]. + +### Added + +- Add Cut List function by File Phil +- Add translation support +- Add Spanish translation +- Add view provider class to assign icons to parametric objects +- Add miter corner feature + +### Changed + +- Apply black style to Python files +- Make commands to use "Quetzal_" prefix +- Extend RH profile profile CSV file +- Update some icons +- Mark commands unavailable when there is no active document + +### Fixed + +- Don't remove sketch profile by Ebrahim Raeyat +- Fix touched object after recomputation by Zheng, Lei +- Fix license ID by Chris Hennes +- Fix PypeLineForm pipe generation +- Fix typos + +[dodo]: https://github.com/oddtopus/dodo +[1.0.0]: https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2 diff --git a/README.md b/README.md index 0a876b4..391c081 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ [![pre-commit enabled][pre-commit_badge]][pre-commit] [![Code style: black][black_badge]][black] [![GitHub Tag][tag_bagde]][tag] +[![Common Changelog][cc_badge]][cc] Quetzal is the fork of Dodo workbench for [FreeCAD](https://freecad.org). Extending Dodo workbench support & adding translation support. @@ -74,3 +75,5 @@ Discussion in the FreeCAD Forum: [black_badge]: [tag]: [tag_bagde]: +[cc_badge]: +[cc]: <./CHANGELOG.md> From 71042a62ba32f2421b2d2f6f096f10ff6cb6c22c Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 10 Nov 2024 21:17:18 -0600 Subject: [PATCH 079/135] Replace original profiles to use BIM profiles --- fFeatures.py | 103 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 24 deletions(-) diff --git a/fFeatures.py b/fFeatures.py index 2931ed8..a10d87a 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -66,6 +66,10 @@ def indexEdge(edge, listedges): def findFB(beamName=None, baseName=None): + ''' + Search FrameBranch object inside the Active document + if beam name or base object name parameters are given, it will return the frameBranch related to beam or base object (skectch, wire ,etc) + ''' Branches = [ o.Name for o in FreeCAD.ActiveDocument.Objects @@ -465,8 +469,15 @@ def __init__(self): self.form.editLength.setValidator(QDoubleValidator()) tablez = listdir(join(dirname(abspath(__file__)), "tablez")) files = [name for name in tablez if name.startswith("Section")] - RatingsList = [s.lstrip("Section_").rstrip(".csv") for s in files] - self.form.comboRatings.addItems(RatingsList) + # RatingsList = [s.lstrip("Section_").rstrip(".csv") for s in files] + import ArchProfile + buffer = list() + self.ArchList = ArchProfile.readPresets() + for rating in self.ArchList: + if rating[1] not in buffer: + buffer.append(rating[1]) + # self.form.comboRatings.addItems(RatingsList) + self.form.comboRatings.addItems(buffer) self.form.comboRatings.addItems([""]) self.form.comboRatings.currentIndexChanged.connect(self.fillSizes) self.form.btnRemove.clicked.connect(self.removeBeams) @@ -487,6 +498,14 @@ def __init__(self): self.actionX.triggered.disconnect(self.accept) # disconnect from accept() self.actionX.triggered.connect(self.trim) # reconnect to trim() + def getPropsfromlistSizes(self): + ''' + Check profileslist and return full properties selected on the widget list + ''' + for value in self.ArchList: + if self.form.listSizes.currentItem().text() in value[2]: + return value + def makeSingle(self): FreeCAD.activeDocument().openTransaction("Insert Single Struct") if self.SType == "": @@ -494,8 +513,11 @@ def makeSingle(self): self.form.listSizes.currentItem().text() )[0] else: - prop = self.sectDictList[self.form.listSizes.currentRow()] - profile = newProfile(prop) + prop=self.getPropsfromlistSizes() + # prop = self.sectDictList[self.form.listSizes.currentRow()] + FreeCAD.Console.PrintMessage(prop) + profile = makeProfile(prop) + # profile = newProfile(prop) if fCmd.faces(): Z = FreeCAD.Vector(0, 0, 1) for f in fCmd.faces(): @@ -618,25 +640,44 @@ def generateBisectPlanes(self): from DraftGeomUtils import findIntersection # FreeCAD.Console.PrintMessage('posicion de boceto:'+ str(sel[0].Placement.Rotation)+'\r\n') i=0 + rep=0 reachedlines = [] interVertex = [] if sel[0].FType == 'FrameBranch': for element in sel[0].Base.Geometry: # FreeCAD.Console.PrintMessage('Segmento '+str(element)+'\r\n') for subelement in sel[0].Base.Geometry: - if element.EndPoint != subelement.EndPoint or element.StartPoint != subelement.StartPoint or (element.EndPoint != subelement.EndPoint and element.StartPoint != subelement.StartPoint): + # Avoid process the geometric element that match StartPoint and EndPoint and also just have process elements with a common point + if (element.EndPoint != subelement.EndPoint or + element.StartPoint != subelement.StartPoint or + (element.EndPoint != subelement.EndPoint and + element.StartPoint != subelement.StartPoint) and + (element.EndPoint != subelement.StartPoint and + element.StartPoint != subelement.EndPoint)): #WARN:intersectionCLines method forces to detect infinite intersections that is not required # interVertex=fCmd.intersectionCLines(element.toShape().Edges[0],subelement.toShape().Edges[0]) interVertex=findIntersection(element.toShape().Edges[0],subelement.toShape().Edges[0],infinite1=False, infinite2=False) if interVertex: - if interVertex[0] not in reachedlines: + roundelementStart=self.roundVectors(element.StartPoint,2) + roundelementEnd=self.roundVectors(element.EndPoint,2) + roundsubelementStart=self.roundVectors(subelement.StartPoint,2) + roundsubelementEnd=self.roundVectors(subelement.EndPoint,2) + roundinterVertex=self.roundVectors(interVertex[0],2) + if [element.Tag,subelement.Tag] not in reachedlines: + content=True + reachedlines.append([element.Tag,subelement.Tag]) + else: + content=False + if [subelement.Tag,element.Tag] not in reachedlines: + contentsub=True + reachedlines.append([subelement.Tag,element.Tag]) + else: + contentsub=False + if (content) or (contentsub): # FreeCAD.Console.PrintMessage('Punto de interseccion: '+str(interVertex[0])+'\r\n') - roundelementStart=self.roundVectors(element.StartPoint,2) - roundelementEnd=self.roundVectors(element.EndPoint,2) - roundsubelementStart=self.roundVectors(subelement.StartPoint,2) - roundsubelementEnd=self.roundVectors(subelement.EndPoint,2) - roundinterVertex=self.roundVectors(interVertex[0],2) - reachedlines.append(interVertex[0]) + # Store edge pair that intersect + FreeCAD.Console.PrintMessage('Reachedlines: {0} and {1}'.format(reachedlines[rep][0],reachedlines[rep][1])+'\r\n') + rep=rep+1 # FIXME: intersectCC method does not return line intersection; findIntersection method does it right # interpoint=element.intersectCC(subelement)[0] @@ -704,8 +745,10 @@ def accept(self): self.form.listSizes.currentItem().text() )[0] else: - prop = self.sectDictList[self.form.listSizes.currentRow()] - profile = newProfile(prop) + # prop = self.sectDictList[self.form.listSizes.currentRow()] + prop=self.getPropsfromlistSizes() + profile = makeProfile(prop) + # profile = newProfile(prop) # MAKE FRAMEBRANCH if self.form.editName.text(): name = self.form.editName.text() @@ -775,6 +818,9 @@ def mouseActionB1(self, CtrlAltShift): self.form.lab1.setText("") def fillSizes(self): + ''' + Fill standart beam sizes into a framebeams widget + ''' self.SType = self.form.comboRatings.currentText() self.form.listSizes.clear() if self.SType == "": @@ -792,14 +838,21 @@ def fillSizes(self): ] self.form.listSizes.addItems(obj2D) else: - fileName = "Section_" + self.SType + ".csv" - f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") - reader = csv.DictReader(f, delimiter=";") - self.sectDictList = [x for x in reader] - f.close() - for row in self.sectDictList: - s = row["SSize"] - self.form.listSizes.addItem(s) + sizelist = list() + for profilesizes in self.ArchList: + if profilesizes[1] == self.form.comboRatings.currentText(): + # FreeCAD.Console.PrintMessage(profilesizes[2]+'\r\n') + sizelist.append(profilesizes[2]) + self.form.listSizes.addItems(sizelist) + # fileName = "Section_" + self.SType + ".csv" + # f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") + # reader = csv.DictReader(f, delimiter=";") + # self.sectDictList = [x for x in reader] + self.sectDictList = [x for x in self.ArchList] + # f.close() + # for row in self.sectDictList: + # s = row["SSize"] + # self.form.listSizes.addItem(s) def addBeams(self): # find selected FB @@ -867,8 +920,10 @@ def changeProfile(self): self.form.listSizes.currentItem().text() )[0] else: - prop = self.sectDictList[self.form.listSizes.currentRow()] - profile = newProfile(prop) + prop=self.getPropsfromlistSizes() + # prop = self.sectDictList[self.form.listSizes.currentRow()] + # profile = newProfile(prop) + profile = makeProfile(prop) name = FB.Profile.Name FB.Profile = profile FB.Proxy.redraw(FB) From b594565bca09fab5af98ecf3df878ba5bacc504c Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 4 Jan 2025 19:34:12 -0600 Subject: [PATCH 080/135] Added ASME flange weld neck, lap join, socket slot -Added round Beam profiles support -Added extra fillet parameters to apply fillet on flanges -Added piping flange location based on table flange type --- ShpstData.py | 1232 +++++++++++++++++++++++ dialogz/fbranch.ui | 224 ++--- fFeatures.py | 214 +++- pCmd.py | 20 +- pFeatures.py | 157 ++- pForms.py | 26 +- tablez/Flange_ASME-LJ-STD-150lb.csv | 21 + tablez/Flange_ASME-SW-RF-STD-150lb.csv | 21 + tablez/Flange_ASME-WN-RF-STD-1500lb.csv | 19 + tablez/Flange_ASME-WN-RF-STD-150lb.csv | 21 + tablez/Flange_ASME-WN-RF-STD-2500lb.csv | 16 + tablez/Flange_ASME-WN-RF-STD-300lb.csv | 20 + tablez/Flange_ASME-WN-RF-STD-600lb.csv | 20 + tablez/Flange_ASME-WN-RF-STD-900lb.csv | 21 + 14 files changed, 1896 insertions(+), 136 deletions(-) create mode 100644 ShpstData.py create mode 100644 tablez/Flange_ASME-LJ-STD-150lb.csv create mode 100644 tablez/Flange_ASME-SW-RF-STD-150lb.csv create mode 100644 tablez/Flange_ASME-WN-RF-STD-1500lb.csv create mode 100644 tablez/Flange_ASME-WN-RF-STD-150lb.csv create mode 100644 tablez/Flange_ASME-WN-RF-STD-2500lb.csv create mode 100644 tablez/Flange_ASME-WN-RF-STD-300lb.csv create mode 100644 tablez/Flange_ASME-WN-RF-STD-600lb.csv create mode 100644 tablez/Flange_ASME-WN-RF-STD-900lb.csv diff --git a/ShpstData.py b/ShpstData.py new file mode 100644 index 0000000..4a3db5b --- /dev/null +++ b/ShpstData.py @@ -0,0 +1,1232 @@ +type=[ +'00_Angle','01_Channel','02_H_Shape','03_I-Shape','04_CT_Shape','05_Pipe', +'06_Flat_Bar','07_Light_Weight_Angle','08_Light_Weight_Channel','09_Rip_Channel','10_Square_Pipe', +] + +sface=['XY','XZ','YZ'] + +l_type=[ +'00_L形鋼','01_溝形鋼','02_H形鋼','03_I形鋼','04_CT形鋼','05_構造用鋼管','06_平鋼' +,'07_軽量L形鋼','08_軽量溝形鋼','09_リップ溝形鋼','10_角形鋼管', +] + +Angle_st=['SS_Equal','SS_Unequal','SUS_Equal',] +Channel_st=['SS','SUS',] +H_st=['SS_Wide','SS_Medium','SS_Thin','SUS'] +I_st=['SS',] +CT_st=['SS',] +Pipe_st=['STK','SUS_Sch20S','SUS_Sch40','SGP'] +Flat_Bar_st=['SS','SUS'] +LW_angle_st=['SS','SUS'] +LW_channel_st=['SS','SUS'] +Rip_channel_st=['SS','SUS'] +Square_pipe_st=['SS','SUS'] + +angle_ss_size=[ +'20x20x3','25x25x3','30x30x3','30x30x5','40x40x3','40x40x5','50x50x4','50x50x6','65x65x6', +'65x65x8','75x75x6','75x75x9','75x75x12','90x90x7','90x90x10','90x90x13','100x100x7', +'100x100x10','100x100x13','130x130x9','130x130x12','130x130x15','150x150x12','130x130x15', +'150x150x12','150x150x15','150x150x19','200x200x15','200x200x20','200x200x25' +] +angle_ssun_size=[ +'90x75x9','100x75x7','100x75x10','125x75x7','125x75x10','125x75x13','125x90x10','125x90x13','150x90x9', +'150x90x12','150x100x9','150x100x12','150x100x15', +] +angle_sus_size=[ +'20x20x3','25x25x3','30x30x3','40x40x3','35x35x4','40x40x4','50x50x4','40x40x5','45x45x5', +'50x50x5','30x30x6','35x35x6','40x40x6','50x50x6','60x60x6','65x65x6','75x75x6','100x100x6', +'70x70x7','65x65x8','80x80x8','100x100x8','50x50x9','65x65x9','75x75x9','90x90x9','125x125x9', +'75x75x12','100x100x10','100x100x12','125x125x12','90x90x13','100x100x13','130x130x12','125x125x15', +'150x150x15' +] + +channel_ss_size=[ +'75x40x5','100x50x5','125x65x6','150x75x6','150x75x9','180x75x7','200x80x7.5','200x90x8', +'250x90x9','250x90x11','300x90x9','300x90x10','300x90x12','380x100x10.5','380x100x13/16.5', +'380x100x13/20', +] + +channel_sus_size=[ +'40x20x3','50x25x3','100x50x4','80x40x5','100x50x5','100x50x6','120x60x6','130x65x6', +'150x75x6','150x75x9','200x100x10','220x65x6','230x65x6','250x75x6','250x75x9', +'250x90x9','300x90x9','300x100x9','250x100x10','300x90x10','300x100x10', +] + +H_ss_w_size=[ +'100x100x6/8','125x125x6.5/9','150x150x7/10','175x175x7.5/11','200x200x8/12','250x250x9/14', +'300x300x10/15','300x305x15/15','350x350x12/19','400x400x13/21', +] +H_ss_m_size=[ +'148x100x6/9','194x150x6/9','244x175x7/11','294x200x8/12','340x250x9/14','390x300x10/16', +'440x300x11/18','482x300x11/15','488x300x11/18','582x300x12/17','588x300x12/20','692x300x13/20', +'700x300x13/24','800x300x14/26','900x300x16/28', +] +H_ss_t_size=[ +'100x50x5/7','125x60x6/8','150x75x5/7','175x90x5/8','198x99x4.5/7','200x100x5.5/8','248x124x5/8', +'250x125x6/9','298x149x5.5/8','300x150x6.5/9','346x174x6/9','350x175x7/11','396x199x7/11', +'400x200x8/13','446x199x8/12','450x200x9/14','496x199x9/14','500x200x10/16','546x199x9/14', +'550x200x10/16','596x199x10/15','600x200x11/17' +] +H_sus_size=[ +'100x100x6/8','125x125x6.5/8','148x100x6/8','150x150x7/8','200x100x5.5/8','200x200x8/12','250x250x9/14', +] + +I_ss_size=[ +'100x75x5/8','125x75x5.5/9.5','150x75x5.5/9.5','150x125x8.5/14','180x100x6/10,180','200x100x7/10,200', +'200x150x9/16,200','250x125x7.5/12.5','250x125x10/19','300x150x8/13','300x150x10/18.5','300x150x11.5/22', +'350x150x9/15','350x150x12/24','400x150x10/18','400x150x12.5/25','450x175x11/20','450x175x13/26', +'600x190x13/25','600x190x16/35', +] + +CT_ss_size=[ +'50x50x4/6','50x50x5/7','50x100x5/7','50x100x6/8','62.5x60x4.5/6.5','62.5x60x6/8','62.5x125x6.5/9', +'74x74x5/8','75x75x5/7','75x75x6/9','73x99x5/8','74x100x6/9','76x101x7/11','75x150x7/10','77x151x8/12', +'79x152x9/14','86.5x89x5/8','87.5x90x5/8','87.5x90x6/9','83.5x124x4.5/7','84.5x125x5.5x8/12', +'86.5x126x6.5/10','87.5x126x6.5/11','85.5x174x6/9','87.5x175x7.5/11','89.5x176x8.5/13','91.5x177x9.5/15', +'99x99x4.5/7','100x100x5.5/8','102x101x6.5/10','103x101x6.5/11','96x149x5/8,96','97x150x6/9,97','99x151x7/11', +'100x151x7/12','98x199x6.5/10','100x200x8/12','102x201x9/14','104x202x10/16','100x204x12/12', +] + +STK_ss_size=[ +'21.7x2.0','27.2x2.0','27.2x2.3','34.0x2.3','42.7x2.3','42.7x2.8','48.6x2.3','48.6x2.8','48.6x3.2','60.5x2.3', +'60.5x3.2','60.5x4.0','7635x2.8','76.3x3.2','76.3x4.0','89.1x2.8','89.1x3.2','89.1x4.0','101.6x3.2','101.6x4.0', +'101.6x5.0','114.3x3.2','114.3x3.6','114.3x4.5','114.3x5.6','139.8x3.6','139.8x4.0','139.8x4.5','139.8x6.0', +'165.2x4.5','165.2x5.0','165.2x6.0','165.2x7.0','190.7x4.5','190.7x5.0','190.7x6.0','190.7x7.0','216.3x4.5', +'216.3x6.0','216.3x7.0','216.3x8.0', +] + +Flat_bar_ss_size=[ +'3x13','4.5x13','6x13','3x16','4.5x16','6x16','9x16','3x19','4.5x19','6x19','9x19','3x22','4.5x22','6x22', +'9x22','3x25','4.5x25','6x25','9x25','12x25','3x32','4.5x32','6x32','9x32','12x32','16x32','3x38','4.5x38', +'6x38','9x38','12x38','16x38','19x38','3x44','4.5x44','6x44','9x44','12x44','16x44','19x44','3x50','4.5x50', +'6x50','9x50','12x50','16x50','19x50','22x50','25x50','6x65','9x65','12x65','16x65','19x65','22x65','25x65', +'6x75','9x75','12x75','16x75','19x75','22x75','25x75','6x90','9x90','12x90','16x90','19x90','22x90','25x90', +'6x100','9x100','12x100','16x100','19x100','22x100','25x100','6x125','9x125','12x125','16x125','19x125', +'22x125','25x125','6x150','9x150','12x150','16x150','19x150','22x150','25x150', +] +Flat_bar_sus_size=[ +'2x6','2x8','2x9','2x10','2x12','2x15','2x20','2x25','2x30','2x32','2x35','2x38','2x40','2x45','2x50','3x5','3x6','3x7','3x8','3x9','3x10', +'3x12','3x13','3x15','3x16','3x19','3x20','3x22','3x25','3x30','3x32','3x35','3x38','3x40','3x42','3x45','3x48','3x50','3x60','3x65','3x75', +'3x90','3x100','3x110','3x120','3x125','3x140','3x150','4x9','4x10','4x11','4x12','4x13','4x15','4x16','4x17','4x19','4x20','4x22','4x25', +'4x30','4x32','4x35','4x38','4x40','4x45','4x50','4x60','4x65','4x75','4x90','4x100','5x8','5x9','5x10','5x12','5x13','5x15','5x16','5x19', +'5x20','5x22','5x25','5x30','5x32','5x34','5x35','5x38','5x40','5x45','5x50','5x60','5x65','5x75','5x90','5x100','5x130','5x150','6x9','6x10', +'6x12','6x13','6x15','6x16','6x18','6x19','6x20','6x22','6x25','6x30','6x32','6x35','6x38','6x40','6x42','6x45','6x48','6x50','6x60','6x65', +'6x70','6x75','6x90','6x100','6x110','6x120','6x125','6x130','6x140','6x150','7x20','8x10','8x16','8x25','8x30','8x32','8x35','8x38','8x40', +'8x45','8x50','8x65','8x75','8x100','9x13','9x15','9x16','9x19','9x20','9x22','9x25','9x30','9x32','9x35','9x38','9x40','9x45','9x50','9x55', +'9x60','9x65','9x75','9x90','9x100','9x125','9x150','9x200','9x250','9x300','10x15','10x19','10x20','10x30','10x32','10x35','10x38','10x40', +'10x45','10x50','10x60','10x65','10x75','10x100','10x125','10x150','10x200','10x250','10x300','12x14','12x15','12x16','12x19','12x20','12x25', +'12x28','12x30','12x32','12x35','12x38','12x40','12x50','12x65','12x70','12x75','12x90','12x100','12x125','12x150','12x200','12x250','12x300', +'16x19','16x20','16x25','16x30','16x32','16x35','16x38','16x40','16x45','16x50','16x65','16x75','16x90','16x100','16x125','16x150','16x200', +'16x250','16x300','19x25','19x30','19x35','19x38','19x40','19x45','19x50','19x55','19x65','19x75','19x90','19x100','19x125','19x150','19x65', +'19x75','19x90','19x100','19x125','19x150','19x200','19x250','19x300','20x70','22x25','22x30','22x32','22x35','22x38','22x40','22x45', +'22x50','22x65','22x75','22x90','22x100','22x125','22x150','22x200','22x250','22x300','22x100','25x32','25x38','25x40','25x50','25x60', +'25x65','25x75','25x100','25x125','25x150','25x200','25x250','25x300','30x50','30x55','30x65','30x75','30x100','30x125','30x150','30x200', +'30x250','30x300','35x50','35x65','35x75','35x100','35x125','35x150','40x50','40x65','40x75','40x100','40x125','40x150','50x65','50x75', +'50x100','50x125','50x150','60x75','60x100','60x125','60x150','65x75','70x100','70x125','70x150','80x100','80x125','80x150','90x125','90x150', +'100x125','100x150', +] +tube_d=['06A','08A','10A','15A','20A','25A','32A','40A','50A','65A','80A','100A','125A','150A','200A','250A','300A','350A','400A','450A','500A',] + +LW_angle_ss_size=[ +'25x25x2.3','30x30x2.3','30x30x3.2','40x40x2.8','40x40x3.2','42x42x2.3','50x50x2.3','50x50x3.2','60x60x2.3','60x60x3.2','75x30x3.2', +] +LW_angle_sus_size=[ +'20x20x2','25x25x2','30x30x2','40x40x2','15x15x3','20x20x3','25x25x3','30x30x3','40x40x3','50x50x3','50x50x4','40x40x5', +'50x50x5','75x75x5','50x50x6','60x60x6','65x65x6','75x75x6', +] + +LW_channel_ss_size=[ +'40x40x2.3','40x40x3.2','60x30x1.6','60x30x2.3','80x40x2.3','100x40x2.3','100x40x3.2','100x50x2.3','100x50x3.2','120x40x3.2', +'150x50x3.2','150x50x4.5','150x75x4.5','200x50x3.2','200x50x4.5','200x75x6','250x50x4','250x50x4.5','250x75x4.5','250x75x6', +'300x50x4', +] +LW_channel_sus_size=[ +'100x50x2','120x60x2','50x25x3','80x40x3','100x50x3','100x50x4','100x50x5', +] + +Rip_channel_ss_size=[ +'60x30x10x1.6','60x30x10x2.3','75x45x15x1.6','75x45x15x2.3','100x50x20x1.6','100x50x20x2.3','100x50x20x3.2','125x50x20x2.3', +'125x50x20x3.2','150x50x20x2.3','150x50x20x3.2','150x65x20x3.2','200x75x20x3.2', +] +Rip_channel_sus_size=[ +'40x20x8x2','52x20x8x2','60x20x8x2','70x20x8x2','60x30x10x2','80x40x14.5x2','75x45x15x2','100x50x19.5x2','120x60x19.5x2', +'60x30x10x4,60','80x40x15x4,80','100x50x20x4', +] + +Square_pipe_ss_size=[ +'9x9x1.0','10x10x1.0','11.5x11.5x1.6','15x15x0.8','15x15x1.2','15x15x2.0','20x20x1.6','20x20x2.3','21x21x2.3','25x25x2.0', +'30x30x2.3','30x30x3.2','30x30x4.5','31x31x2.3','31x31x3.2','31x31x4.5','32x32x2.3','35x35x3.2','35x35x3.5','35x35x4.5', +'38x38x2.3','39.4x39.4x3.5','39.6x39.6x4.5','40x40x1.6','40x40x2.3', +'50x50x1.6','50x50x2.3','50x50x3.2','60x60x1.6','60x60x2.3','60x60x3.2','75x75x2.3','75x75x3.2','100x100x2.3','100x100x3.2', +'100x100x4','100x100x4.5','125x125x3.2','125x125x4.5','125x125x5','125x125x6','150x150x4.5','150x150x5','150x150x6', +'200x200x6','200x200x8','200x200x9','200x200x12','25x250x5','250x250x6','250x250x8','250x250x9','250x250x12','300x300x4.5', +'300x300x6','300x300x9','300x300x12','350x350x9','350x350x12', +] + +Square_pipe_sus_size=[ +'30x30x3','40x40x3','40x40x4','40x40x5','50x50x3','50x50x4','50x50x5','60x60x3','60x60x4','60x60x5','75x75x3','75x75x4', +'75x75x5','75x75x6','80x80x3','80x80x4','80x80x5','80x80x6','90x90x3','90x90x4','90x90x5','90x90x6','100x100x3','100x100x4', +'100x100x4','100x100x5','100x100x6','100x100x9','100x100x12','120x120x3','120x120x4','120x120x5','120x120x6','120x120x9', +'125x125x3','125x125x4','125x125x5','125x125x6','125x125x9','125x125x12','150x150x3','150x150x4','150x150x5','150x150x6', +'150x150x9','150x150x12','175x175x3','175x175x4','175x175x5','175x175x6','175x175x9','175x175x12','200x200x3','200x200x4', +'200x200x5','200x200x6','200x200x8','200x200x9','200x200x12','250x250x4','250x250x5','250x250x6','250x250x9','250x250x12', +'300x300x4','300x300x6','300x300x9','300x300x12','350x350x9','350x350x12','400x400x6','400x400x9','400x400x12', +] + +#シリーズ,寸法(mm),,,,,断面積,質量,重心(cm),,断面2次モーメント(cm4),,,断面2次半径,,,断面係数(cm3), +# A, B, t,r1, r2, (cm2),(kg/m),Cx, Cy, Ix, Iy, 最小Iv,ix, iy, 最小iv,Zx, Zy +angle_ss_equal={ +'20x20x3':(20,20,3,4.0,2.0,1.127,0.88, 0.60,0.60,0.39,0.39,0.16, 0.59,0.59,0.38, 0.28,0.28), +'25x25x3':(25,25,3,4.0,2.0,1.427,1.12,0.72,0.72,0.80,0.80,0.33,0.75,0.75,0.48,0.45,0.45), +'30x30x3':(30,30,3,4.0,2.0,1.727,1.36,0.85,0.85,1.42,1.42,0.59,0.91,0.91,0.58,0.66,0.66), +'30x30x5':(30,30,5,4.0,3.0,2.746,2.16,0.92,0.92,2.14,2.14,0.91,0.88,0.88,0.57,1.03,1.03), +'40x40x3':(40,40,3,4.5,2.0,2.330,1.83,1.09,1.09,3.53,3.53,1.45,1.23,1.23,0.79,1.21,1.21), +'40x40x5':(40,40,5,4.5,3.0,3.755,2.95,1.17,1.17,5.42,5.42,2.25,1.20,1.20,0.77,1.91,1.91), +'50x50x4':(50,50,4,6.5,3.0,3.892,3.06,1.37,1.37,9.06,9.06,3.74,1.53,1.53,0.98,2.49,2.49), +'50x50x6':(50,50,6,6.5,4.5,5.644,4.43,1.44,1.44,12.60,12.60,5.24,1.50,1.50,0.96,3.55,3.55), +'65x65x6':(65,65,6,8.5,4.0,7.527,5.91,1.81,1.81,29.40,29.40,12.10,1.98,1.98,1.27,6.27,6.27), +'65x65x8':(65,65,8,8.5,6.0,9.761,7.66,1.88,1.88,36.80,36.80,15.30,1.94,1.94,1.25,7.97,7.97), +'75x75x6':(75,75,6,8.5,4.0,8.727,6.85,2.06,2.06,46.10,46.10,19.00,2.30,2.30,1.47,8.47,8.47), +'75x75x9':(75,75,9,8.5,6.0,12.690,9.96,2.17,2.17,64.40,64.40,26.70,2.25,2.25,1.45,12.10,12.10), +'75x75x12':(75,75,12,8.5,6.0,16.560,13.00,2.29,2.29,81.90,81.90,34.50,2.22,2.22,1.44,15.70,15.70), +'90x90x7':(90,90,7,10.0,5.0,12.220,9.59,2.46,2.46,93.00,93.00,38.30,2.76,2.76,1.77,14.20,14.20), +'90x90x10':(90,90,10,10.0,7.0,17.000,13.30,2.58,2.58,125.00,125.00,51.60,2.71,2.71,1.74,19.50,19.50), +'90x90x13':(90,90,13,10.0,7.0,21.710,17.00,2.69,2.69,156.00,156.00,65.30,2.68,2.68,1.73,24.80,24.80), +'100x100x7':(100,100,7,10.0,5.0,13.620,10.70,2.71,2.71,129.00,129.00,53.10,3.08,3.08,1.97,17.70,17.70), +'100x100x10':(100,100,10,10.0,7.0,19.000,14.90,2.83,2.83,175.00,175.00,71.90,3.03,3.03,1.95,24.40,24.40), +'100x100x13':(100,100,13,10.0,7.0,24.310,19.10,2.94,2.94,220.00,220.00,91.00,3.00,3.00,1.93,31.10,31.10), +'130x130x9':(130,130,9,12.0,6.0,22.740,17.90,3.53,3.53,366.00,366.00,150.00,4.01,4.01,2.57,38.70,38.70), +'130x130x12':(130,130,12,12.0,8.5,29.760,23.40,3.64,3.64,467.00,467.00,192.00,3.96,3.96,2.54,49.90,49.90), +'130x130x15':(130,130,15,12.0,8.5,36.750,28.80,3.76,3.76,568.00,568.00,234.00,3.93,3.93,2.53,61.50,61.50), +'150x150x12':(150,150,12,14.0,7.0,34.770,27.30,4.14,4.14,740.00,740.00,304.00,4.61,4.61,2.96,68.20,68.20), +'150x150x15':(150,150,15,14.0,10.0,42.740,33.60,4.24,4.24,888.00,888.00,365.00,4.56,4.56,2.92,82.60,82.60), +'150x150x19':(150,150,19,14.0,10.0,53.380,41.90,4.40,4.40,1090.00,1090.00,451.00,4.52,4.52,2.91,103.00,103.00), +'200x200x15':(200,200,15,17.0,12.0,57.750,45.30,5.47,5.47,2180.00,2180.00,891.00,6.14,6.14,3.93,150.00,150.00), +'200x200x20':(200,200,20,17.0,12.0,76.000,59.70,5.67,5.67,2820.00,2820.00,1160.00,6.09,6.09,3.90,197.00,197.00), +'200x200x25':(200,200,25,17.0,12.0,93.750,73.60,5.87,5.87,3420.00,3420.00,1410.00,6.04,6.04,3.88,242.00,242.00), +} + +#シリーズ,寸法(mm),,,,,断面積,質量,重心(cm),,断面2次モーメント(cm4),,,断面2次半径,,,断面係数(cm3), +# A, B, t,r1, r2,(cm2), (kg/m),Cx, Cy, Ix, Iy, 最小Iv,ix, iy, 最小iv,Zx, Zy +angle_ss_unequal={ +'90x75x9':(90,75,9,8.5,6.0,14.040,11.00, 2.75,2.01,109.00,68.10,34.10, 2.78,2.20,1.56, 17.40,12.40), +'100x75x7':(100,75,7,10.0,5.0,11.870,9.32,3.06,1.84,118.00,57.00,30.70,3.15,2.19,1.61,17.00,10.10), +'100x75x10':(100,75,10,10.0,7.0,16.500,13.00,3.18,1.94,159.00,76.10,41.30,3.11,2.15,1.58,23.30,13.70), +'125x75x7':(125,75,7,10.0,5.0,13.620,10.70,4.10,1.64,219.00,60.40,36.40,4.01,2.11,1.63,26.10,10.30), +'125x75x10':(125,75,10,10.0,7.0,19.000,14.90,4.23,1.75,298.00,80.90,49.00,3.96,2.06,1.61,36.10,14.10), +'125x75x13':(125,75,13,10.0,7.0,24.310,19.10,4.35,1.87,376.00,101.00,61.90,3.93,2.04,1.60,46.10,17.90), +'125x90x10':(125,90,10,10.0,7.0,20.500,16.10,3.95,2.22,318.00,138.00,76.10,3.94,2.59,1.93,37.20,20.40), +'125x90x13':(125,90,13,10.0,7.0,26.260,20.60,4.08,2.34,401.00,165.00,87.20,3.91,2.51,1.82,47.50,24.80), +'150x90x9':(150,90,9,12.0,6.0,20.940,16.40,4.96,2.00,484.00,133.00,80.20,4.81,2.52,1.96,48.20,19.00), +'150x90x12':(150,90,12,12.0,8.5,27.360,21.50,5.07,2.10,619.00,168.00,102.00,4.75,2.47,1.93,62.30,24.30), +'150x100x9':(150,100,9,12.0,6.0,21.840,17.10,4.77,2.32,502.00,179.00,101.00,4.79,2.86,2.15,49.00,23.30), +'150x100x12':(150,100,12,12.0,8.5,28.560,22.40,4.88,2.41,642.00,229.00,133.00,4.74,2.83,2.15,63.40,30.20), +'150x100x15':(150,100,15,12.0,8.5,35.250,27.70,5.01,2.53,781.00,276.00,161.00,4.71,2.80,2.14,78.20,37.00), +} + +#ステンレスL形鋼,,,,,,,,,,,,,,,,, +#シリーズ,寸法(mm),,,,,断面積,質量,重心(cm),,断面2次モーメント(cm4),,,断面2次半径,,,断面係数(cm3), +#, A, B, t, r1, r2, (cm2),(kg/m),Cx, Cy, Ix, Iy, 最小Iv,ix, iy, 最小iv,Zx, Zy, +angle_sus_equal={ +'20x20x3':(20, 20, 3, 4.0,2.0,1.127, 0.88, 0.60,0.60,0.39,0.39,0.16, 0.59,0.59,0.38,0.28,0.28), +'25x25x3':(25,25,3,4.0,2.0,1.427,1.12,0.72,0.72,0.80,0.80,0.33,0.75,0.75,0.48,0.45,0.45), +'30x30x3':(30,30,3,4.0,2.0,1.727,1.36,0.85,0.85,1.42,1.42,0.59,0.91,0.91,0.58,0.66,0.66), +'40x40x3':(40,40,3,4.5,2.0,2.330,1.83,1.09,1.09,3.53,3.53,1.45,1.23,1.23,0.79,1.21,1.21), +'35x35x4':(35,35,4,4.5,3.0,2.645,2.10,0.93,0.93,2.91,2.91,0.00,1.05,1.05,0.00,1.17,1.17), +'40x40x4':(40,40,4,4.5,3.0,3.045,2.41,1.05,1.05,4.46,4.46,0.00,1.21,1.21,0.00,1.55,1.55), +'50x50x4':(50,50,4,6.5,3.0,3.892,3.06,1.37,1.37,9.06,9.06,3.74,1.53,1.53,0.98,2.49,2.49), +'40x40x5':(40,40,5,4.5,3.0,3.755,2.98,1.07,1.07,5.42,5.42,0.00,1.20,1.20,0.00,1.91,1.91), +'45x45x5':(45,45,5,6.5,3.0,4.302,3.42,1.18,1.18,7.91,7.91,0.00,1.36,1.36,0.00,2.46,2.46), +'50x50x5':(50,50,5,6.5,3.0,4.802,3.80,1.30,1.30,11.10,11.10,0.00,1.52,1.52,0.00,3.08,3.08), +'30x30x6':(30,30,6,4.0,4.0,3.206,2.53,0.84,0.84,2.41,2.41,0.00,0.87,0.87,0.00,1.17,1.17), +'35x35x6':(35,35,6,4.5,4.0,3.815,3.03,0.96,0.96,4.01,4.01,0.00,1.03,1.03,0.00,1.65,1.65), +'40x40x6':(40,40,6,4.5,4.0,4.415,3.50,1.09,1.09,6.19,6.19,0.00,1.18,1.18,0.00,2.21,2.21), +'50x50x6':(50,50,6,6.5,4.5,5.644,4.43,1.44,1.44,12.60,12.60,5.24,1.50,1.50,0.96,3.55,3.55), +'60x60x6':(60,60,6,8.5,4.0,6.927,5.43,1.56,1.56,22.80,22.80,0.00,1.81,1.81,0.00,5.29,5.29), +'65x65x6':(65,65,6,8.5,4.0,7.527,5.91,1.81,1.81,29.40,29.40,12.10,1.98,1.98,1.27,6.27,6.27), +'75x75x6':(75,75,6,8.5,4.0,8.727,6.85,2.06,2.06,46.10,46.10,19.00,2.30,2.30,1.47,8.47,8.47), +'100x100x6':(100,100,6,10.0,5.0,11.750,9.32,2.55,2.55,112.00,112.00,0.00,3.09,3.09,0.00,15.30,15.30), +'70x70x7':(70,70,7,8.5,5.0,9.358,7.42,1.83,1.83,41.50,41.50,0.00,2.11,2.11,0.00,8.25,8.25), +'65x65x8':(65,65,8,8.5,6.0,9.761,7.66,1.88,1.88,36.80,36.80,15.30,1.94,1.94,1.25,7.97,7.97), +'80x80x8':(80,80,8,8.5,6.0,12.160,9.63,2.11,2.11,71.20,71.20,0.00,2.42,2.42,0.00,12.40,12.40), +'100x100x8':(100,100,8,10.0,6.0,15.420,12.20,2.59,2.59,145.00,145.00,0.00,3.07,3.07,0.00,20.00,20.00), +'50x50x9':(50,50,9,6.5,6.0,8.126,6.43,1.38,1.38,17.30,17.30,0.00,1.46,1.46,0.00,5.00,5.00), +'65x65x9':(65,65,9,8.5,6.0,10.890,8.63,1.75,1.75,40.70,40.70,0.00,1.93,1.93,0.00,8.87,8.87), +'75x75x9':(75,75,9,8.5,6.0,12.690,9.96,2.17,2.17,64.40,64.40,26.70,2.25,2.25,1.45,12.10,12.10), +'90x90x9':(90,90,9,10.0,6.0,15.450,12.30,2.36,2.36,114.00,114.00,0.00,2.72,2.72,0.00,17.60,17.60), +'125x125x9':(125,125,9,10.0,7.0,21.690,17.17,3.24,3.24,321.00,321.00,0.00,3.85,3.85,0.00,35.30,35.30), +'75x75x12':(75,75,12,8.5,6.0,16.560,13.00,2.29,2.29,81.90,81.90,34.50,2.22,2.22,1.44,15.70,15.70), +'100x100x10':(100,100,10,10.0,7.0,19.000,14.90,2.83,2.83,175.00,175.00,71.90,3.03,3.03,1.95,24.40,24.40), +'100x100x12':(100,100,12,10.0,7.0,22.560,17.50,2.66,2.66,205.00,205.00,0.00,3.01,3.01,0.00,28.90,28.90), +'125x125x12':(125,125,12,10.0,7.0,28.560,22.67,3.28,3.28,416.00,416.00,0.00,3.82,3.82,0.00,46.40,46.40), +'90x90x13':(90,90,13,10.0,7.0,21.710,17.00,2.69,2.69,156.00,156.00,65.30,2.68,2.68,1.73,24.80,24.80), +'100x100x13':(100,100,13,10.0,7.0,24.310,19.10,2.94,2.94,220.00,220.00,91.00,3.00,3.00,1.93,31.10,31.10), +'130x130x12':(130,130,12,12.0,8.5,29.760,23.40,3.64,3.64,467.00,467.00,192.00,3.96,3.96,2.54,49.90,49.90), +'125x125x15':(125,125,15,10.0,7.0,35.250,28.00,3.32,3.32,505.00,505.00,0.00,3.79,3.79,0.00,57.00,57.00), +'150x150x15':(150,150,15,12.0,10.0,42.740,33.83,3.95,3.95,888.00,888.00,0.00,4.56,4.56,0.00,82.60,82.60), +} + +#シリーズ,寸法(mm),,,,,,断面積,質量,重心,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +# H, B, t1,t2,r1,r2,(cm2),(kg/m),Cy(cm),Ix, Iy, ix, iy, Zx, Zy +channel_ss={ +'75x40x5':(75,40,5, 7, 8, 4, 8.818,6.92, 1.28, 75.3,12.2,2.92,1.17,20.1,4.47), +'100x50x5':(100,50,5,7.5,8,4,11.92,9.36,1.54,188,26,3.97,1.48,37.6,7.52), +'125x65x6':(125,65,6,8,8,4,17.11,13.4,1.9,424,61.8,4.98,1.9,67.8,13.4), +'150x75x6':(150,75,6.5,10,10,5,23.71,18.6,2.28,861,117,6.03,2.22,115,22.4), +'150x75x9':(150,75,9,12.5,15,7.5,30.59,24,2.31,1050,147,5.86,2.19,140,28.3), +'180x75x7':(180,75,7,10.5,11,5.5,27.2,21.4,2.13,1380,131,7.12,2.19,153,24.3), +'200x80x7.5':(200,80,7.5,11,12,6,31.33,24.6,2.21,1950,168,7.88,2.32,195,29.1), +'200x90x8':(200,90,8,13.5,14,7,38.65,30.3,2.74,2490,277,8.02,2.68,249,44.2), +'250x90x9':(250,90,9,13,14,7,44.07,34.6,2.4,4180,294,9.74,2.58,344,44.5), +'250x90x11':(250,90,11,14.5,17,8.5,51.17,40.2,2.4,4680,329,9.56,2.54,374,49.9), +'300x90x9':(300,90,9,13,14,7,48.57,38.1,2.22,6440,309,11.5,2.52,429,45.7), +'300x90x10':(300,90,10,15.5,19,9.5,55.74,43.8,2.34,7410,360,11.5,2.54,494,54.1), +'300x90x12':(300,90,12,16,19,9.5,61.9,48.6,2.28,7870,379,11.3,2.48,525,56.4), +'380x100x10.5':(380,100,10.5,16,18,9,69.39,54.5,2.41,14500,535,14.5,2.78,763,70.5), +'380x100x13/16.5':(300,100,13,16.5,18,9,78.96,62,2.33,15600,565,14.1,2.67,823,73.6), +'380x100x13/20':(380,100,13,20,24,12,85.71,67.3,2.54,17600,655,14.3,2.76,926,87.8), +} + +#シリーズ,寸法(mm),,,,,,断面積,質量,重心,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +# H, B, t1,t2, r1,r2,(cm2),(kg/m),Cy(cm),Ix,Iy,ix,iy,Zx,Zy +channel_sus={ +'40x20x3':(40,20,3 ,0 ,4 ,2 ,2.271,1.8 ,0.59,0,0,0,0,0,0), +'50x25x3':(50,25,3,0,4,2,2.871,2.283333333,0.72,0,0,0,0,0,0), +'100x50x4':(100,50,4,0,6.5,3,7.823,6.183333333,1.36,0,0,0,0,0,0), +'80x40x5':(80,40,5,0,4.5,3,7.548,5.983333333,1.16,0,0,0,0,0,0), +'100x50x5':(100,50,5,0,6.5,3,9.643,7.65,1.41,0,0,0,0,0,0), +'100x50x6':(100,50,6,0,6.5,4.5,11.37,9.016666667,1.43,0,0,0,0,0,0), +'120x60x6':(120,60,6,0,6.5,4,13.79,10.9,1.69,0,0,0,0,0,0), +'130x65x6':(130,65,6,0,8.5,4,15.12,12,1.8,0,0,0,0,0,0), +'150x75x6':(150,75,6,0,8.5,4,17.52,13.9,2.05,0,0,0,0,0,0), +'150x75x9':(150,75,9,0,8.5,6,25.54,20.16666667,2.16,0,0,0,0,0,0), +'200x100x10':(200,100,10,0,10,7,38.22,30.33333333,2.81,0,0,0,0,0,0), +'220x65x6':(220,65,6,0,8.5,4,20.52,16.3,1.41,0,0,0,0,0,0), +'230x65x6':(230,65,6,0,8.5,4,21.12,16.66666667,1.37,0,0,0,0,0,0), +'250x75x6':(250,75,9,0,8.5,4,23.52,18.66666667,1.6,0,0,0,0,0,0), +'250x75x9':(250,75,9,0,8.5,6,34.54,27.33333333,1.71,0,0,0,0,0,0), +'250x90x9':(250,90,9,0,10,6,37.35,29.66666667,2.18,0,0,0,0,0,0), +'300x90x9':(300,90,9,0,10,6,41.85,33.16666667,1.99,0,0,0,0,0,0), +'300x100x9':(300,100,9,0,10,6,43.63,34.33333333,2.36,0,0,0,0,0,0), +'250x100x10':(250,100,10,0,10,7,43.25,34.33333333,2.61,0,0,0,0,0,0), +'300x90x10':(300,90,10,0,10,7,46.22,36.66666667,2.02,0,0,0,0,0,0), +'300x100x10':(300,100,10,0,10,7,48.22,38.16666667,2.33,0,0,0,0,0,0), +} + +#シリーズ,寸法(mm),,,,,断面積,単位質量,断面2次モーメント,,断面2次半径,,断面係数(cm3), +# H, B, t1,t2,r,(cm2),(kg/m),Ix(cm4),Iy(cm4),ix(cm),iy(cm),Zx, Zy +H_ss_w={ +'100x100x6/8':(100,100,6, 8, 10,21.90,17.2, 383, 134, 4.18, 2.47, 76.5,26.7), +'125x125x6.5/9':(125,125,6.5,9,10,30.31,23.8,847,293,5.29,3.11,136,47), +'150x150x7/10':(150,150,7,10,11,40.14,31.5,1640,563,6.39,3.75,219,75.1), +'175x175x7.5/11':(175,175,7.5,11,12,51.21,40.2,2880,984,7.5,4.38,330,112), +'200x200x8/12':(200,200,8,12,13,63.53,49.9,4720,1600,8.62,5.02,472,160), +'250x250x9/14':(250,250,9,14,16,92.18,72.4,10800,3650,10.8,6.29,867,292), +'300x300x10/15':(300,300,10,15,18,119.80,94.0,20400,6750,13.1,7.51,1360,450), +'300x305x15/15':(300,305,15,15,18,134.80,106.0,21500,7100,12.6,7.26,1440,466), +'350x350x12/19':(350,350,12,19,20,173.90,137.0,40300,13600,15.2,8.84,2300,776), +'400x400x13/21':(400,400,13,21,22,218.70,172.0,66600,22400,17.5,10.1,3330,1120), +} + +#ステンレス 日本製鉄 +#シリーズ,寸法(mm),,,,,断面積,単位質量,断面2次モーメント,,断面2次半径,,断面係数(cm3), +# H, B, t1,t2,r,(cm2),(kg/m),Ix(cm4),Iy(cm4),ix(cm),iy(cm),Zx, Zy +H_sus={ +'100x100x6/8':( 100,100,6, 8, 8,21.59,17.1, 378, 134, 4.18,2.49, 75.6,26.7), +'125x125x6.5/8':( 125,125,6.5, 9, 8,30.00,23.8, 839, 293, 5.29,3.11,136, 47), +'148x100x6/8':( 140,100,6, 9, 8,26.35,20.9, 1000, 150, 6.17,2.39,135, 30.1), +'150x150x7/8':( 150,150,7, 10, 8,39.65,31.4, 1620, 563, 6.40,3.77,216, 75.1), +'200x100x5.5/8':( 200,100,5.5, 8, 8,26.67,21.1, 1810, 134, 8.23,2.24,181, 26.7), +'200x200x8/12':( 200,200,8, 12,13,63.53,50.4, 4720, 1600, 8.62,5.02,472, 160), +'250x250x9/14':( 250,250,9, 14,13,91.43,72.5,10700, 3650,10.8, 6.32,860, 292), + +} + +#シリーズ,寸法(mm),,,,,断面積,単位質量,断面2次モーメント,,断面2次半径,,断面係数(cm3) +# H, B, t1,t2,r, (cm2),(kg/m),Ix(cm4),Iy(cm4),ix(cm),iy(cm),Zx, Zy +H_ss_m={ +'148x100x6/9':(148,100,6, 9, 11,26.84, 21.1, 1020, 151, 6.17, 2.37, 138,30.1), +'194x150x6/9':(194,150,6,9,13,39.01,30.6,2690,507,8.3,3.61,277,67.6), +'244x175x7/11':(244,175,7,11,16,56.24,44.1,6120,984,10.4,4.18,502,113), +'294x200x8/12':(294,200,8,12,18,72.38,56.8,11300,1600,12.5,4.71,771,160), +'340x250x9/14':(340,250,9,14,20,101.50,79.7,21700,3650,14.6,6,1280,292), +'390x300x10/16':(390,300,10,16,22,136.00,107.0,38700,7210,16.9,7.28,1980,481), +'440x300x11/18':(440,300,11,18,24,157.40,124.0,56100,8110,18.9,7.18,2550,541), +'482x300x11/15':(482,300,11,15,26,145.50,114.0,60400,6760,20.4,6.82,2500,451), +'488x300x11/18':(488,383,11,18,26,163.50,128.0,71000,8110,20.8,7.04,2910,541), +'582x300x12/17':(582,300,12,17,28,174.50,137.0,103000,7670,24.3,6.63,3530,511), +'588x300x12/20':(588,300,12,20,28,192.50,151.0,118000,9020,24.8,6.85,4020,601), +'692x300x13/20':(692,300,13,20,28,211.50,166.0,172000,9020,28.6,6.53,4980,602), +'700x300x13/24':(700,300,13,24,28,235.50,185.0,201000,10800,29.3,6.78,5760,722), +'800x300x14/26':(800,300,14,26,28,267.40,210.0,292000,11700,33,6.62,7290,782), +'900x300x16/28':(900,300,16,28,28,309.80,243.0,411000,12600,36.4,6.39,9140,843), +} + +#シリーズ,寸法(mm),,,,,断面積,単位質量,断面2次モーメント,,断面2次半径,,断面係数(cm3) +#H,B,t1,t2,r,(cm2),(kg/m),Ix(cm4),Iy(cm4),ix(cm),iy(cm),Zx,Zy +H_ss_t={ +'100x50x5/7':(100,50,5,7,8,11.85,9.3,187,14.8,3.98,1.12,37.5,5.41), +'125x60x6/8':(125,60,6,8,9,16.84,13.2,413,29.2,4.95,1.32,66.1,9.73), +'150x75x5/7':(150,75,5,7,8,17.85,14.0,666,49.5,6.11,1.66,88.8,13.2), +'175x90x5/8':(175,90,5,8,9,23.04,18.1,1210,97.5,7.26,2.06,139,21.7), +'198x99x4.5/7':(198,99,4.5,7,11,23.18,18.2,1580,114,8.26,2.21,160,23), +'200x100x5.5/8':(200,100,5.5,8,11,27.16,21.3,1840,134,8.24,2.22,184,26.8), +'248x124x5/8':(248,124,5,8,12,32.68,25.7,3540,255,10.4,2.79,285,41.1), +'250x125x6/9':(250,125,6,9,12,37.66,29.6,4050,294,10.4,2.79,324,47), +'298x149x5.5/8':(298,149,5.5,8,13,40.80,32.0,6320,442,12.4,3.29,424,59.3), +'300x150x6.5/9':(300,150,6.5,9,13,46.78,36.7,7210,508,12.4,3.29,481,67.7), +'346x174x6/9':(346,174,6,9,14,52.68,41.4,11100,792,14.5,3.88,641,91), +'350x175x7/11':(350,175,7,11,14,63.14,49.6,13600,984,14.7,3.95,775,112), +'396x199x7/11':(396,199,7,11,16,72.16,56.6,20000,1450,16.7,4.48,1010,145), +'400x200x8/13':(400,200,8,13,16,84.12,66.0,23700,1740,16.8,4.54,1190,174), +'446x199x8/12':(446,199,8,12,18,84.30,66.2,28700,1580,18.5,4.33,1290,159), +'450x200x9/14':(450,200,9,14,18,96.76,76.0,33500,1870,18.6,4.4,1490,187), +'496x199x9/14':(496,199,9,14,20,101.30,79.5,41900,1840,20.3,4.27,1690,185), +'500x200x10/16':(500,200,10,16,20,114.20,89.6,47800,2140,20.5,4.33,1910,214), +'546x199x9/14':(546,199,9,14,22,106.50,83.6,52500,1850,22.2,4.16,1920,186), +'550x200x10/16':(550,200,10,16,22,120.00,94.2,59900,2140,22.3,4.23,2180,214), +'596x199x10/15':(596,199,10,15,22,120.50,94.6,68700,1980,23.9,4.05,2310,199), +'600x200x11/17':(600,200,11,17,22,134.40,106.0,77600,2280,24,4.12,2590,228), +} + +#シリーズ,寸法(mm),,,,,,断面積,質量,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#H,B,t1,t2,r1,r2,(cm2),(kg/m),Ix,Iy,ix,iy,Zx,Zy +I_ss={ +'100x75x5/8':(100,75,5,8,7,3.5,16.43,12.9,281,47.3,4.14,1.7,56.2,12.6), +'125x75x5.5/9.5':(125,75,5.5,9.5,9,4.5,20.45,16.1,538,57.5,5.13,1.68,86,15.3), +'150x75x5.5/9.5':(150,75,5.5,9.5,9,4.5,21.83,17.1,819,57.5,6.12,1.62,109,15.3), +'150x125x8.5/14':(150,125,8.5,14,13,6.5,46.15,36.2,1760,385,6.18,2.89,23.5,61.6), +'180x100x6/10,180':(180,100,6,10,10,5,30.06,23.6,1670,138,7.45,2.14,186,27.5), +'200x100x7/10,200':(200,100,7,10,10,5,33.06,26,2170,138,8.11,2.05,217,27.7), +'200x150x9/16,200':(200,150,9,16,15,7.5,64.16,50.4,4460,753,8.34,3.43,446,100), +'250x125x7.5/12.5':(250,125,7.5,12.5,12,6,48.79,38.3,5180,337,10.3,2.63,414,53.9), +'250x125x10/19':(250,125,10,19,21,10.5,70.73,55.5,7310,538,10.2,2.76,585,86), +'300x150x8/13':(300,150,8,13,12,6,61.58,48.3,9480,588,12.4,3.09,632,78.4), +'300x150x10/18.5':(300,150,10,18.5,19,9.5,83.47,65.5,12700,886,12.3,3.26,849,118), +'300x150x11.5/22':(300,150,11.5,22,23,11.5,97.88,76.8,14700,1080,12.2,3.32,978,143), +'350x150x9/15':(350,150,9,15,13,6.5,74.58,58.5,15200,702,14.3,3.07,870,93.5), +'350x150x12/24':(350,150,12,24,25,12.5,111.1,87.2,22400,1180,14.2,3.26,1280,158), +'400x150x10/18':(400,150,10,18,17,8.5,91.73,72,24100,864,16.2,3.07,1200,115), +'400x150x12.5/25':(400,150,12.5,25,27,13.5,122.1,95.8,31700,1240,16.1,3.18,1580,165), +'450x175x11/20':(450,175,11,20,19,9.5,116.8,91.7,39200,1510,18.3,3.6,1740,173), +'450x175x13/26':(450,175,13,26,27,13.5,146.1,115,48800,2020,18.3,3.72,2170,231), +'600x190x13/25':(600,190,13,25,25,12.5,169.4,133,98400,2460,24.1,3.81,3280,259), +'600x190x16/35':(600,190,16,35,38,19,224.5,176,130000,3540,24.1,3.97,4330,373), +} + +#新日本製鉄,,,,,,,,,,,,, +#川崎製鉄,,,,,,,,,,,,, +#トピー工業,,,,,,,,,,,,, +#シリーズ,寸法(mm),,,,,断面積,単位質量,断面2次モーメント,,断面2次半径,,断面係数(cm3), +#A,B,t1,t2,r,(cm2),(kg/m),Ix(cm4),Iy(cm4),ix(cm),iy(cm),Zx,Zy +CT_ss={ +'50x50x4/6':(50,50,4,6,7,4.970,3.90,9.91,6.3,1.41,1.13,2.61,2.52), +'50x50x5/7':(50,50,5,7,8,5.925,4.65,11.8,7.39,1.41,1.12,3.18,2.96), +'50x100x5/7':(50,100,5,7,8,9.425,7.40,13.9,58.4,1.21,2.49,3.42,11.7), +'50x100x6/8':(50,100,6,8,10,10.950,8.60,16.1,66.9,1.21,2.47,4.03,13.4), +'62.5x60x4.5/6.5':(62.5,60,4.5,6.5,8,6.695,5.26,21.8,11.8,1.81,1.33,4.61,3.93), +'62.5x60x6/8':(62.5,60,6,8,9,8.418,6.61,27.5,14.6,1.81,1.32,5.96,4.87), +'62.5x125x6.5/9':(62.5,125,6.5,9,10,15.160,11.90,35,147,1.52,3.11,6.91,23.5), +'74x74x5/8':(74,74,5,8,9,9.568,7.51,41.5,27.1,2.08,1.68,7.28,7.33), +'75x75x5/7':(75,75,5,7,8,8.925,7.01,42.6,24.7,2.18,1.66,7.46,6.59), +'75x75x6/9':(75,75,6,9,9,11.060,8.68,50.1,31.9,2.13,1.7,8.81,8.5), +'73x99x5/8':(73,99,5,8,11,11.690,9.18,42.7,64.9,1.91,2.36,7.29,13.1), +'74x100x6/9':(74,100,6,9,11,13.420,10.50,51.7,75.3,1.96,2.37,8.84,15.1), +'76x101x7/11':(76,101,7,11,11,16.180,12.70,63.8,94.7,1.99,2.42,10.7,18.8), +'75x150x7/10':(75,150,7,10,11,20.070,15.80,66.4,282,1.82,3.75,10.8,37.6), +'77x151x8/12':(77,151,8,12,11,23.840,18.70,80.4,345,1.84,3.8,12.9,45.7), +'79x152x9/14':(79,152,9,14,11,27.650,21.70,95.7,410,1.86,3.85,15.1,54), +'86.5x89x5/8':(86.5,89,5,8,9,11.390,8.94,68.2,47.1,2.45,2.3,10.1,10.6), +'87.5x90x5/8':(87.5,90,5,8,9,11.520,9.05,70.7,48.7,2.48,2.06,10.4,10.8), +'87.5x90x6/9':(87.5,90,6,9,9,13.160,10.30,82.1,54.9,2.5,2.04,12.2,12.2), +'83.5x124x4.5/7':(83.5,124,4.5,7,12,12.740,10.00,60.3,111,2.18,2.96,8.82,18), +'84.5x125x5.5x8/12':(84.5,125,5.5,12,12,14.830,11.60,74.1,131,2.24,2.97,10.9,20.9), +'86.5x126x6.5/10':(86.5,126,6.5,10,12,18.190,14.30,92.1,167,2.25,3.03,13.3,26.5), +'87.5x126x6.5/11':(87.5,126,6.5,11,12,19.450,15.30,95.8,184,2.22,3.07,13.6,29.2), +'85.5x174x6/9':(85.5,174,6,9,12,20.870,16.40,88.4,395,2.06,4.35,12.4,45.5), +'87.5x175x7.5/11':(87.5,175,7.5,11,12,25.610,20.10,115,492,2.12,4.38,15.9,56.2), +'89.5x176x8.5/13':(89.5,176,8.5,13,12,30.000,23.60,13.6,591,2.13,4.44,18.7,67.2), +'91.5x177x9.5/15':(91.5,177,9.5,15,12,34.400,27.00,160,694,2.15,4.49,21.6,78.4), +'99x99x4.5/7':(99,99,4.5,7,11,11.590,9.10,93.8,56.8,2.84,2.21,12.1,11.5), +'100x100x5.5/8':(100,100,5.5,8,11,13.580,10.70,114,67,2.9,2.22,14.8,13.4), +'102x101x6.5/10':(102,101,6.5,10,11,16.600,13.00,141,86.2,2.92,2.28,18,17.1), +'103x101x6.5/11':(103,101,6.5,11,11,17.610,13.80,147,94.7,2.89,2.32,18.4,18.8), +'96x149x5/8,96':(149,5,8,13,17.050,13.40,103,221,2.46,3.6,13,29.6), +'97x150x6/9,97':(150,6,9,13,19.510,15.30,125,254,2.53,3.61,15.8,33.8), +'99x151x7/11':(99,151,7,11,13,23.500,18.40,152,316,2.54,3.67,18.9,41.9), +'100x151x7/12':(100,151,7,12,13,25.010,19.60,157,345,2.51,3.71,19.3,45.7), +'98x199x6.5/10':(98,199,6.5,10,13,26.350,20.70,145,657,2.35,4.99,17.7,66.1), +'100x200x8/12':(100,200,8,12,13,31.770,24.90,184,801,2.41,5.02,22.3,80.1), +'102x201x9/14':(102,201,9,14,13,36.790,28.90,217,948,2.43,5.08,25.8,94.3), +'104x202x10/16':(104,202,10,16,13,41.850,32.80,251,1100,2.45,5.13,29.5,109), +'100x204x12/12':(100,204,12,12,13,35.770,28.10,256,851,2.67,4.88,32.4,83.4), +} + + +#一般構造用炭素鋼鋼管(STK400),,,,,,,,,, +#シリーズ,寸法(mm),,断面積,質量,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#,外径,厚さ,(cm2),(kg/m),Ix,Iy,ix,iy,Zx,Zy +STK_ss={ +'21.7x2.0':(21.7,2.0,1.238,0.972,0.607,0.607,0.700,0.700,0.560,0.560), +'27.2x2.0':(27.2,2.0,1.583,1.24,1.26,1.26,0.890,0.890,0.930,0.930), +'27.2x2.3':(27.2,2.3,1.799,1.41,1.41,1.41,0.880,0.880,1.03,1.03), +'34.0x2.3':(34.0,2.3,2.291,1.80,2.89,2.89,1.12,1.12,1.70,1.70), +'42.7x2.3':(42.7,2.3,2.919,2.29,5.97,5.97,1.43,1.43,2.80,2.80), +'42.7x2.8':(42.7,2.8,3.510,2.76,7.02,7.02,1.41,1.41,3.29,3.29), +'48.6x2.3':(48.6,2.3,3.345,2.63,8.99,8.99,1.64,1.64,3.70,3.70), +'48.6x2.8':(48.6,2.8,4.029,3.16,10.6,10.6,1.62,1.62,4.36,4.36), +'48.6x3.2':(48.6,3.2,4.564,3.58,11.8,11.8,1.61,1.61,4.86,4.86), +'60.5x2.3':(60.5,2.3,4.205,3.30,17.8,17.8,2.06,2.06,5.90,5.90), +'60.5x3.2':(60.5,3.2,5.760,4.52,23.7,23.7,2.03,2.03,7.84,7.84), +'60.5x4.0':(60.5,4.0,7.100,5.57,28.5,28.5,2.00,2.00,9.41,9.41), +'7635x2.8':(76.5,2.8,6.465,5.08,43.7,43.7,2.60,2.60,11.5,11.5), +'76.3x3.2':(76.5,3.2,7.349,5.77,49.2,49.2,2.59,2.59,12.9,12.9), +'76.3x4.0':(76.5,4.0,9.085,7.13,59.5,59.5,2.56,2.56,15.6,15.6), +'89.1x2.8':(89.1,2.8,7.591,5.96,70.7,70.7,3.05,3.05,15.9,15.9), +'89.1x3.2':(89.1,3.2,8.636,6.78,79.8,79.8,3.04,3.04,17.9,17.9), +'89.1x4.0':(89.1,4.0,10.69,8.39,97.0,97.0,3.01,3.01,21.8,21.8), +'101.6x3.2':(101.6,3.2,9.892,7.76,120,120,3.48,3.48,23.6,23.6), +'101.6x4.0':(101.6,4.0,12.26,9.63,146,146,3.45,3.45,28.8,28.8), +'101.6x5.0':(101.6,5.0,15.17,11.9,177,177,3.42,3.42,34.9,34.9), +'114.3x3.2':(114.3,3.2,11.17,8.77,172,172,3.93,3.93,30.2,30.2), +'114.3x3.6':(114.3,3.6,12.52,9.83,192,192,3.92,3.92,33.6,33.6), +'114.3x4.5':(114.3,4.5,15.52,12.2,234,234,3.89,3.89,41.0,41.0), +'114.3x5.6':(114.3,5.6,19.12,15.0,283,283,3.85,3.85,49.6,49.6), +'139.8x3.6':(139.8,3.6,15.40,12.1,357,357,4.82,4.82,51.1,51.1), +'139.8x4.0':(139.8,4.0,17.07,13.4,394,394,4.80,4.80,56.3,56.3), +'139.8x4.5':(139.8,4.5,19.13,15.0,438,438,4.79,4.79,62.7,62.7), +'139.8x6.0':(139.8,6.0,25.22,19.8,566,566,4.74,4.74,80.9,80.9), +'165.2x4.5':(165.2,4.5,22.72,17.8,734,734,5.68,5.68,88.9,88.9), +'165.2x5.0':(165.2,5.0,25.16,19.8,808,808,5.67,5.67,97.8,97.8), +'165.2x6.0':(165.2,6.0,30.01,23.6,952,952,5.63,5.63,115,115), +'165.2x7.0':(165.2,7.0,34.79,27.3,1090,1090,5.60,5.60,132,132), +'190.7x4.5':(190.7,4.5,26.32,20.7,1140,1140,6.59,6.59,120,120), +'190.7x5.0':(190.7,5.0,29.17,22.9,1260,1260,6.57,6.57,132,132), +'190.7x6.0':(190.7,6.0,34.82,27.3,1490,1490,6.53,6.53,156,156), +'190.7x7.0':(190.7,7.0,40.40,31.7,1710,1710,6.50,6.50,179,179), +'216.3x4.5':(216.3,4.5,29.94,23.5,1680,1680,7.49,7.49,155,155), +'216.3x6.0':(216.3,6.0,39.61,31.1,2190,2190,7.44,7.44,203,203), +'216.3x7.0':(216.3,7.0,46.03,36.1,2520,2520,7.40,7.40,233,233), +'216.3x8.0':(216.3,8.0,52.35,41.1,2840,2840,7.37,7.37,263,263), +} + +#直管 1, 2, 3, 4, 5, 6, 7, 8, 9 10キャップ +# SGP,STPG,STS,STPT,STPA,STPL, SUS-TP +# SGP Sch20, Sch40, Sch60, Sch80, Sch5S, Sch10S,Sch20S,Sch40 SGP +#d0, d2, t, t, t, t, t, t, t, t, t, E, t +tubes={ +'6A':( 10.5, 2.0, 0, 1.7, 2.2, 2.4, 1.00, 1.20, 1.5, 1.7, 0, 2.0), +'8A':( 13.8, 2.3, 0, 2.2, 2.4, 3.0, 1.20, 1.65, 2.0, 2.2, 0, 2.3), +'10A':( 17.3, 2.3, 0, 2.3, 2.8, 3.2, 1.20, 1.65, 2.0, 2.3, 0, 2.3), +'15A':( 21.7, 2.8, 0, 2.8, 3.2, 3.7, 1.65, 2.10, 2.5, 2.8, 25.4, 2.8), +'20A':( 27.2, 2.8, 0, 2.9, 3.4, 3.9, 1.65, 2.10, 2.5, 2.9, 25.4, 2.8), +'25A':( 34.0, 3.2, 0, 3.4, 3.9, 4.5, 1.65, 2.80, 2.5, 3.4, 38.1, 3.2), +'32A':( 42.7, 3.5, 0, 3.6, 4.5, 4.9, 1.65, 2.80, 3.0, 3.6, 38.1, 3.5), +'40A':( 48.6, 3.5, 0, 3.7, 4.5, 5.1, 1.65, 2.80, 3.0, 3.7, 38.1, 3.5), +'50A':( 60.5, 3.8, 3.2, 3.9, 4.9, 5.5, 1.65, 2.80, 3.5, 3.9, 38.1, 3.8), +'65A':( 76.3, 4.2, 4.5, 5.2, 6.0, 7.0, 2.10, 3.00, 3.5, 5.2, 38.1, 4.2), +'80A':( 89.1, 4.2, 4.5, 5.5, 6.6, 7.6, 2.10, 3.00, 4.0, 5.5, 50.8, 4.2), +'100A':( 114.3, 4.5, 4.9, 6.0, 7.1, 8.6, 2.10, 3.00, 4.0, 6.0, 63.5, 4.5), +'125A':( 139.8, 4.5, 5.1, 6.6, 8.1, 9.5, 2.80, 3.40, 5.0, 6.6, 76.2, 4.5), +'150A':( 165.2, 5.0, 5.5, 7.1, 9.3, 11.0, 2.80, 3.40, 5.0, 7.1, 88.9, 5.0), +'200A':( 216.3, 5.8, 6.4, 8.2, 10.3, 12.7, 2.80, 4.00, 6.5, 8.2, 101.6, 5.8), +'250A':( 267.4, 6.6, 6.4, 9.3, 12.7, 15.1, 3.40, 4.00, 6.5, 9.3, 127.0, 6.6), +'300A':( 318.5, 6.9, 6.4, 10.3, 14.3, 17.4, 4.00, 4.50, 6.5, 10.3, 152.4, 6.9), +'350A':( 355.6, 7.9, 7.9, 11.1, 15.1, 19.0, 0.00, 0.00, 0.0, 11.1, 165.1, 7.9), +'400A':( 406.4, 7.9, 7.9, 12.7, 16.7, 21.4, 0.00, 0.00, 0.0, 12.7, 177.8, 7.9), +'450A':( 457.2, 7.9, 7.9, 14.3, 19.0, 23.8, 0.00, 0.00, 0.0, 14.3, 203.2, 7.9), +'500A':( 508.0, 7.9, 9.5, 15.1, 20.6, 26.2, 0.00, 0.00, 0.0, 15.1, 228.6, 7.9), +} + +#平鋼,,,,,,,,,, +#シリーズ,寸法(mm),,断面積,質量,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#t,B,(cm2),(kg/m),Ix,Iy,ix,iy,Zx,Zy +flat_ss={ +'3x13':(3,13,0.390,0.306,0.0549,0.00293,0.375,0.0866,0.0845,0.0195), +'4.5x13':(4.5,13,0.585,0.459,0.0824,0.00987,0.375,0.130,0.127,0.0439), +'6x13':(6,13,0.780,0.612,0.110,0.0234,0.375,0.173,0.169,0.0780), +'3x16':(3,16,0.480,0.377,0.102,0.00360,0.462,0.0866,0.128,0.0240), +'4.5x16':(4.5,16,0.720,0.565,0.154,0.0122,0.462,0.130,0.192,0.0540), +'6x16':(6,16,0.960,0.754,0.205,0.0288,0.462,0.173,0.256,0.0960), +'9x16':(9,16,1.440,1.13,0.307,0.0972,0.462,0.260,0.384,0.216), +'3x19':(3,19,0.570,0.447,0.171,0.00428,0.548,0.0866,0.181,0.0285), +'4.5x19':(4.5,19,0.855,0.671,0.257,0.0144,0.548,0.130,0.271,0.0641), +'6x19':(6,19,1.14,0.895,0.343,0.0342,0.548,0.173,0.361,0.114), +'9x19':(9,19,1.71,1.34,0.514,0.115,0.548,0.260,0.542,0.257), +'3x22':(3,22,0.660,0.518,0.266,0.00495,0.635,0.0866,0.242,0.0330), +'4.5x22':(4.5,22,0.990,0.777,0.399,0.0167,0.635,0.130,0.363,0.0743), +'6x22':(6,22,1.32,1.04,0.532,0.0396,0.635,0.173,0.484,0.132), +'9x22':(9,22,1.98,1.55,0.799,0.134,0.635,0.260,0.726,0.297), +'3x25':(3,25,0.750,0.589,0.391,0.00563,0.722,0.0866,0.313,0.0375), +'4.5x25':(4.5,25,1.13,0.887,0.586,0.0190,0.722,0.130,0.469,0.0844), +'6x25':(6,25,1.50,1.18,0.781,0.0450,0.722,0.173,0.625,0.150), +'9x25':(9,25,2.25,1.77,1.17,0.152,0.722,0.260,0.938,0.338), +'12x25':(12,25,3.00,2.36,1.56,0.360,0.722,0.346,1.25,0.600), +'3x32':(3,32,0.960,0.754,0.819,0.0072,0.924,0.0866,0.512,0.0480), +'4.5x32':(4.5,32,1.44,1.13,1.23,0.0243,0.924,0.130,0.768,0.108), +'6x32':(6,32,1.92,1.51,1.64,0.0576,0.924,0.173,1.02,0.192), +'9x32':(9,32,2.88,2.26,2.46,0.194,0.924,0.260,1.54,0.432), +'12x32':(12,32,3.84,3.01,3.28,0.461,0.924,0.346,2.05,0.768), +'16x32':(16,32,5.12,4.02,4.37,1.09,0.924,0.462,2.73,1.37), +'3x38':(3,38,1.14,0.895,1.37,0.00855,1.10,0.0866,0.722,0.0570), +'4.5x38':(4.5,38,1.71,1.34,2.06,0.0289,1.10,0.130,1.08,0.128), +'6x38':(6,38,2.28,1.79,2.74,0.0684,1.10,0.173,1.44,0.228), +'9x38':(9,38,3.42,2.68,4.12,0.231,1.10,0.260,2.17,0.513), +'12x38':(12,38,4.56,3.58,5.49,0.547,1.10,0.346,2.89,0.912), +'16x38':(16,38,6.08,4.77,7.32,1.30,1.10,0.462,3.85,1.62), +'19x38':(19,38,7.22,5.67,8.69,2.17,1.10,0.548,4.57,2.29), +'3x44':(3,44,1.32,1.04,2.13,0.00990,1.27,0.0866,0.968,0.0660), +'4.5x44':(4.5,44,1.98,1.55,3.19,0.0334,1.27,0.130,1.45,0.149), +'6x44':(6,44,2.64,2.07,4.26,0.0792,1.27,0.173,1.94,0.264), +'9x44':(9,44,3.96,3.11,6.39,0.267,1.27,0.260,2.9,0.594), +'12x44':(12,44,5.28,4.14,8.52,0.634,1.27,0.346,3.87,1.06), +'16x44':(16,44,7.04,5.53,11.4,1.50,1.27,0.462,5.16,1.88), +'19x44':(19,44,8.36,6.56,13.5,2.51,1.27,0.548,6.13,2.65), +'3x50':(3,50,1.50,1.18,3.13,0.0113,1.44,0.0866,1.25,0.0750), +'4.5x50':(4.5,50,2.25,1.77,4.69,0.0380,1.44,0.130,1.88,0.169), +'6x50':(6,50,3.00,2.36,6.25,0.0900,1.44,0.173,2.50,0.300), +'9x50':(9,50,4.50,3.53,9.38,0.304,1.44,0.260,3.75,0.675), +'12x50':(12,50,6.00,4.71,12.5,0.720,1.44,0.346,5.00,1.20), +'16x50':(16,50,8.00,6.28,16.7,1.71,1.44,0.462,6.67,2.13), +'19x50':(19,50,9.50,7.46,19.8,2.86,1.44,0.548,7.92,3.01), +'22x50':(22,50,11.0,8.64,22.9,4.44,1.44,0.635,9.17,4.03), +'25x50':(25,50,12.5,9.81,26.0,6.51,1.44,0.722,10.4,5.21), +'6x65':(6,65,3.90,3.06,13.7,0.117,1.88,0.173,4.23,0.390), +'9x65':(9,65,5.85,4.59,20.6,0.395,1.88,0.260,6.34,0.878), +'12x65':(12,65,7.80,6.12,27.5,0.936,1.88,0.346,8.45,1.56), +'16x65':(16,65,10.4,8.16,36.6,2.22,1.88,0.462,11.3,2.77), +'19x65':(19,65,12.4,9.73,43.5,3.72,1.88,0.548,13.4,3.91), +'22x65':(22,65,14.3,11.2,50.3,5.77,1.88,0.635,15.5,5.24), +'25x65':(25,65,16.3,12.8,57.2,8.46,1.88,0.722,17.6,6.77), +'6x75':(6,75,4.50,3.53,21.1,0.135,2.17,0.173,5.63,0.450), +'9x75':(9,75,6.75,5.30,31.6,0.456,2.17,0.260,8.44,1.01), +'12x75':(12,75,9.00,7.07,42.2,1.08,2.17,0.346,11.3,1.80), +'16x75':(16,75,12.0,9.42,56.3,2.56,2.17,0.462,15.0,3.20), +'19x75':(19,75,14.3,11.2,66.8,4.29,2.17,0.548,17.8,4.51), +'22x75':(22,75,16.5,13.0,77.3,6.66,2.17,0.635,20.6,6.05), +'25x75':(25,75,18.8,14.8,87.9,9.77,2.17,0.722,23.4,7.81), +'6x90':(6,90,5.40,4.24,36.5,0.162,2.60,0.173,8.10,0.540), +'9x90':(9,90,8.10,6.36,54.7,0.547,2.60,0.260,12.2,1.22), +'12x90':(12,90,10.8,8.48,72.9,1.30,2.60,0.346,16.2,2.16), +'16x90':(16,90,14.4,11.3,97.2,3.07,2.60,0.462,21.6,3.84), +'19x90':(19,90,17.1,13.4,115,5.14,2.60,0.548,25.7,5.42), +'22x90':(22,90,19.8,15.5,134,7.99,2.60,0.635,29.7,7.26), +'25x90':(25,90,22.5,17.7,152,11.7,2.60,0.722,33.8,9.38), +'6x100':(6,100,6.00,4.71,50.0,0.180,2.89,0.173,10.0,0.600), +'9x100':(9,100,9.00,7.07,75.0,0.608,2.89,0.260,15.0,1.35), +'12x100':(12,100,12.0,9.42,100,1.44,2.89,0.346,20.0,2.40), +'16x100':(16,100,16.0,12.6,133,3.41,2.89,0.462,26.7,4.27), +'19x100':(19,100,19.0,14.9,158,5.72,2.89,0.548,31.7,6.02), +'22x100':(22,100,22.0,17.3,183,8.87,2.89,0.635,36.7,8.07), +'25x100':(25,100,25.0,19.6,208,13.0,2.89,0.722,41.7,10.4), +'6x125':(6,125,7.50,5.89,97.7,0.225,3.61,0.173,15.6,0.750), +'9x125':(9,125,11.3,8.87,146,0.759,3.61,0.260,23.4,1.69), +'12x125':(12,125,15.0,11.8,195,1.80,3.61,0.346,31.3,3.00), +'16x125':(16,125,20.0,15.7,260,4.27,3.61,0.462,41.7,5.33), +'19x125':(19,125,23.8,18.7,309,7.14,3.61,0.548,49.5,7.52), +'22x125':(22,125,27.5,21.6,358,11.1,3.61,0.635,57.3,10.1), +'25x125':(25,125,31.3,24.6,407,16.3,3.61,0.722,65.1,13.0), +'6x150':(6,150,9.00,7.07,169,0.270,4.33,0.173,22.5,0.900), +'9x150':(9,150,13.5,10.6,253,0.911,4.33,0.260,33.8,2.03), +'12x150':(12,150,18.0,14.1,338,2.16,4.33,0.346,45.0,3.60), +'16x150':(16,150,24.0,18.8,450,5.12,4.33,0.462,60.0,6.40), +'19x150':(19,150,28.5,22.4,534,8.57,4.33,0.548,71.3,9.03), +'22x150':(22,150,33.0,25.9,619,13.3,4.33,0.635,82.5,12.1), +'25x150':(25,150,37.5,29.4,703,19.5,4.33,0.722,93.8,15.6), +} + +#平鋼ステンレス +#シリーズ,寸法(mm),,断面積,質量,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#t,B,(cm2),(kg/m),Ix,Iy,ix,iy,Zx,Zy +flat_sus={ +'2x6':(2,6,2000), +'2x8':(2,8,2000), +'2x9':(2,9,2000), +'2x10':(2,10,2000), +'2x12':(2,12,4000), +'2x15':(2,15,4000), +'2x20':(2,20,4000), +'2x25':(2,25,4000), +'2x30':(2,30,4000), +'2x32':(2,32,4000), +'2x35':(2,35,4000), +'2x38':(2,38,4000), +'2x40':(2,40,4000), +'2x45':(2,45,4000), +'2x50':(2,50,4000), +'3x5':(3,5,3000), +'3x6':(3,6,4000), +'3x7':(3,7,4000), +'3x8':(3,8,4000), +'3x9':(3,9,4000), +'3x10':(3,10,4000), +'3x12':(3,12,4000), +'3x13':(3,13,4000), +'3x15':(3,15,4000), +'3x16':(3,16,4000), +'3x19':(3,19,4000), +'3x20':(3,20,4000), +'3x22':(3,22,4000), +'3x25':(3,25,4000), +'3x30':(3,30,4000), +'3x32':(3,32,4000), +'3x35':(3,35,4000), +'3x38':(3,38,4000), +'3x40':(3,40,4000), +'3x42':(3,42,4000), +'3x45':(3,45,4000), +'3x48':(3,48,4000), +'3x50':(3,50,4000), +'3x60':(3,60,4000), +'3x65':(3,65,4000), +'3x75':(3,75,4000), +'3x90':(3,90,4000), +'3x100':(3,100,4000), +'3x110':(3,110,4000), +'3x120':(3,120,4000), +'3x125':(3,125,4000), +'3x140':(3,140,4000), +'3x150':(3,150,4000), +'4x9':(4,9,4000), +'4x10':(4,10,4000), +'4x11':(4,11,4000), +'4x12':(3,12,4000), +'4x13':(4,13,4000), +'4x15':(4,15,4000), +'4x16':(4,16,4000), +'4x17':(4,17,4000), +'4x19':(4,19,4000), +'4x20':(3,20,4000), +'4x22':(4,22,4000), +'4x25':(4,25,4000), +'4x30':(4,30,4000), +'4x32':(4,32,4000), +'4x35':(4,35,4000), +'4x38':(3,38,4000), +'4x40':(4,40,4000), +'4x45':(4,45,4000), +'4x50':(4,50,4000), +'4x60':(4,60,4000), +'4x65':(4,65,4000), +'4x75':(4,75,4000), +'4x90':(4,90,4000), +'4x100':(4,100,4000), +'5x8':(5,8,4000), +'5x9':(5,9,4000), +'5x10':(5,10,4000), +'5x12':(5,12,4000), +'5x13':(5,13,4000), +'5x15':(5,15,4000), +'5x16':(5,16,4000), +'5x19':(5,19,4000), +'5x20':(5,20,4000), +'5x22':(5,22,4000), +'5x25':(5,25,4000), +'5x30':(5,30,4000), +'5x32':(5,32,4000), +'5x34':(5,34,4000), +'5x35':(5,35,4000), +'5x38':(5,38,4000), +'5x40':(5,40,4000), +'5x45':(5,45,4000), +'5x50':(5,50,4000), +'5x60':(5,60,4000), +'5x65':(5,65,4000), +'5x75':(5,75,4000), +'5x90':(5,90,4000), +'5x100':(5,100,4000), +'5x130':(5,130,4000), +'5x150':(5,150,4000), +'6x9':(6,9,4000), +'6x10':(6,10,4000), +'6x12':(6,12,4000), +'6x13':(6,13,4000), +'6x15':(6,15,4000), +'6x16':(6,16,4000), +'6x18':(6,18,4000), +'6x19':(6,19,4000), +'6x20':(6,20,4000), +'6x22':(6,22,4000), +'6x25':(6,25,4000), +'6x30':(6,30,4000), +'6x32':(6,32,4000), +'6x35':(6,35,4000), +'6x38':(6,38,4000), +'6x40':(6,40,4000), +'6x42':(6,42,4000), +'6x45':(6,45,4000), +'6x48':(6,48,4000), +'6x50':(6,50,4000), +'6x60':(6,60,4000), +'6x65':(6,65,4000), +'6x70':(6,70,4000), +'6x75':(6,75,4000), +'6x90':(6,90,4000), +'6x100':(6,100,4000), +'6x110':(6,110,4000), +'6x120':(6,120,4000), +'6x125':(6,125,4000), +'6x130':(6,130,4000), +'6x140':(6,140,4000), +'6x150':(6,150,4000), +'7x20':(7,20,4000), +'8x10':(8,10,4000), +'8x16':(8,16,4000), +'8x25':(8,25,4000), +'8x30':(8,30,4000), +'8x32':(8,32,4000), +'8x35':(8,35,4000), +'8x38':(8,38,4000), +'8x40':(8,40,4000), +'8x45':(8,45,4000), +'8x50':(8,50,4000), +'8x65':(8,65,4000), +'8x75':(8,75,4000), +'8x100':(8,100,4000), +'9x13':(9,13,4000), +'9x15':(9,15,4000), +'9x16':(9,16,4000), +'9x19':(9,19,4000), +'9x20':(9,20,4000), +'9x22':(9,22,4000), +'9x25':(9,25,4000), +'9x30':(9,30,4000), +'9x32':(9,32,4000), +'9x35':(9,35,4000), +'9x38':(9,38,4000), +'9x40':(9,40,4000), +'9x45':(9,45,4000), +'9x50':(9,50,4000), +'9x55':(9,55,4000), +'9x60':(9,60,4000), +'9x65':(9,65,4000), +'9x75':(9,75,4000), +'9x90':(9,90,4000), +'9x100':(9,100,4000), +'9x125':(9,125,4000), +'9x150':(9,150,4000), +'9x200':(9,200,4000), +'9x250':(9,250,4000), +'9x300':(9,300,4000), +'10x15':(10,15,4000), +'10x19':(10,19,4000), +'10x20':(10,20,4000), +'10x30':(10,30,4000), +'10x32':(10,32,4000), +'10x35':(10,35,4000), +'10x38':(10,38,4000), +'10x40':(10,40,4000), +'10x45':(10,45,4000), +'10x50':(10,50,4000), +'10x60':(10,60,4000), +'10x65':(10,65,4000), +'10x75':(10,75,4000), +'10x100':(10,100,4000), +'10x125':(10,125,4000), +'10x150':(10,150,4000), +'10x200':(10,200,4000), +'10x250':(10,250,4000), +'10x300':(10,300,4000), +'12x14':(12,14,4000), +'12x15':(12,15,4000), +'12x16':(12,16,4000), +'12x19':(12,19,4000), +'12x20':(12,20,4000), +'12x25':(12,25,4000), +'12x28':(12,28,4000), +'12x30':(12,30,4000), +'12x32':(12,32,4000), +'12x35':(12,35,4000), +'12x38':(12,38,4000), +'12x40':(12,40,4000), +'12x50':(12,50,4000), +'12x65':(12,65,4000), +'12x70':(12,70,4000), +'12x75':(12,75,4000), +'12x90':(12,90,4000), +'12x100':(12,100,4000), +'12x125':(12,125,4000), +'12x150':(12,150,4000), +'12x200':(12,200,4000), +'12x250':(12,250,4000), +'12x300':(12,300,4000), +'16x19':(16,19,4000), +'16x20':(16,20,4000), +'16x25':(16,25,4000), +'16x30':(16,30,4000), +'16x32':(16,32,4000), +'16x35':(16,35,4000), +'16x38':(16,38,4000), +'16x40':(16,40,4000), +'16x45':(16,45,4000), +'16x50':(16,50,4000), +'16x65':(16,65,4000), +'16x75':(16,75,4000), +'16x90':(16,90,4000), +'16x100':(16,100,4000), +'16x125':(16,125,4000), +'16x150':(16,150,4000), +'16x200':(16,200,4000), +'16x250':(16,250,4000), +'16x300':(16,300,4000), +'19x25':(19,25,4000), +'19x30':(19,30,4000), +'19x35':(19,35,4000), +'19x38':(19,38,4000), +'19x40':(19,40,4000), +'19x45':(19,45,4000), +'19x50':(19,50,4000), +'19x55':(19,55,4000), +'19x65':(19,65,4000), +'19x75':(19,75,4000), +'19x90':(19,90,4000), +'19x100':(19,100,4000), +'19x125':(19,125,4000), +'19x150':(19,150,4000), +'19x65':(19,65,4000), +'19x75':(19,75,4000), +'19x90':(19,90,4000), +'19x100':(19,100,4000), +'19x125':(19,125,4000), +'19x150':(19,150,4000), +'19x200':(19,200,4000), +'19x250':(19,250,4000), +'19x300':(19,90,4000), +'20x70':(20,70,4000), +'22x25':(22,25,4000), +'22x30':(22,30,4000), +'22x32':(22,32,4000), +'22x35':(22,35,4000), +'22x38':(22,38,4000), +'22x40':(22,40,4000), +'22x45':(22,45,4000), +'22x50':(22,50,4000), +'22x65':(22,65,4000), +'22x75':(22,75,4000), +'22x90':(22,90,4000), +'22x100':(22,100,4000), +'22x125':(22,125,4000), +'22x150':(22,150,4000), +'22x200':(22,200,4000), +'22x250':(22,250,4000), +'22x300':(22,300,4000), +'22x100':(22,100,4000), +'25x32':(25,32,4000), +'25x38':(25,38,4000), +'25x40':(25,40,4000), +'25x50':(25,50,4000), +'25x60':(25,60,4000), +'25x65':(25,65,4000), +'25x75':(25,75,4000), +'25x100':(25,100,4000), +'25x125':(25,125,4000), +'25x150':(25,150,4000), +'25x200':(25,200,4000), +'25x250':(25,250,4000), +'25x300':(25,300,4000), +'30x50':(30,50,4000), +'30x55':(30,55,4000), +'30x65':(30,65,4000), +'30x75':(30,75,4000), +'30x100':(30,100,4000), +'30x125':(30,125,4000), +'30x150':(30,150,4000), +'30x200':(30,200,4000), +'30x250':(30,250,4000), +'30x300':(30,300,4000), +'35x50':(35,50,4000), +'35x65':(35,65,4000), +'35x75':(35,75,4000), +'35x100':(35,100,4000), +'35x125':(35,125,4000), +'35x150':(35,150,4000), +'40x50':(40,50,4000), +'40x65':(40,65,4000), +'40x75':(40,75,4000), +'40x100':(40,100,4000), +'40x125':(40,125,4000), +'40x150':(40,150,4000), +'50x65':(50,65,4000), +'50x75':(50,75,4000), +'50x100':(50,100,4000), +'50x125':(50,125,4000), +'50x150':(50,150,4000), +'60x75':(60,75,4000), +'60x100':(60,100,4000), +'60x125':(60,125,4000), +'60x150':(60,150,4000), +'65x75':(65,75,4000), +'70x100':(70,100,4000), +'70x125':(70,125,4000), +'70x150':(70,150,4000), +'80x100':(80,100,4000), +'80x125':(80,125,4000), +'80x150':(80,150,4000), +'90x125':(90,125,4000), +'90x150':(90,150,4000), +'100x125':(100,125,4000), +'100x150':(100,150,4000), +} + +#軽量L形鋼 +#シリーズ,寸法(mm),,,,,断面積,質量,重心(cm),,断面2次モーメント(cm4),,,断面2次半径,,,断面係数(cm3), +#A,B,t,r1,r2,(cm2),(kg/m),Cx,Cy,Ix,Iy,最小Iv,ix,iy,最小iv,Zx,Zy +LW_angle_ss={ +'25x25x2.3':(25,25,2.3,6000), +'30x30x2.3':(30,30,2.3,6000), +'30x30x3.2':(30,30,3.2,6000), +'40x40x2.8':(40,40,2.8,6000), +'40x40x3.2':(40,40,3.2,6000), +'42x42x2.3':(42,42,2.3,6000), +'50x50x2.3':(50,50,2.3,6000), +'50x50x3.2':(50,50,3.2,6000), +'60x60x2.3':(60,60,2.3,6000), +'60x60x3.2':(60,60,3.2,6000), +'75x30x3.2':(75,30,3.2,6000), +} + +#軽量L形鋼ステンレス +#シリーズ,寸法(mm),,,,,断面積,質量,重心(cm),,断面2次モーメント(cm4),,,断面2次半径,,,断面係数(cm3), +#A,B,t,r1,r2,(cm2),(kg/m),Cx,Cy,Ix,Iy,最小Iv,ix,iy,最小iv,Zx,Zy +LW_angle_sus={ +'20x20x2':(20,20,2,4000), +'25x25x2':(25,25,2,4000), +'30x30x2':(30,30,2,4000), +'40x40x2':(40,40,2,4000), +'15x15x3':(15,15,3,4000), +'20x20x3':(20,20,3,4000), +'25x25x3':(25,25,3,4000), +'30x30x3':(30,30,3,4000), +'40x40x3':(40,40,3,6000), +'50x50x3':(50,50,3,6000), +'50x50x4':(50,50,4,6000), +'40x40x5':(40,40,5,6000), +'50x50x5':(50,50,5,6000), +'75x75x5':(75,75,5,6000), +'50x50x6':(50,50,6,6000), +'60x60x6':(60,60,6,6000), +'65x65x6':(65,65,6,6000), +'75x75x6':(75,75,6,6000), +} + +#軽量溝形鋼,,,,,,,,,,,, +#シリーズ,寸法(mm),,,断面積,質量,重心,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#H,B,t,(cm2),(kg/m),Cy(cm),Ix,Iy,ix,iy,Zx,Zy +LW_channel_ss={ +'40x40x2.3':(40,40,2.3,2.586,2.03,1.46,7.13,3.54,1.66,1.17,3.57,1.39), +'40x40x3.2':(40,40,3.2,3.503,2.75,1.51,9.21,5.72,1.62,1.28,4.6,2.3), +'60x30x1.6':(60,30,1.6,1.836,1.44,0.82,10.3,1.64,2.37,0.95,3.45,0.75), +'60x30x2.3':(60,30,2.3,2.586,2.03,0.86,14.2,2.27,2.34,0.94,4.72,1.06), +'80x40x2.3':(80,40,2.3,3.506,2.75,1.11,34.9,5.56,3.16,1.26,8.73,1.92), +'100x40x2.3':(100,40,2.3,3.966,3.11,0.99,58.9,5.96,3.85,1.23,11.8,1.98), +'100x40x3.2':(100,40,3.2,5.423,4.26,1.03,78.6,7.99,3.81,1.21,15.7,2.69), +'100x50x2.3':(100,50,2.3,4.426,3.47,1.36,69.9,11.1,3.97,1.58,14,3.04), +'100x50x3.2':(100,50,3.2,6.063,4.76,1.4,93.6,14.9,3.93,1.57,18.7,4.15), +'120x40x3.2':(120,40,3.2,6.063,4.79,0.94,122,8.43,4.48,1.18,20.3,2.75), +'150x50x3.2':(150,50,3.2,7.663,6.02,1.14,244,16.9,5.64,1.48,32.5,4.37), +'150x50x4.5':(150,50,4.5,10.58,8.31,1.2,329,22.8,5.58,1.47,43.9,5.99), +'150x75x4.5':(150,75,4.5,12.83,10.1,2.08,448,71.4,5.91,2.36,59.8,13.2), +'200x50x3.2':(200,50,3.2,9.263,7.27,0.97,490,18.2,7.28,1.4,49,4.51), +'200x50x4.5':(200,50,4.5,12.83,10.1,1.03,666,24.6,7.2,1.38,66.6,6.19), +'200x75x6':(200,75,6,19.82,15.6,1.87,1130,101,7.56,2.25,113,17.9), +'250x50x4':(250,50,4,13.47,10.6,0.88,1050,23.3,8.81,1.32,83.7,5.66), +'250x50x4.5':(250,50,4.5,15.08,11.8,0.91,1160,25.9,8.78,1.31,93,6.31), +'250x75x4.5':(250,75,4.5,17.33,13.6,1.6,1500,82.9,9.31,2.19,120,14), +'250x75x6':(250,75,6,22.82,17.9,1.66,1940,107,9.23,2.17,155,18.4), +'300x50x4':(300,50,4,15.47,12.1,0.8,1660,24.1,10.4,1.25,111,5.74), +} + +#軽量溝形鋼ステンレス +#シリーズ,寸法(mm),,,断面積,質量,重心,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#H,B,t,(cm2),(kg/m),Cy(cm),Ix,Iy,ix,iy,Zx,Zy +LW_channel_sus={ +'100x50x2':(100,50,2), +'120x60x2':(120,60,2), +'50x25x3':(50,25,3), +'80x40x3':(80,40,3), +'100x50x3':(100,50,3), +'100x50x4':(100,50,4), +'100x50x5':(100,50,5), +} + +#ステンレスリップ溝形鋼,,,,,,,,,,,,, +#アラヤ特殊金属,,,,,,,,,,,,, +#シリーズ,寸法(mm),,,,断面積,質量,重心,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#H,A,C,t,(cm2),(kg/m),Cy(cm),Ix,Iy,ix,iy,Zx,Zy +Rip_channel_sus={ +'40x20x8x2':(40,20,8,2,1.73,1.38 ,0,4.09,0.91,1.54,0.73,2.04,0.73), +'52x20x8x2':(50,20,8,2,1.97,1.58 ,0,7.69,1,1.98,0.71,2.96,0.75), +'60x20x8x2':(60,20,8,2,2.13,1.70 ,0,10.86,1.05,2.26,0.7,3.62,0.76), +'70x20x8x2':(70,20,8,2,2.33,1.87 ,0,15.8,1.1,2.61,0.69,4.51,0.77), +'60x30x10x2':(60,30,10,2,2.61,2.08 ,0,14.65,3.19,2.37,1.1,4.88,1.65), +'80x40x14.5x2':(80,40,14.5,2,3.59,2.87 ,0,36.35,8.29,3.18,1.52,9.09,3.26), +'75x45x15x2':(75,45,15,2,3.69,2.97 ,0,33.93,10.73,3.03,1.7,9.05,3.85), +'100x50x19.5x2':(100,50,19.5,2,4.59,3.67 ,0,73.09,17.24,3.99,1.94,14.62,5.5), +'120x60x19.5x2':(120,60,19.5,2,5.39,4.30 ,0,125.79,28.29,4.83,2.29,20.97,7.31), +'60x30x10x4,60':(30,10,4,4.82,3.82 ,0,24.92,4.98,2.27,1.01,8.3,2.58), +'80x40x15x4,80':(40,15,4,6.82,5.42 ,0,64.86,14.09,3.08,1.43,16.21,5.57), +'100x50x20x4':(100,50,20,4,8.82,7.00 ,0,133.61,30.38,3.39,1.85,26.72,9.72), +} + +#リップ溝形鋼,,,,,,,,,,,,, +#シリーズ,寸法(mm),,,,断面積,質量,重心,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#H,A,C,t,(cm2),(kg/m),Cy(cm),Ix,Iy,ix,iy,Zx,Zy +Rip_channel_ss={ +'60x30x10x1.6':(60,30,10,1.6,2.072,1.63,1.06,11.6,2.56,2.37,1.11,3.88,1.32), +'60x30x10x2.3':(60,30,10,2.3,2.872,2.25,1.06,15.6,3.32,2.33,1.07,5.2,1.71), +'75x45x15x1.6':(75,45,15,1.6,2.952,2.32,1.72,27.1,8.71,3.03,1.72,7.24,3.13), +'75x45x15x2.3':(75,45,15,2.3,4.137,3.25,1.72,37.1,11.8,3,1.69,9.9,4.24), +'100x50x20x1.6':(100,50,20,1.6,3.672,2.88,1.87,58.4,14,3.99,1.95,11.7,4.47), +'100x50x20x2.3':(100,50,20,2.3,5.172,4.06,1.86,80.7,19,3.95,1.92,16.1,6.06), +'100x50x20x3.2':(100,50,20,3.2,7.007,5.5,1.86,107,24.5,3.9,1.87,21.3,7.81), +'125x50x20x2.3':(125,50,20,2.3,5.747,4.51,1.69,137,20.6,4.88,1.89,21.9,6.22), +'125x50x20x3.2':(125,50,20,3.2,7.807,6.13,1.68,181,26.6,4.82,1.85,29,8.02), +'150x50x20x2.3':(150,50,20,2.3,6.322,4.96,1.55,210,21.9,5.77,1.86,28,6.33), +'150x50x20x3.2':(150,50,20,3.2,8.607,6.76,1.54,280,28.3,5.71,1.81,37.4,8.19), +'150x65x20x3.2':(150,65,20,3.2,9.567,7.51,2.11,332,53.8,5.89,2.37,44.3,12.2), +'200x75x20x3.2':(200,75,20,3.2,11.81,9.27,2.19,716,84.1,7.79,2.67,71.6,15.8), +} + +#角形鋼管JIS G 3466 東洋特殊興業 +#シリーズ,寸法(mm),,,断面積,質量,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#A,B,t,(cm2),(kg/m),Ix,Iy,ix,iy,Zx,Zy +square_pipe_ss={ +'9x9x1.0':(9,9,1.0), +'10x10x1.0':(10,10,1.0), +'11.5x11.5x1.6':(11.5,11.5,1.6), +'15x15x0.8':(15,15,0.8), +'15x15x1.2':(15,15,1.2), +'15x15x2.0':(15,15,2.0), +'20x20x1.6':(20,20,1.6), +'20x20x2.3':(20,20,2.3), +'21x21x2.3':(21,21,2.3), +'25x25x2.0':(25,25,2.0), +'30x30x2.3':(30,30,2.3), +'30x30x3.2':(30,30,3.2), +'30x30x4.5':(30,30,4.5), +'31x31x2.3':(31,31,2.3), +'31x31x3.2':(31,31,3.2), +'31x31x4.5':(31,31,4.5), +'32x32x2.3':(32,32,2.3), +'35x35x3.2':(35,35,3.2), +'35x35x3.5':(35,35,3.5), +'35x35x4.5':(35,35,4.5), +'38x38x2.3':(38,38,2.3), +'39.4x39.4x3.5':(39.4,39.4,3.5), +'39.6x39.6x4.5':(39.6,39.6,4.5), +'40x40x1.6':(40,40,1.6), +'40x40x2.3':(40,40,2.3), +'50x50x1.6':(50,50,1.6), +'50x50x2.3':(50,50,2.3), +'50x50x3.2':(50,50,3.2), +'60x60x1.6':(60,60,1.6), +'60x60x2.3':(60,60,2.3), +'60x60x3.2':(60,60,3.2), +'75x75x2.3':(75,75,2.3), +'75x75x3.2':(75,75,3.2), +'100x100x2.3':(100,100,2.3), +'100x100x3.2':(100,100,3.2), +'100x100x4':(100,100,4), +'100x100x4.5':(100,100,4.5), +'125x125x3.2':(125,125,3.2), +'125x125x4.5':(125,125,4.5), +'125x125x5':(125,125,5), +'125x125x6':(125,125,6), +'150x150x4.5':(150,150,4.5), +'150x150x5':(150,150,5), +'150x150x6':(150,150,6), +'200x200x6':(200,200,6), +'200x200x8':(200,200,8), +'200x200x9':(200,200,9), +'200x200x12':(200,200,12), +'25x250x5':(250,250,5), +'250x250x6':(250,250,6), +'250x250x8':(250,250,8), +'250x250x9':(250,250,9), +'250x250x12':(250,250,12), +'300x300x4.5':(300,300,4.5), +'300x300x6':(300,300,6), +'300x300x9':(300,300,9), +'300x300x12':(300,300,12), +'350x350x9':(350,350,9), +'350x350x12':(350,350,12), +} + +#角形鋼管sus 新家工業 +#シリーズ,寸法(mm),,,断面積,質量,断面2次モーメント(cm4),,断面2次半径(cm),,断面係数(cm3), +#A,B,t,(cm2),(kg/m),Ix,Iy,ix,iy,Zx,Zy +square_pipe_sus={ +'30x30x3':(30,30,3), +'40x40x3':(40,40,3), +'40x40x4':(40,40,4), +'40x40x5':(40,40,5), +'50x50x3':(50,50,3), +'50x50x4':(50,50,4), +'50x50x5':(50,50,5), +'60x60x3':(60,60,3), +'60x60x4':(60,60,4), +'60x60x5':(60,60,5), +'75x75x3':(75,75,3), +'75x75x4':(75,75,4), +'75x75x5':(75,75,5), +'75x75x6':(75,75,6), +'80x80x3':(80,80,3), +'80x80x4':(80,80,4), +'80x80x5':(80,80,5), +'80x80x6':(80,80,6), +'90x90x3':(90,90,3), +'90x90x4':(90,90,4), +'90x90x5':(90,90,5), +'90x90x6':(90,90,6), +'100x100x3':(100,100,3), +'100x100x4':(100,100,4), +'100x100x4':(100,100,4), +'100x100x5':(100,100,5), +'100x100x6':(100,100,6), +'100x100x9':(100,100,9), +'100x100x12':(100,100,12), +'120x120x3':(120,120,3), +'120x120x4':(120,120,4), +'120x120x5':(120,120,5), +'120x120x6':(120,120,6), +'120x120x9':(120,120,9), +'125x125x3':(125,125,3), +'125x125x4':(125,125,4), +'125x125x5':(125,125,5), +'125x125x6':(125,125,6), +'125x125x9':(125,125,9), +'125x125x12':(125,125,12), +'150x150x3':(150,150,3), +'150x150x4':(150,150,4), +'150x150x5':(150,150,5), +'150x150x6':(150,150,6), +'150x150x9':(150,150,9), +'150x150x12':(150,150,12), +'175x175x3':(175,175,3), +'175x175x4':(175,175,4), +'175x175x5':(175,175,5), +'175x175x6':(175,175,6), +'175x175x9':(175,175,9), +'175x175x12':(175,175,12), +'200x200x3':(200,200,3), +'200x200x4':(200,200,4), +'200x200x5':(200,200,5), +'200x200x6':(200,200,6), +'200x200x8':(200,200,8), +'200x200x9':(200,200,9), +'200x200x12':(200,200,12), +'250x250x4':(250,250,4), +'250x250x5':(250,250,5), +'250x250x6':(250,250,6), +'250x250x9':(250,250,9), +'250x250x12':(250,250,12), +'300x300x4':(300,300,4), +'300x300x6':(300,300,6), +'300x300x9':(300,300,9), +'300x300x12':(300,300,12), +'350x350x9':(350,350,9), +'350x350x12':(350,350,12), +'400x400x6':(400,400,6), +'400x400x9':(400,400,9), +'400x400x12':(400,400,12), +} \ No newline at end of file diff --git a/dialogz/fbranch.ui b/dialogz/fbranch.ui index 9bf5ee8..cd83624 100644 --- a/dialogz/fbranch.ui +++ b/dialogz/fbranch.ui @@ -7,7 +7,7 @@ 0 0 290 - 550 + 588
@@ -20,39 +20,6 @@ FrameBranch Manager - - - - - 80 - 0 - - - - Qt::AlignCenter - - - <degrees> - - - - - - - Qt::AlignCenter - - - offset tail - - - - - - - Trim/Extend - - - @@ -60,68 +27,53 @@ - - - - ChangeProfile + + + + -99 + + + Qt::Horizontal - - - - - 80 - 0 - - - - Qt::AlignCenter - - - <name> + + + + Generate planes - - - - -99 - + + - Qt::Horizontal + Qt::Vertical - + + + 20 + 40 + + + - - + + - <no item selected> - - - Qt::AlignCenter + RemoveBeams - - - - - 0 - 0 - - + + - Redraw + Cut Miters - - - @@ -132,27 +84,39 @@ - - - - -99 + + + + <no target selected> - - Qt::Horizontal + + Qt::AlignCenter - - - - RemoveBeams + + + + + 80 + 0 + + + + Qt::AlignCenter + + + <degrees> - - + + + + + - Get targets + Add single @@ -176,20 +140,50 @@ - - + + - <no target selected> + Get targets + + + + Qt::AlignCenter + + offset tail + - - + + + + + 0 + 0 + + - Generate planes + Redraw + + + + + + + -99 + + + Qt::Horizontal + + + + + + + Trim/Extend @@ -218,30 +212,36 @@ - - - - Qt::Vertical + + + + <no item selected> - - - 20 - 40 - + + Qt::AlignCenter - + - - + + - Add single + ChangeProfile - - - - Cut Miters + + + + + 80 + 0 + + + + Qt::AlignCenter + + + <name> diff --git a/fFeatures.py b/fFeatures.py index a10d87a..6787e6b 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -6,7 +6,7 @@ __license__ = "LGPL 3" import csv -from math import degrees, frexp +from math import degrees, frexp, sqrt, cos, radians, sin, tan from os import listdir from os.path import abspath, dirname, join @@ -34,6 +34,7 @@ import pCmd from quetzal_config import FREECADVERSION from uCmd import label3D +import ShpstData translate = FreeCAD.Qt.translate QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP @@ -1272,9 +1273,7 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings from FreeCAD import Vector -def doProfile( - typeS="RH", label="Square", dims=[50, 100, 5] -): # rearrange args in a better mnemonic way +def doProfile(typeS="RH", label="Square", dims=[50, 100, 5]): # rearrange args in a better mnemonic way "doProfile(typeS, label, dims)" if typeS in ["RH", "R", "H", "U", "L", "T", "Z", "omega", "circle"]: profile = [0, "SECTION", label, typeS] + dims # for py2.6 versions @@ -1285,13 +1284,15 @@ def doProfile( elif profile[3] == "R": _ProfileR(obj, profile) elif profile[3] == "U": - _ProfileU(obj, profile) + # _ProfileU(obj, profile) + _ProfileChannel(obj,profile) elif profile[3] == "T": _ProfileT(obj, profile) elif profile[3] == "H": _ProfileH(obj, profile) elif profile[3] == "L": - _ProfileL(obj, profile) + # _ProfileL(obj, profile) + _ProfileAngle(obj,profile) elif profile[3] == "Z": _ProfileZ(obj, profile) elif profile[3] == "omega": @@ -1345,6 +1346,70 @@ def pointsL(H, W, t1, t2): return [p1, p2, p3, p4, p5, p6, p1] +def pointsLWithRound(A, B, t, r1, r2): + x1=r2*(1-1/sqrt(2)) + x2=r2-x1 + y1=r1*(1-1/sqrt(2)) + y2=r1-y1 + y3=A-(r2+r1+t) + x=t-r2 + p1=Vector(0,0,0) + p2=Vector(0,0,A) + p3=Vector(x,0,A) + p4=Vector(t-x1,0,A-x1) + p5=Vector(t,0,A-r2) + p6=Vector(t,0,A-(r2+y3)) + p7=Vector(t+y1,0,t+y1) + p8=Vector(t+r1,0,t) + p9=Vector(B-r2,0,t) + p10=Vector(B-x1,0,t-x1) + p11=Vector(B,0,t-r2) + p12=Vector(B,0,0) + return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p1] + + +def pointsChannelWithRound(H, B, t1, t2, r1, r2, Cy, s0): + s5=radians(s0) + s45=radians(45) + y1=r2*cos(s45) + y2=r2*cos(s5) + y3=r1*cos(s5) + x1=r2*(1-cos(s45)) + x2=r2*sin(s5) + x30=r2-x2 + x3=r1*sin(s5) + x4=r1*cos(s45) + x5=r1-x4 + x40=r1+x3 + x6=B-(x30+x40+t1) + y6=x6*tan(s5) + x7=Cy-(t1+x40) + x8=x6-x7 + y7=x8*tan(s5) + y8=t2-y7 + y4=y8-y2 + y10=y4+y2+y6 + y11=y4+y2+y6+x5 + y12=y4+y2+y6+x5+x4 + p1=Vector(0,0,0) + p2=Vector(0,0,H) + p3=Vector(B,0,H) + p4=Vector(B,0,H-y4) + p5=Vector(B-x1,0,H-(y4+y1)) + p6=Vector(B-x30,0,H-(y4+y2)) + p7=Vector(t1+x40,0,H-y10) + p8=Vector(t1+x5,0,H-y11) + p9=Vector(t1,0,H-y12) + p10=Vector(t1,0,y12) + p11=Vector(t1+x5,0,y11) + p12=Vector(t1+x40,0,y10) + p13=Vector(B-x30,0,y4+y2) + p14=Vector(B-x1,0,y4+y1) + p15=Vector(B,0,y4) + p16=Vector(B,0,0) + return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p1 ] + + def pointsOmega(H, W, D, t1, t2, t3): p1 = Vector(0, 0, 0) p2 = Vector(W, 0, 0) @@ -1571,6 +1636,143 @@ def execute(self, obj): obj.Shape = drawAndCenter(pointsL(H, W, t1, t2)) +class _ProfileAngle(_Profile): + def __init__(self, obj, profile): + self.label=obj.Name + self.size=FreeCAD.ActiveDocument.getObject(self.label).size + self.standard=FreeCAD.ActiveDocument.getObject(self.label).standard + self.Solid=FreeCAD.ActiveDocument.getObject(self.label).Solid + self.g0=FreeCAD.ActiveDocument.getObject(self.label).g0*1000 + if self.standard=='SS_Equal': + self.sa=ShpstData.angle_ss_equal[self.size] + elif self.standard=='SS_Unequal': + self.sa=ShpstData.angle_ss_unequal[self.size] + elif self.standard=='SUS_Equal': + self.sa=ShpstData.angle_sus_equal[self.size] + obj.addProperty( + "App::PropertyString", + "FType", + "Profile", + QT_TRANSLATE_NOOP("App::Property", "Type of section"), + ).FType = "L" + obj.addProperty( + "App::PropertyLength", + "A", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), + ).A = float(self.sa[0]) + obj.addProperty( + "App::PropertyLength", + "B", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), + ).B = float(self.sa[1]) + obj.addProperty( + "App::PropertyLength", + "t", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Thickness of the webs"), + ).t = float(self.sa[2]) + obj.addProperty( + "App::PropertyLength", + "r1", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Radius of cornes r1"), + ).r1 = float(self.sa[3]) + obj.addProperty( + "App::PropertyLength", + "r2", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Radius of cornes r2"), + ).r2 = float(self.sa[4]) + _Profile.__init__(self, obj, profile) + return + + def execute(self, obj): + A=float(self.sa[0]) + B=float(self.sa[1]) + t=float(self.sa[2]) + r1=float(self.sa[3]) + r2=float(self.sa[4]) + cx=float(self.sa[7])*10 + cy=float(self.sa[8])*10 + L=FreeCAD.ActiveDocument.getObject(self.label).L + L=float(L) + obj.A=A + obj.B=B + obj.Shape=drawAndCenter(pointsLWithRound(A, B, t, r1, r2)) + + +class _ProfileChannel(_Profile): + def __init__(self, obj, profile): + self.label=obj.Name + self.size=FreeCAD.ActiveDocument.getObject(self.label).size + self.standard=FreeCAD.ActiveDocument.getObject(self.label).standard + Solid=FreeCAD.ActiveDocument.getObject(self.label).Solid + g0=FreeCAD.ActiveDocument.getObject(self.label).g0*1000 + if self.standard=='SS': + self.sa=ShpstData.channel_ss[self.size] + self.s0=5 + self.t2=float(self.sa[3]) + elif self.standard=='SUS': + self.self.sa=ShpstData.channel_sus[self.size] + self.s0=0 + self.t2=float(self.sa[2]) + obj.addProperty( + "App::PropertyString", + "FType", + "Profile", + QT_TRANSLATE_NOOP("App::Property", "Type of section"), + ).FType = "C" + obj.addProperty( + "App::PropertyLength", + "H", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), + ).H = float(self.sa[0]) + obj.addProperty( + "App::PropertyLength", + "B", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), + ).B = float(self.sa[1]) + obj.addProperty( + "App::PropertyLength", + "t1", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Thickness of the webs"), + ).t1 = float(self.sa[2]) + obj.addProperty( + "App::PropertyLength", + "r1", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Radius of cornes r1"), + ).r1 = float(self.sa[3]) + obj.addProperty( + "App::PropertyLength", + "r2", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Radius of cornes r2"), + ).r2 = float(self.sa[4]) + _Profile.__init__(self, obj, profile) + return + + def execute(self,obj): + H=float(self.sa[0]) + B=float(self.sa[1]) + t1=float(self.sa[2]) + #t2=float(self.sa[3]) + r1=float(self.sa[4]) + r2=float(self.sa[5]) + Cy=float(self.sa[8])*10 + L=FreeCAD.ActiveDocument.getObject(self.label).L + L=float(L) + Solid=FreeCAD.ActiveDocument.getObject(self.label).Solid + obj.H=H + obj.B=B + obj.Shape=drawAndCenter(pointsChannelWithRound(H, B, t1, self.t2, r1, r2, Cy ,self.s0)) + + class _ProfileT(_Profile): """A parametric T beam profile. Profile data: [width, height, web thickness]""" diff --git a/pCmd.py b/pCmd.py index 8c8a286..f2846f4 100644 --- a/pCmd.py +++ b/pCmd.py @@ -435,6 +435,10 @@ def makeFlange(propList=[], pos=None, Z=None): Default is "DN50 (PN16)" pos (vector): position of insertion; default = 0,0,0 Z (vector): orientation: default = 0,0,1 + R Flange fillet radius + T1 Overall flange thickness + Y Socket depth + Remember: property PRating must be defined afterwards """ if pos == None: @@ -450,10 +454,20 @@ def makeFlange(propList=[], pos=None, Z=None): a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + if a.FlangeType=='WN': + zpos=-a.T1+a.trf + elif a.FlangeType=='SW': + zpos=-a.T1+a.Y+a.trf + elif a.FlangeType=='LJ': + zpos=0 + else: + zpos=0 + a.Placement=a.Placement.multiply(FreeCAD.Placement(FreeCAD.Vector(0,0,zpos),FreeCAD.Rotation(1,0,0))) + FreeCAD.ActiveDocument.recompute() return a -def doFlanges(propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0], pypeline=None): +def doFlanges(propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0,0,0], pypeline=None): """ propList = [ DN (string): nominal diameter @@ -469,6 +483,10 @@ def doFlanges(propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0], twn (float): welding-neck thickness - OPTIONAL - dwn (float): welding-neck diameter - OPTIONAL - ODp (float): outside diameter of pipe for wn flanges - OPTIONAL - + R Flange fillet radius + T1 Overall flange thickness + Y Socket depth + pypeline = string """ flist = [] diff --git a/pFeatures.py b/pFeatures.py index f410e5c..959f17c 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# (c) 2019 R. T. LGPL: part ofdodo tools w.b. for FreeCAD __title__ = "pypeTools objects" __author__ = "oddtopus" @@ -12,6 +12,7 @@ import FreeCAD import FreeCADGui import Part +import Sketcher import fCmd import pCmd @@ -30,7 +31,6 @@ class pypeType(object): def __init__(self, obj): - obj.Proxy = self obj.addProperty( "App::PropertyString", "PType", @@ -122,6 +122,7 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, H=100): super(Pipe, self).__init__(obj) # define common properties obj.PType = "Pipe" + obj.Proxy = self obj.PRating = "SCH-STD" obj.PSize = DN # define specific properties @@ -355,10 +356,16 @@ def __init__( twn=0, dwn=0, ODp=0, + R=0, + T1=0, + B2=0, + Y=0, ): # initialize the parent class super(Flange, self).__init__(obj) # define common properties + self.Type='Flange' + obj.Proxy=self obj.PType = "Flange" obj.PRating = "DIN-PN16" obj.PSize = DN @@ -435,14 +442,46 @@ def __init__( "Flange2", QT_TRANSLATE_NOOP("App::Property", "Outside diameter of pipe"), ).ODp = ODp + obj.addProperty( + "App::PropertyLength", + "R", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Flange fillet radius"), + ).R = R + obj.addProperty( + "App::PropertyLength", + "T1", + "Flange", + QT_TRANSLATE_NOOP("App::Property", "Flange neck lenght"), + ).T1 = T1 + obj.addProperty( + "App::PropertyLength", + "B2", + "Flange Socket welding", + QT_TRANSLATE_NOOP("App::Property", "Socket diameter"), + ).B2 = B2 + obj.addProperty( + "App::PropertyLength", + "Y", + "Flange Socket welding", + QT_TRANSLATE_NOOP("App::Property", "Socket depth"), + ).Y = Y def onChanged(self, fp, prop): + # FreeCAD.Console.PrintMessage(prop) + if prop=="ODp": + if fp.ODp > fp.D: + FreeCAD.Console.PrintError("Raised edge diameter must be smaller than flange diameter") return None def execute(self, fp): + ''' + + ''' base = Part.Face(Part.Wire(Part.makeCircle(fp.D / 2))) if fp.d > 0: base = base.cut(Part.Face(Part.Wire(Part.makeCircle(fp.d / 2)))) + # Operation designed to make flange hole cylinders if fp.n > 0: hole = Part.Face( Part.Wire( @@ -457,24 +496,112 @@ def execute(self, fp): for i in list(range(fp.n)): base = base.cut(hole) hole.rotate(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n) - flange = base.extrude(FreeCAD.Vector(0, 0, fp.t)) - try: # Flange2: raised-face and welding-neck - if fp.trf > 0 and fp.drf > 0: + #creates flange thickness + flange = base.extrude(FreeCAD.Vector(0, 0, fp.t-fp.trf)) + FreeCADGui.ActiveDocument.Flange.Deviation = 0.10 + if fp.FlangeType=='SW' or fp.FlangeType=='WN'or fp.FlangeType=='LJ': + #creates flange neck + nn=Part.makeCylinder(fp.ODp/2,fp.T1-fp.trf,vO,vZ).cut( + Part.makeCylinder(fp.d/2,fp.T1-fp.trf,vO,vZ)) + flange=flange.fuse(nn) + if fp.trf > 0 and fp.drf < fp.D: rf = Part.makeCylinder(fp.drf / 2, fp.trf, vO, vZ * -1).cut( - Part.makeCylinder(fp.d / 2, fp.trf, vO, vZ * -1) - ) + Part.makeCylinder(fp.d / 2, fp.trf, vO, vZ * -1)) flange = flange.fuse(rf) - if fp.dwn > 0 and fp.twn > 0 and fp.ODp > 0: - wn = Part.makeCone(fp.dwn / 2, fp.ODp / 2, fp.twn, vZ * float(fp.t)).cut( - Part.makeCylinder(fp.d / 2, fp.twn, vZ * float(fp.t)) - ) - flange = flange.fuse(wn) - except: - pass - fp.Shape = flange + + if fp.FlangeType=='WN': + try: # Flange2:welding-neck + if fp.dwn > 0 and fp.twn > 0 and fp.ODp > 0: + wn = Part.makeCone(fp.dwn / 2, fp.ODp / 2, fp.twn, vZ * float(fp.t-fp.trf)).cut( + Part.makeCylinder(fp.d / 2, fp.twn, vZ * float(fp.t-fp.trf)) + ) + flange = flange.fuse(wn) + flange = flange.removeSplitter() + flange=flange.makeFillet(fp.R,[flange.Edges[2]]) + flange=flange.makeChamfer((fp.ODp-fp.d)/2*0.90,[flange.Edges[6]]) + except: + pass + elif fp.FlangeType=='LJ': + edge=[] + flange = flange.removeSplitter() + if fp.n == 4: + edge=flange.Edges[19] + if fp.n == 8: + edge=flange.Edges[31] + if fp.n == 12: + edge=flange.Edges[43] + if fp.n == 16: + edge=flange.Edges[55] + if fp.n == 20: + edge=flange.Edges[67] + flange=flange.makeFillet(fp.R,edge) + elif fp.FlangeType=='SW': + #creates flange neck + if fp.B2 > 0: + nn=flange.cut( + Part.makeCylinder(fp.B2/2,fp.Y,vZ*float(fp.T1-fp.trf),vZ*-1)) + flange=nn.removeSplitter() + fp.Shape=flange fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.t))] super(Flange, self).execute(fp) # perform common operations + #!TODO:this method generate a PartDesign object with sketch nest, pending feature compatibility + + # def execute(self,fp): + # obj=FreeCAD.activeDocument().addObject('PartDesign::Body','Flange') + # sketch=obj.newObject('Sketcher::SketchObject','Sketch') + # sketch.AttachmentSupport=(FreeCAD.activeDocument().getObject('YZ_Plane'),['']) + # sketch.MapMode='FlatFace' + # sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(-26.396620,19.420528,0),FreeCAD.Vector(37.200497,20.283836,0)),False) + # sketch.addConstraint(Sketcher.Constraint('DistanceY',-1,1,0,2,fp.d/2)) + # sketch.renameConstraint(0, u'InnerDiameter') + # sketch.addConstraint(Sketcher.Constraint('Symmetric',0,1,0,2,-2)) + # sketch.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,70)) + # sketch.renameConstraint(2, u'OverallThickness') + # sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(37.200497,19.420528,0),FreeCAD.Vector(37.200497,24.312616,0)),False) + # sketch.addConstraint(Sketcher.Constraint('Coincident',0,2,1,1)) + # sketch.addConstraint(Sketcher.Constraint('Vertical',1)) + # sketch.addGeometry(Part.ArcOfCircle(Part.Circle(FreeCAD.Vector(34.202893,24.312616,0),FreeCAD.Vector(0,0,1),2.997604),0.000000,1.287001),False) + # sketch.addConstraint(Sketcher.Constraint('Tangent',1,2,2,1)) + # sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(35.042226,27.190315,0),FreeCAD.Vector(6.698068,35.457398,0)),False) + # sketch.addConstraint(Sketcher.Constraint('Tangent',2,2,3,1)) + # sketch.addGeometry(Part.ArcOfCircle(Part.Circle(FreeCAD.Vector(7.314065,37.569377,0),FreeCAD.Vector(0,0,1),2.199979),-3.132797,-1.854592),False) + # sketch.addConstraint(Sketcher.Constraint('Equal',2,4)) + # sketch.addConstraint(Sketcher.Constraint('Tangent',3,2,4,2)) + # sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(5.114171,37.550027,0),FreeCAD.Vector(4.854102,67.117138,0)),False) + # sketch.addConstraint(Sketcher.Constraint('Tangent',4,1,5,1)) + # sketch.addGeometry(Part.ArcOfCircle(Part.Circle(FreeCAD.Vector(1.818155,67.090434,0),FreeCAD.Vector(0,0,1),3.036064),0.008796,1.579592),False) + # sketch.addConstraint(Sketcher.Constraint('Equal',6,4)) + # sketch.addConstraint(Sketcher.Constraint('Radius',4,3)) + # sketch.addConstraint(Sketcher.Constraint('Tangent',5,2,6,1)) + # sketch.addConstraint(Sketcher.Constraint('Vertical',5)) + # sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(1.791451,70.126381,0),FreeCAD.Vector(-23.109907,69.907350,0)),False) + # sketch.addConstraint(Sketcher.Constraint('Horizontal',7)) + # sketch.addConstraint(Sketcher.Constraint('Tangent',6,2,7,1)) + # sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(-23.109907,69.907350,0),FreeCAD.Vector(-22.849606,40.313959,0)),False) + # sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(-22.849606,40.313959,0),FreeCAD.Vector(-27.278782,40.223301,0)),False) + # sketch.addConstraint(Sketcher.Constraint('Coincident',7,2,8,1)) + # sketch.addConstraint(Sketcher.Constraint('Vertical',8)) + # sketch.addConstraint(Sketcher.Constraint('Coincident',8,2,9,1)) + # sketch.addConstraint(Sketcher.Constraint('DistanceY',8,1,8,2,-10)) + # sketch.addConstraint(Sketcher.Constraint('Horizontal',9)) + # sketch.addGeometry(Part.LineSegment(FreeCAD.Vector(-27.278782,40.313959,0),FreeCAD.Vector(-26.396620,19.420528,0)),False) + # sketch.addConstraint(Sketcher.Constraint('Coincident',9,2,10,1)) + # sketch.addConstraint(Sketcher.Constraint('Coincident',10,2,0,1)) + # sketch.addConstraint(Sketcher.Constraint('Vertical',10)) + # sketch.addConstraint(Sketcher.Constraint('DistanceY',-1,1,7,2,fp.D/2)) + # sketch.renameConstraint(24, u'OuterDiameter') + # sketch.addConstraint(Sketcher.Constraint('DistanceX',9,2,5,2,fp.t)) + # sketch.renameConstraint(25, u'FlangeThickness') + # sketch.Visibility=False + # sketch.recompute() + # revolution=obj.newObject('PartDesign::Revolution','Revolution') + # revolution.Profile=(sketch, ['']) + # revolution.ReferenceAxis = (sketch, ['H_Axis']) + # fp.Placement=fp.Placement + # fp.Shape= obj.Shape + + class Reduct(pypeType): """Class for object PType="Reduct" diff --git a/pForms.py b/pForms.py index 0039e30..3d90abc 100644 --- a/pForms.py +++ b/pForms.py @@ -452,13 +452,35 @@ def insert(self): propList.append(float(d["trf"])) propList.append(float(d["drf"])) except: - pass + for x in range(0,2,1): + propList.append(0) try: # for welding-neck propList.append(float(d["twn"])) propList.append(float(d["dwn"])) + except: + for x in range(0,2,1): + propList.append(0) + try: # for welding-neck propList.append(float(d["ODp"])) except: - pass + propList.append(0) + try: # for welding-neck + propList.append(float(d["R"])) + except: + propList.append(0) + try: + propList.append(float(d["T1"])) + except: + propList.append(0) + try: + propList.append(float(d["B2"])) + except: + propList.append(0) + try: + propList.append(float(d["Y"])) + except: + propList.append(0) + # FreeCAD.Console.PrintMessage(str(propList)+'\r\n') self.lastFlange = pCmd.doFlanges(propList, FreeCAD.__activePypeLine__)[-1] def apply(self): diff --git a/tablez/Flange_ASME-LJ-STD-150lb.csv b/tablez/Flange_ASME-LJ-STD-150lb.csv new file mode 100644 index 0000000..ac841b1 --- /dev/null +++ b/tablez/Flange_ASME-LJ-STD-150lb.csv @@ -0,0 +1,21 @@ +PSize;FlangeType;D;d;t;T1;ODp;f;n;df;R;ldrf;ltrf;kg +DN15;LJ;88.90;22.86;11.18;15.75;30.23;15.75;4;60.45;3.05;35.05;1.60;0.40 +DN20;LJ;98.55;28.19;12.70;15.75;38.10;15.75;4;69.85;3.05;42.93;1.60;0.57 +DN25;LJ;107.95;35.05;14.22;17.53;49.28;15.75;4;79.25;3.05;50.80;1.60;0.78 +DN32;LJ;117.35;43.69;15.75;20.57;58.67;15.75;4;88.90;4.83;63.50;1.60;1.02 +DN40;LJ;127.00;50.04;17.53;22.35;65.02;15.75;4;98.55;6.35;73.15;1.60;1.33 +DN50;LJ;152.40;62.48;19.05;25.40;77.72;19.05;4;120.65;7.87;91.95;1.60;2.06 +DN65;LJ;177.80;75.44;22.35;28.45;90.42;19.05;4;139.70;7.87;104.65;1.60;3.29 +DN80;LJ;190.50;91.44;23.88;30.23;107.95;19.05;4;152.40;9.65;127.00;1.60;3.85 +DN90;LJ;215.90;104.14;23.88;31.75;122.17;19.05;8;177.80;9.65;139.70;1.60;4.81 +DN100;LJ;228.60;116.84;23.88;33.27;134.87;19.05;8;190.50;11.18;157.23;1.60;5.29 +DN125;LJ;254.00;144.53;23.88;36.58;163.58;22.35;8;215.90;11.18;185.67;1.60;6.05 +DN150;LJ;279.40;171.45;25.40;39.62;192.02;22.35;8;241.30;12.70;215.90;1.60;7.39 +DN200;LJ;342.90;222.25;28.45;44.45;246.13;22.35;8;298.45;12.70;269.75;1.60;11.98 +DN250;LJ;406.40;277.37;30.23;49.28;304.80;25.40;12;361.95;12.70;323.85;1.60;16.38 +DN300;LJ;482.60;328.17;31.75;55.63;365.25;25.40;12;431.80;12.70;381.00;1.60;26.03 +DN350;LJ;533.40;360.17;35.05;79.25;400.05;28.45;12;476.25;12.70;412.75;1.60;38.63 +DN400;LJ;596.90;411.23;36.58;87.38;457.20;28.45;16;539.75;12.70;469.90;1.60;50.65 +DN450;LJ;635.00;462.28;39.62;96.77;504.95;31.75;16;577.85;12.70;533.40;1.60;55.94 +DN500;LJ;698.50;514.35;42.93;103.12;558.80;31.75;20;635.00;12.70;584.20;1.60;70.30 + diff --git a/tablez/Flange_ASME-SW-RF-STD-150lb.csv b/tablez/Flange_ASME-SW-RF-STD-150lb.csv new file mode 100644 index 0000000..83f0a6a --- /dev/null +++ b/tablez/Flange_ASME-SW-RF-STD-150lb.csv @@ -0,0 +1,21 @@ +PSize;FlangeType;D;BD;d;B2;B1*;t;Y;T1;ODp;f;n;df;drf;trf;kg +DN15;SW;88.90;22.35;15.75;22.35;13.97;11.18;9.65;15.75;30.23;15.75;4;60.45;35.05;1.60;0.41 +DN20;SW;98.55;27.69;20.83;27.69;18.80;12.70;11.18;15.75;38.10;15.75;4;69.85;42.93;1.60;0.58 +DN25;SW;107.95;34.54;26.67;34.54;24.38;14.22;12.70;17.53;49.28;15.75;4;79.25;50.80;1.60;0.79 +DN32;SW;117.35;43.18;35.05;43.18;32.51;15.75;14.22;20.57;58.67;15.75;4;88.90;63.50;1.60;1.05 +DN40;SW;127.00;49.53;40.89;49.53;38.10;17.53;15.75;22.35;65.02;15.75;4;98.55;73.15;1.60;1.36 +DN50;SW;152.40;61.98;52.58;61.98;49.28;19.05;17.53;25.40;77.72;19.05;4;120.65;91.95;1.60;2.12 +DN65;SW;177.80;74.68;62.74;74.68;58.93;22.35;19.05;28.45;90.42;19.05;4;139.70;104.65;1.60;3.40 +DN80;SW;190.50;90.68;77.98;90.68;73.66;23.88;20.57;30.23;107.95;19.05;4;152.40;127.00;1.60;4.01 +DN90;SW;215.90;103.38;90.17;103.38;85.34;23.88;22.35;31.75;122.17;19.05;8;177.80;139.70;1.60;4.99 +DN100;SW;228.60;116.08;102.36;116.08;97.28;23.88;23.88;33.27;134.87;19.05;8;190.50;157.23;1.60;5.50 +DN125;SW;254.00;143.76;128.27;143.76;122.17;23.88;23.88;36.58;163.58;22.35;8;215.90;185.67;1.60;6.43 +DN150;SW;279.40;170.69;154.18;170.69;146.30;25.40;26.92;39.62;192.02;22.35;8;241.30;215.90;1.60;7.88 +DN200;SW;342.90;221.49;253.49;221.49;193.80;28.45;31.75;44.45;246.13;22.35;8;298.45;269.75;1.60;10.88 +DN250;SW;406.40;276.35;254.51;276.35;247.65;30.23;33.27;49.28;304.80;25.40;12;361.95;323.85;1.60;17.70 +DN300;SW;482.60;327.15;304.80;327.15;298.45;31.75;39.62;55.63;365.25;25.40;12;431.80;381.00;1.60;27.65 +DN350;SW;533.40;359.16;336.55;359.16;330.20;35.05;41.40;57.15;400.05;28.45;12;476.25;412.75;1.60;36.29 +DN400;SW;596.90;410.46;387.35;410.46;381.00;36.58;44.45;63.50;457.20;28.45;16;539.75;469.90;1.60;47.18 +DN450;SW;635.00;461.77;438.15;461.77;431.80;39.62;49.28;68.33;504.95;31.75;16;577.85;533.40;1.60;51.39 +DN500;SW;698.50;513.08;488.95;513.08;482.60;42.93;54.10;73.15;558.80;31.75;20;635.00;584.20;1.60;64.91 +DN600;SW;812.80;615.95;590.55;615.95;584.20;47.75;63.50;82.55;663.45;35.05;20;749.30;692.15;1.60;90.73 diff --git a/tablez/Flange_ASME-WN-RF-STD-1500lb.csv b/tablez/Flange_ASME-WN-RF-STD-1500lb.csv new file mode 100644 index 0000000..e8d1d65 --- /dev/null +++ b/tablez/Flange_ASME-WN-RF-STD-1500lb.csv @@ -0,0 +1,19 @@ +PSize;FlangeType;D;d;t;T1;dwn;twn;t1;ODp;R;f;n;df;drf;trf;kg +DN15;WN;120.65;15.80;22.35;60.45;38.10;30.48;7.62;21.34;3.05;22.35;4;82.55;35.05;6.40;1.88 +DN20;WN;130.05;20.93;25.40;69.85;44.45;35.56;8.89;26.67;3.05;22.35;4;88.90;42.93;6.40;2.54 +DN25;WN;149.35;26.64;28.45;73.15;52.32;35.76;8.94;33.53;3.05;25.40;4;101.60;50.80;6.40;3.72 +DN32;WN;158.75;35.05;28.45;73.15;63.50;35.76;8.94;42.16;4.83;25.40;4;111.25;63.50;6.40;4.29 +DN40;WN;177.80;40.89;31.75;82.55;69.85;40.64;10.16;48.26;6.35;28.45;4;123.95;73.15;6.40;5.94 +DN50;WN;215.90;52.50;38.10;101.60;104.65;50.80;12.70;60.45;7.87;25.40;8;165.10;91.95;6.40;10.81 +DN65;WN;244.35;62.71;41.15;104.65;123.95;50.80;12.70;73.15;7.87;28.45;8;190.50;104.65;6.40;14.92 +DN80;WN;266.70;77.93;47.75;117.35;133.35;55.88;13.92;88.90;9.65;31.75;8;203.20;127.00;6.40;19.78 +DN100;WN;311.15;102.26;53.85;123.95;162.05;56.08;14.02;114.30;11.18;35.05;8;241.30;157.23;6.40;29.65 +DN125;WN;374.65;128.19;73.15;155.45;196.85;65.84;16.46;141.22;11.18;41.15;8;292.10;185.67;6.40;56.52 +DN150;WN;393.70;154.05;82.55;171.45;228.60;71.12;17.78;168.40;12.70;38.10;12;317.50;215.90;6.40;67.28 +DN200;WN;482.60;202.72;91.95;212.85;292.10;96.72;24.18;219.20;12.70;44.45;12;393.70;269.75;6.40;113.91 +DN250;WN;584.20;254.51;107.95;254.00;368.30;116.84;29.21;273.05;12.70;50.80;12;482.60;323.85;6.40;197.25 +DN300;WN;673.10;304.80;123.95;282.45;450.85;126.80;31.70;323.85;12.70;53.85;16;571.50;381.00;6.40;293.52 +DN350;WN;749.30;336.55;133.35;298.45;495.30;132.08;33.02;355.60;12.70;60.45;16;635.00;412.75;6.40;386.25 +DN400;WN;825.50;387.35;146.05;311.15;552.45;132.08;33.02;406.40;12.70;66.55;16;704.85;469.90;6.40;492.86 +DN450;WN;914.40;438.15;162.05;327.15;596.90;132.08;33.02;457.20;12.70;73.15;16;774.70;533.40;6.40;643.84 +DN500;WN;984.25;488.95;177.80;355.60;641.35;142.24;35.56;508.00;12.70;79.25;16;831.85;584.20;6.40;788.5 diff --git a/tablez/Flange_ASME-WN-RF-STD-150lb.csv b/tablez/Flange_ASME-WN-RF-STD-150lb.csv new file mode 100644 index 0000000..d31738f --- /dev/null +++ b/tablez/Flange_ASME-WN-RF-STD-150lb.csv @@ -0,0 +1,21 @@ +PSize;FlangeType;D;d;t;T1;dwn;twn;t1;ODp;R;f;n;df;drf;trf;kg +DN15;WN;88.90;15.75;11.18;47.75;30.23;29.21;7.37;21.34;3.05;15.75;4;60.45;35.05;1.60;0.49 +DN20;WN;98.55;20.83;12.70;52.32;38.10;31.75;7.87;26.67;3.05;15.75;4;69.85;42.93;1.60;0.72 +DN25;WN;107.95;26.67;14.22;55.63;49.28;33.02;8.38;33.53;3.05;15.75;4;79.25;50.80;1.60;1.03 +DN32;WN;117.35;35.05;15.75;57.15;58.67;33.02;8.38;42.16;4.83;15.75;4;88.90;63.50;1.60;1.34 +DN40;WN;127.00;40.89;17.53;61.98;65.02;35.56;8.89;48.26;6.35;15.75;4;98.55;73.15;1.60;1.74 +DN50;WN;152.40;52.58;19.05;63.50;77.72;35.56;8.89;60.45;7.87;19.05;4;120.65;91.95;1.60;2.60 +DN65;WN;177.80;62.74;22.35;69.85;90.42;38.10;9.40;73.15;7.87;19.05;4;139.70;104.65;1.60;4.17 +DN80;WN;190.50;77.93;23.88;69.85;107.95;36.83;9.14;88.90;9.65;19.05;4;152.40;127.00;1.60;4.99 +DN90;WN;215.90;90.17;23.88;71.37;122.17;38.10;9.40;101.60;9.65;19.05;8;177.80;139.70;1.60;6.18 +DN100;WN;228.60;102.26;23.88;76.20;134.87;41.91;10.41;114.30;11.18;19.05;8;190.50;157.23;1.60;6.98 +DN125;WN;254.00;128.19;23.88;88.90;163.58;52.07;12.95;141.22;11.18;22.35;8;215.90;185.67;1.60;8.72 +DN150;WN;279.40;154.05;25.40;88.90;192.02;50.80;12.70;168.40;12.70;22.35;8;241.30;215.90;1.60;10.74 +DN200;WN;342.90;202.72;28.45;101.60;246.13;58.42;14.73;219.20;12.70;22.35;8;298.45;269.75;1.60;17.68 +DN250;WN;406.40;254.51;30.23;101.60;304.80;57.15;14.22;273.05;12.70;25.40;12;361.95;323.85;1.60;24.25 +DN300;WN;482.60;304.80;31.75;114.30;365.25;66.04;16.51;323.85;12.70;25.40;12;431.80;381.00;1.60;36.93 +DN350;WN;533.40;336.55;35.05;127.00;400.05;73.66;18.29;355.60;12.70;28.45;12;476.25;412.75;1.60;48.88 +DN400;WN;596.90;387.35;36.58;127.00;457.20;72.39;18.03;406.40;12.70;28.45;16;539.75;469.90;1.60;60.47 +DN450;WN;635.00;438.15;39.62;139.70;504.95;80.01;20.07;457.20;12.70;31.75;16;577.85;533.40;1.60;68.37 +DN500;WN;698.50;488.95;42.93;144.53;558.80;81.28;20.32;508.00;12.70;31.75;20;635.00;584.20;1.60;84.60 +DN600;WN;812.80;590.55;47.75;152.40;663.45;83.82;20.83;609.60;12.70;35.05;20;749.30;692.15;1.60;115.33 diff --git a/tablez/Flange_ASME-WN-RF-STD-2500lb.csv b/tablez/Flange_ASME-WN-RF-STD-2500lb.csv new file mode 100644 index 0000000..ac5141e --- /dev/null +++ b/tablez/Flange_ASME-WN-RF-STD-2500lb.csv @@ -0,0 +1,16 @@ +PSize;FlangeType;D;d;t;T1;dwn;twn;t1;ODp;R;f;n;df;drf;trf;kg +DN15;WN;133.35;15.75;30.23;73.15;42.93;34.29;8.64;21.34;3.05;22.35;4;88.90;35.05;6.40;3.13 +DN20;WN;139.70;20.83;31.75;79.25;50.80;38.10;9.40;26.67;3.05;22.35;4;95.25;42.93;6.40;3.69 +DN25;WN;158.75;26.67;35.05;88.90;57.15;43.18;10.67;33.53;3.05;25.40;4;107.95;50.80;6.40;5.23 +DN32;WN;184.15;35.05;38.10;95.25;73.15;45.72;11.43;42.16;4.83;28.45;4;130.05;63.50;6.40;7.73 +DN40;WN;203.20;40.89;44.45;111.25;79.25;53.34;13.46;48.26;6.35;31.75;4;146.05;73.15;6.40;10.83 +DN50;WN;234.95;52.58;50.80;127.00;95.25;60.96;15.24;60.45;7.87;28.45;8;171.45;91.95;6.40;16.09 +DN65;WN;266.70;62.74;57.15;142.75;114.30;68.58;17.02;73.15;7.87;31.75;8;196.85;104.65;6.40;23.52 +DN80;WN;304.80;77.98;66.55;166.15;133.35;81.28;20.32;88.90;9.65;35.05;8;228.60;127.00;6.40;35.67 +DN100;WN;355.60;102.36;76.20;190.50;165.10;91.44;22.86;114.30;11.18;41.15;8;273.05;157.23;6.40;54.67 +DN125;WN;419.10;128.27;91.95;228.60;203.20;109.22;27.43;141.22;11.18;47.75;8;323.85;185.67;6.40;90.95 +DN150;WN;482.60;154.18;107.95;273.05;234.95;132.08;33.02;168.40;12.70;53.85;8;368.30;215.90;6.40;140.57 +DN200;WN;552.45;202.69;127.00;317.50;304.80;152.40;38.10;219.20;12.70;53.85;12;438.15;269.75;6.40;210.51 +DN250;WN;673.10;254.51;165.10;419.10;374.65;203.20;50.80;273.05;12.70;66.55;12;539.75;323.85;6.40;399.63 +DN300;WN;762.00;304.80;184.15;463.55;441.45;223.52;55.88;323.85;12.70;73.15;12;619.25;381.00;6.40;566.01 + diff --git a/tablez/Flange_ASME-WN-RF-STD-300lb.csv b/tablez/Flange_ASME-WN-RF-STD-300lb.csv new file mode 100644 index 0000000..66b94af --- /dev/null +++ b/tablez/Flange_ASME-WN-RF-STD-300lb.csv @@ -0,0 +1,20 @@ +PSize;FlangeType;D;d;t;T1;dwn;twn;t1;ODp;R;f;n;df;drf;trf;kg +DN15;WN;95.25;15.75;14.22;52.32;38.10;30.48;7.62;21.34;3.05;15.75;4;66.55;35.05;1.60;0.76 +DN20;WN;117.35;20.83;15.75;57.15;47.75;33.12;8.28;26.67;3.05;19.05;4;82.55;42.93;1.60;1.27 +DN25;WN;123.95;26.67;17.53;61.98;53.85;35.56;8.89;33.53;3.05;19.05;4;88.90;50.80;1.60;1.61 +DN32;WN;133.35;35.05;19.05;65.02;63.50;36.78;9.19;42.16;4.83;19.05;4;98.55;63.50;1.60;2.05 +DN40;WN;155.45;40.89;20.57;68.33;69.85;38.20;9.55;48.26;6.35;22.35;4;114.30;73.15;1.60;2.92 +DN50;WN;165.10;52.58;22.35;69.85;84.07;38.00;9.50;60.45;7.87;19.05;8;127.00;91.95;1.60;3.46 +DN65;WN;190.50;62.74;25.40;76.20;100.08;40.64;10.16;73.15;7.87;22.35;8;149.35;104.65;1.60;5.24 +DN80;WN;209.55;77.98;28.45;79.25;117.35;40.64;10.16;88.90;9.65;22.35;8;168.15;127.00;1.60;6.98 +DN90;WN;228.60;90.17;30.23;81.03;133.35;40.64;10.16;101.60;9.65;22.35;8;184.15;139.70;1.60;8.79 +DN100;WN;254.00;102.36;31.75;85.85;146.05;43.28;10.82;114.30;11.18;22.35;8;200.15;157.53;1.60;11.38 +DN125;WN;279.40;128.27;35.05;98.55;177.80;50.80;12.70;141.22;11.18;22.35;8;234.95;185.67;1.60;15.20 +DN150;WN;317.50;154.18;36.58;98.55;206.25;49.58;12.40;168.40;12.70;22.35;12;269.75;215.90;1.60;19.42 +DN200;WN;381.00;202.69;41.15;111.25;260.35;56.08;14.02;219.20;12.70;25.40;12;330.20;269.75;1.60;30.16 +DN250;WN;444.50;254.51;47.75;117.35;320.55;55.68;13.92;273.05;12.70;28.45;16;387.35;323.85;1.60;43.45 +DN300;WN;520.70;304.80;50.80;130.05;374.65;63.40;15.85;323.85;12.70;31.75;16;450.85;381.00;1.60;62.36 +DN350;WN;584.20;336.55;53.85;142.75;425.45;71.12;17.78;355.60;12.70;31.75;20;514.35;412.75;1.60;86.43 +DN400;WN;647.70;387.35;57.15;146.05;482.60;71.12;17.78;406.40;12.70;35.05;20;571.50;469.90;1.60;107.38 +DN450;WN;711.20;438.15;60.45;158.75;533.40;78.64;19.66;457.20;12.70;35.05;24;628.65;533.40;1.60;132.34 +DN500;WN;774.70;488.95;63.50;162.05;587.25;78.64;19.71;508.00;12.70;35.05;24;685.80;584.20;1.60;159.80 diff --git a/tablez/Flange_ASME-WN-RF-STD-600lb.csv b/tablez/Flange_ASME-WN-RF-STD-600lb.csv new file mode 100644 index 0000000..c849efa --- /dev/null +++ b/tablez/Flange_ASME-WN-RF-STD-600lb.csv @@ -0,0 +1,20 @@ +PSize;FlangeType;D;d;t;T1;dwn;twn;t1;ODp;R;f;n;df;drf;trf +DN15;WN;95.25;15.75;14.22;52.32;38.10;30.48;7.62;21.34;3.05;15.75;4;66.55;35.05;6.40 +DN20;WN;117.35;20.83;15.75;57.15;47.75;33.02;8.38;26.67;3.05;19.05;4;82.55;42.93;6.40 +DN25;WN;123.95;26.67;17.53;61.98;53.85;35.56;8.89;33.53;3.05;19.05;4;88.90;50.80;6.40 +DN32;WN;133.35;35.05;20.57;66.55;63.50;36.83;9.14;42.16;4.83;19.05;4;98.55;63.50;6.40 +DN40;WN;155.45;40.89;22.35;69.85;69.85;38.10;9.40;48.26;6.35;22.35;4;114.30;73.15;6.40 +DN50;WN;165.10;52.58;25.40;73.15;84.07;38.10;9.65;60.45;7.87;19.05;8;127.00;91.95;6.40 +DN65;WN;190.50;62.74;28.45;79.25;100.08;40.64;10.16;73.15;7.87;22.35;8;149.35;104.65;6.40 +DN80;WN;209.55;77.98;31.75;82.55;117.35;40.64;10.16;88.90;9.65;22.35;8;168.15;127.00;6.40 +DN90;WN;228.60;90.17;35.05;85.85;133.35;40.64;10.16;101.60;9.65;25.40;8;184.15;139.70;6.40 +DN100;WN;273.05;102.36;38.10;101.60;152.40;50.80;12.70;114.30;11.18;25.40;8;215.90;157.53;6.40 +DN125;WN;330.20;128.27;44.45;114.30;188.98;55.88;13.97;141.22;11.18;28.45;8;266.70;185.67;6.40 +DN150;WN;355.60;154.18;47.75;117.35;222.25;55.63;13.97;168.40;12.70;28.45;12;292.10;215.90;6.40 +DN200;WN;419.10;202.69;55.63;133.35;273.05;62.23;15.49;219.20;12.70;31.75;12;349.25;269.75;6.40 +DN250;WN;508.00;254.51;63.50;152.40;342.90;71.12;17.78;273.05;12.70;35.05;16;431.80;323.85;6.40 +DN300;WN;558.80;304.80;66.55;155.45;400.05;71.12;17.78;323.85;12.70;35.05;20;488.95;381.00;6.40 +DN350;WN;603.25;336.55;69.85;165.10;431.80;76.20;19.05;355.60;12.70;38.10;20;527.05;412.75;6.40 +DN400;WN;685.80;387.35;76.20;177.80;495.30;81.28;20.32;406.40;12.70;41.15;20;603.25;469.90;6.40 +DN450;WN;742.95;438.15;82.55;184.15;546.10;81.28;20.32;457.20;12.70;44.45;20;654.05;533.40;6.40 +DN500;WN;812.80;488.95;88.90;190.50;609.60;81.28;20.32;508.00;12.70;44.45;24;723.90;584.20;6.40 diff --git a/tablez/Flange_ASME-WN-RF-STD-900lb.csv b/tablez/Flange_ASME-WN-RF-STD-900lb.csv new file mode 100644 index 0000000..2381910 --- /dev/null +++ b/tablez/Flange_ASME-WN-RF-STD-900lb.csv @@ -0,0 +1,21 @@ +PSize;FlangeType;D;d;t;T1;dwn;twn;t1;ODp;R;f;n;df;drf;trf;kg +DN15;WN;120.65;15.80;22.35;60.45;38.10;30.48;7.62;21.34;3.05;22.35;4;82.55;35.05;6.40;1.88 +DN20;WN;130.05;20.93;25.40;69.85;44.45;35.56;8.89;26.67;3.05;22.35;4;88.90;42.93;6.40;2.54 +DN25;WN;149.35;26.64;28.45;73.15;52.32;35.76;8.94;33.53;3.05;25.40;4;101.60;50.80;6.40;3.72 +DN32;WN;158.75;35.05;28.45;73.15;63.50;35.76;8.94;42.16;4.83;25.40;4;111.25;63.50;6.40;4.29 +DN40;WN;177.80;40.89;31.75;82.55;69.85;40.64;10.16;48.56;6.35;28.45;4;123.95;73.15;6.40;5.94 +DN50;WN;215.90;52.50;38.10;101.60;104.65;50.80;12.70;60.45;7.87;25.40;8;165.10;91.95;6.40;10.81 +DN65;WN;244.35;62.71;41.15;104.65;123.95;50.80;12.70;73.15;7.87;28.45;8;190.50;104.65;6.40;14.92 +DN80;WN;241.30;77.93;38.10;101.60;127.00;50.80;12.70;88.90;9.65;25.40;8;190.50;127.00;6.40;13.60 +DN100;WN;292.10;102.26;44.45;114.30;158.75;55.88;13.97;114.30;11.18;31.75;8;234.95;157.23;6.40;22.37 +DN125;WN;349.25;128.19;50.80;127.00;190.50;60.96;15.24;141.22;11.18;35.05;8;279.40;185.67;6.40;35.90 +DN150;WN;381.00;154.05;55.63;139.70;234.95;67.26;16.81;168.40;12.70;31.75;12;317.50;215.90;6.40;46.98 +DN200;WN;469.90;202.72;63.50;162.05;298.45;78.84;19.71;219.20;12.70;38.10;12;393.70;269.75;6.40;80.07 +DN250;WN;546.10;254.51;69.85;184.15;368.30;91.44;22.86;273.05;12.70;38.10;16;469.90;323.85;6.40;117.90 +DN300;WN;609.60;304.80;79.25;200.15;419.10;96.72;24.18;323.85;12.70;38.10;20;533.40;381.00;6.40;156.80 +DN350;WN;641.35;336.55;85.85;212.85;450.85;101.60;25.40;355.60;12.70;41.15;20;558.80;412.75;6.40;179.94 +DN400;WN;704.85;387.35;88.90;215.90;508.00;101.60;25.40;406.40;12.70;44.45;20;615.95;469.90;6.40;216.91 +DN450;WN;787.40;438.15;101.60;228.60;565.15;101.60;25.40;457.20;12.70;50.80;20;685.80;533.40;6.40;293.63 +DN500;WN;857.25;488.95;107.95;247.65;622.30;111.76;27.94;508.00;12.70;53.85;20;749.30;584.20;6.40;364.11 +DN600;WN;1041.40;590.55;139.70;292.10;749.30;121.92;30.48;609.60;12.70;66.55;20;901.70;692.15;6.40;666.57 + From 19df91b3ce378bb83806e5109d7383c7251bb353 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Mon, 6 Jan 2025 21:38:46 -0600 Subject: [PATCH 081/135] Update README.md Update due main folder rename --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 391c081..c0f20b6 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Examples on different OS Use the CLI to enter the `Mod` directory and use Git to install Dodo: ```shell -git clone https://github.com/EdgarJRobles/dodo Quetzal +git clone https://github.com/EdgarJRobles/quetzal Quetzal ``` If you are updating the code, restarting FreeCAD is advised. @@ -66,14 +66,14 @@ Discussion in the FreeCAD Forum: [ContribsW]: ./CONTRIBUTING.md [ContribsW_badge]: [license]: ./LICENSE -[license_badge]: +[license_badge]: [AddonMgr]: [AddonMgr_badge]: [pre-commit]: [pre-commit_badge]: [black]: [black_badge]: -[tag]: -[tag_bagde]: +[tag]: +[tag_bagde]: [cc_badge]: [cc]: <./CHANGELOG.md> From 5d8f380037b6768ea7340ba079c2becbe35a947f Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 12 Jan 2025 21:23:53 -0600 Subject: [PATCH 082/135] Fix object bases & added extra flange & pipe standarts -Fix attachment support from pipe features -Added Slip on flanges from ASME standart -Added extra ASME pipe grades from 10 to 160 -Added tooltip for nozzle tank insert function due unknow behavior --- pCmd.py | 12 +++------ pFeatures.py | 15 +++++++---- pForms.py | 35 ++++++++++---------------- tablez/Flange_ASME-SO-RF-STD-150lb.csv | 20 +++++++++++++++ tablez/Flange_ASME-SO-RF-STD-300lb.csv | 20 +++++++++++++++ tablez/Flange_ASME-SO-RF-STD-600lb.csv | 20 +++++++++++++++ tablez/Flange_ASME-SO-RF-STD-900lb.csv | 20 +++++++++++++++ tablez/Pipe_SCH-10.csv | 7 ++++++ tablez/Pipe_SCH-100.csv | 9 +++++++ tablez/Pipe_SCH-120.csv | 12 +++++++++ tablez/Pipe_SCH-140.csv | 9 +++++++ tablez/Pipe_SCH-160.csv | 21 ++++++++++++++++ tablez/Pipe_SCH-20.csv | 18 +++++++++++++ tablez/Pipe_SCH-30.csv | 9 +++++++ tablez/Pipe_SCH-40.csv | 21 ++++++++++++++++ tablez/Pipe_SCH-60.csv | 9 +++++++ tablez/Pipe_SCH-80.csv | 21 ++++++++++++++++ tablez/Pipe_SCH-XS.csv | 21 ++++++++++++++++ 18 files changed, 264 insertions(+), 35 deletions(-) create mode 100644 tablez/Flange_ASME-SO-RF-STD-150lb.csv create mode 100644 tablez/Flange_ASME-SO-RF-STD-300lb.csv create mode 100644 tablez/Flange_ASME-SO-RF-STD-600lb.csv create mode 100644 tablez/Flange_ASME-SO-RF-STD-900lb.csv create mode 100644 tablez/Pipe_SCH-10.csv create mode 100644 tablez/Pipe_SCH-100.csv create mode 100644 tablez/Pipe_SCH-120.csv create mode 100644 tablez/Pipe_SCH-140.csv create mode 100644 tablez/Pipe_SCH-160.csv create mode 100644 tablez/Pipe_SCH-20.csv create mode 100644 tablez/Pipe_SCH-30.csv create mode 100644 tablez/Pipe_SCH-40.csv create mode 100644 tablez/Pipe_SCH-60.csv create mode 100644 tablez/Pipe_SCH-80.csv create mode 100644 tablez/Pipe_SCH-XS.csv diff --git a/pCmd.py b/pCmd.py index f2846f4..ed31218 100644 --- a/pCmd.py +++ b/pCmd.py @@ -1405,18 +1405,14 @@ def makeNozzle(DN="DN50", H=200, OD=60.3, thk=3, D=160, d=62, df=132, f=14, t=15 Z=e.tangentAt(0).cross(e.normalAt(0)), ) FreeCAD.ActiveDocument.recompute() - flange = makeFlange( - [DN, "S.O.", D, d, df, f, t, n], - pos=portsPos(pipe)[1], - Z=portsDir(pipe)[1], - ) + flange = makeFlange([DN, "S.O.", D, d, df, f, t, n],pos=portsPos(pipe)[1],Z=portsDir(pipe)[1]) pipe.MapReversed = False - pipe.Support = [(s, fCmd.edgeName(s, e)[1])] + pipe.AttachmentSupport = [(s, fCmd.edgeName(s, e)[1])] pipe.MapMode = "Concentric" FreeCADGui.Selection.clearSelection() FreeCADGui.Selection.addSelection(pipe) FreeCADGui.Selection.addSelection(flange) - flange.Support = [(pipe, "Edge1")] + flange.AttachmentSupport = [(pipe, "Edge1")] flange.MapReversed = True flange.MapMode = "Concentric" FreeCAD.ActiveDocument.recompute() @@ -1428,7 +1424,7 @@ def makeRoute(n=Z): s = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject", "pipeRoute") s.MapMode = "SectionOfRevolution" sup = fCmd.edgeName() - s.Support = [sup] + s.AttachmentSupport = [sup] if fCmd.isPartOfPart( sup[0] ): # TARGET [working]: takes care if support belongs to App::Part diff --git a/pFeatures.py b/pFeatures.py index 959f17c..30d91ec 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -499,7 +499,7 @@ def execute(self, fp): #creates flange thickness flange = base.extrude(FreeCAD.Vector(0, 0, fp.t-fp.trf)) FreeCADGui.ActiveDocument.Flange.Deviation = 0.10 - if fp.FlangeType=='SW' or fp.FlangeType=='WN'or fp.FlangeType=='LJ': + if fp.FlangeType=='SW' or fp.FlangeType=='WN'or fp.FlangeType=='LJ' or fp.FlangeType=='SO': #creates flange neck nn=Part.makeCylinder(fp.ODp/2,fp.T1-fp.trf,vO,vZ).cut( Part.makeCylinder(fp.d/2,fp.T1-fp.trf,vO,vZ)) @@ -602,7 +602,6 @@ def execute(self, fp): # fp.Shape= obj.Shape - class Reduct(pypeType): """Class for object PType="Reduct" Reduct(obj,[PSize="DN50",OD=60.3, OD2= 48.3, thk=3, thk2=None, H=None, conc=True]) @@ -622,6 +621,7 @@ def __init__(self, obj, DN="DN50", OD=60.3, OD2=48.3, thk=3, thk2=None, H=None, # initialize the parent class super(Reduct, self).__init__(obj) # define common properties + obj.Proxy = self obj.PType = "Reduct" obj.PRating = "SCH-STD" obj.PSize = DN @@ -744,6 +744,7 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3): super(Cap, self).__init__(obj) # define common properties obj.PType = "Cap" + obj.Proxy = self obj.PRating = "SCH-STD" obj.PSize = DN # define specific properties @@ -828,6 +829,7 @@ def __init__(self, obj, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None, l # initialize the parent class super(PypeLine2, self).__init__(obj) # define common properties + obj.Proxy = self obj.PType = "PypeLine" obj.PSize = DN obj.PRating = PRating @@ -875,6 +877,7 @@ def onChanged(self, fp, prop): FreeCAD.Console.PrintWarning(fp.Label + " Base has changed to " + fp.Base.Label + "\n") if prop == "OD": fp.BendRadius = 0.75 * fp.OD + fp.Proxy.update(fp) def purge(self, fp): group = FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] @@ -885,7 +888,6 @@ def purge(self, fp): def update(self, fp, edges=None): from DraftVecUtils import rounded from math import degrees - if not edges and hasattr(fp.Base, "Shape"): edges = fp.Base.Shape.Edges if not edges: @@ -1162,6 +1164,7 @@ def __init__(self, obj, DN="DN50", VType="ball", OD=72, ID=50, H=40, Kv=150): # initialize the parent class super(Valve, self).__init__(obj) # define common properties + obj.Proxy = self obj.PType = "Valve" obj.PRating = VType obj.PSize = DN @@ -1209,6 +1212,7 @@ def __init__(self, obj, base, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=N # initialize the parent class super(PypeBranch2, self).__init__(obj) # define common properties + obj.Proxy = self obj.PType = "PypeBranch" obj.PSize = DN obj.PRating = PRating @@ -1315,7 +1319,7 @@ def redraw(self, fp): t = pCmd.makePipe([fp.PSize, float(fp.OD), float(fp.thk), L]) t.PRating = fp.PRating t.PSize = fp.PSize - t.Support = [(fp.Base, eSupport)] + t.AttachmentSupport = [(fp.Base, eSupport)] t.MapMode = "NormalToEdge" t.MapReversed = True t.AttachmentOffset = FreeCAD.Placement( @@ -1331,13 +1335,14 @@ def redraw(self, fp): c.PSize = fp.PSize O = "Vertex" + str(i + 1) c.MapReversed = False - c.Support = [(fp.Base, O)] + c.AttachmentSupport = [(fp.Base, O)] c.MapMode = "Translate" pCmd.placeTheElbow(c, e0.tangentAt(0), e.tangentAt(0)) curves.append(c.Name) fp.Tubes = tubes fp.Curves = curves objs = [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves] + # FreeCAD.Console.PrintMessage(objs) fp.addObjects(objs) for obj in objs: obj.Proxy.execute(obj) diff --git a/pForms.py b/pForms.py index 3d90abc..bfd99e0 100644 --- a/pForms.py +++ b/pForms.py @@ -842,7 +842,7 @@ def insert(self): propList = [objs[0].PSize, objs[0].OD, objs[0].thk] else: propList = [d["PSize"], float(pq(d["OD"])), float(pq(d["thk"]))] - self.lastCap = pCmd.doCaps(propList, FreeCAD.__activePypeLine__)[-1] + self.lastCap = pCmd.doCaps(propList, FreeCAD.__activePypeLine__) def apply(self): for obj in FreeCADGui.Selection.getSelection(): @@ -1593,8 +1593,11 @@ def __init__(self): if s.startswith("Flange") and s.endswith(".csv") ] self.form.comboPipe.addItems(self.pipeRatings) + self.form.comboPipe.setToolTip('List available pipe thickness standarts') self.form.comboFlange.addItems(self.flangeRatings) + self.form.comboFlange.setToolTip('List available flange standarts') self.form.btn1.clicked.connect(self.addNozzle) + self.form.btn1.setToolTip('In order to make it Work, must select a circular edge direct from viewer then press this button') self.form.editLength.setValidator(QDoubleValidator()) self.form.editX.setValidator(QDoubleValidator()) self.form.editY.setValidator(QDoubleValidator()) @@ -1625,16 +1628,17 @@ def accept(self): def addNozzle(self): DN = self.form.listSizes.currentItem().text() args = self.nozzles[DN] + # FreeCAD.Console.PrintMessage(args) FreeCAD.ActiveDocument.openTransaction("Add nozzles") pCmd.makeNozzle(DN, float(self.form.editLength.text()), *args) FreeCAD.ActiveDocument.commitTransaction() def combine(self): - print(translate("insertTankForm", "doing combine")) + # print(translate("insertTankForm", "doing combine")) self.form.listSizes.clear() try: fileName = "Pipe_" + self.form.comboPipe.currentText() + ".csv" - print(fileName) + # print(fileName) f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") reader = csv.DictReader(f, delimiter=";") pipes = dict( @@ -1642,34 +1646,21 @@ def combine(self): ) f.close() fileName = "Flange_" + self.form.comboFlange.currentText() + ".csv" - print(fileName) + # print(fileName) f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") reader = csv.DictReader(f, delimiter=";") flanges = dict( - [ - [ - line["PSize"], - [ - float(line["D"]), - float(line["d"]), - float(line["df"]), - float(line["f"]), - float(line["t"]), - int(line["n"]), - ], - ] - for line in reader - ] + [[line["PSize"],[float(line["D"]),float(line["d"]),float(line["df"]),float(line["f"]),float(line["t"]),int(line["n"]),],]for line in reader] ) f.close() - print(translate("insertTankForm", "files read")) + # print(translate("insertTankForm", "files read")) except: - print(translate("insertTankForm", "files not read")) + # print(translate("insertTankForm", "files not read")) return listNozzles = [ [p[0], p[1] + flanges[p[0]]] for p in pipes.items() if p[0] in flanges.keys() ] - print(translate("insertTankForm", "listNozzles: %s") % str(listNozzles)) + # print(translate("insertTankForm", "listNozzles: %s") % str(listNozzles)) self.nozzles = dict(listNozzles) self.form.listSizes.addItems(list(self.nozzles.keys())) # self.form.listSizes.sortItems() @@ -1721,7 +1712,7 @@ def accept(self, ang=None): else: s = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject", "pipeRoute") s.MapMode = "NormalToEdge" - s.Support = [(self.obj, self.edge)] + s.AttachmentSupport = [(self.obj, self.edge)] s.AttachmentOffset = FreeCAD.Placement( FreeCAD.Vector(0, 0, -1 * float(self.form.edit1.text())), FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), 0), diff --git a/tablez/Flange_ASME-SO-RF-STD-150lb.csv b/tablez/Flange_ASME-SO-RF-STD-150lb.csv new file mode 100644 index 0000000..62c8f20 --- /dev/null +++ b/tablez/Flange_ASME-SO-RF-STD-150lb.csv @@ -0,0 +1,20 @@ +PSize;FlangeType;D;d;t;T1;ODp;f;n;df;drf;trf;kg +DN15;SO;88.90;22.35;11.18;15.75;30.23;15.75;4;60.45;35.05;1.60;0.40 +DN20;SO;98.55;27.69;12.70;15.75;38.10;15.75;4;69.85;42.93;1.60;0.57 +DN25;SO;107.95;34.54;14.22;17.53;49.28;15.75;4;79.25;50.80;1.60;0.78 +DN32;SO;117.35;43.18;15.75;20.57;58.67;15.75;4;88.90;63.50;1.60;1.02 +DN40;SO;127.00;49.53;17.53;22.35;65.02;15.75;4;98.55;73.15;1.60;1.33 +DN50;SO;152.40;61.98;19.05;25.40;77.72;19.05;4;120.65;91.95;1.60;2.07 +DN65;SO;177.80;74.68;22.35;28.45;90.42;19.05;4;139.70;104.65;1.60;3.31 +DN80;SO;190.50;90.68;23.88;30.23;107.95;19.05;4;152.40;127.00;1.60;3.88 +DN90;SO;215.90;103.38;23.88;31.75;122.17;19.05;8;177.80;139.70;1.60;4.84 +DN100;SO;228.60;116.06;23.88;33.27;134.87;19.05;8;190.50;157.23;1.60;5.32 +DN125;SO;254.00;143.76;23.88;36.58;163.58;22.35;8;215.90;185.67;1.60;6.10 +DN150;SO;279.40;170.69;25.40;39.62;192.02;22.35;8;241.30;215.90;1.60;7.46 +DN200;SO;342.90;221.49;28.45;44.45;246.13;22.35;8;298.45;269.75;1.60;12.07 +DN250;SO;406.40;276.35;30.23;49.28;304.80;25.40;12;361.95;323.85;1.60;16.56 +DN300;SO;482.60;327.15;31.75;55.63;365.25;25.40;12;431.80;381.00;1.60;26.26 +DN350;SO;533.40;359.16;35.05;57.15;400.05;28.45;12;476.25;412.75;1.60;34.76 +DN400;SO;596.90;410.46;36.58;63.50;457.20;28.45;16;539.75;469.90;1.60;45.02 +DN450;SO;635.00;461.77;39.62;68.33;504.95;31.75;16;577.85;533.40;1.60;48.90 +DN500;SO;698.50;513.08;42.93;73.15;558.80;31.75;20;635.00;584.20;1.60;62.07 diff --git a/tablez/Flange_ASME-SO-RF-STD-300lb.csv b/tablez/Flange_ASME-SO-RF-STD-300lb.csv new file mode 100644 index 0000000..9162fb3 --- /dev/null +++ b/tablez/Flange_ASME-SO-RF-STD-300lb.csv @@ -0,0 +1,20 @@ +PSize;FlangeType;D;d;t;T1;ODp;f;n;df;drf;trf;kg +DN15;SO;95.25;22.35;14.22;22.35;38.10;15.75;4;66.55;35.05;1.60;0.65 +DN20;SO;117.35;27.69;15.75;25.40;47.75;19.05;4;82.55;42.93;1.60;1.11 +DN25;SO;123.95;34.54;17.53;26.92;53.85;19.05;4;88.90;50.80;1.60;1.37 +DN32;SO;133.35;43.18;19.05;26.92;63.50;19.05;4;98.55;63.50;1.60;1.69 +DN40;SO;165.45;49.53;20.57;30.23;69.85;22.35;4;114.30;73.15;1.60;2.49 +DN50;SO;165.10;61.98;22.35;33.27;84.07;19.05;8;127.00;91.95;1.60;2.89 +DN65;SO;190.50;74.68;25.40;38.10;100.08;22.35;8;149.35;104.65;1.60;4.33 +DN80;SO;209.55;90.68;28.45;42.93;117.35;22.35;8;168.15;127.00;1.60;5..83 +DN90;SO;228.60;103.38;30.23;44.45;133.35;22.35;8;184.15;139.70;1.60;7.36 +DN100;SO;254.00;116.08;31.75;47.75;146.05;22.35;8;200.15;157.23;1.60;9.65 +DN125;SO;279.40;143.76;35.05;50.80;177.80;22.35;8;234.95;185.67;1.60;12.23 +DN150;SO;317.50;170.69;38.58;52.32;206.25;22.35;12;269.75;215.90;1.60;15.66 +DN200;SO;381.00;221.49;41.15;61.98;260.35;25.40;12;330.20;269.75;1.60;24.22 +DN250;SO;444.50;276.35;47.75;66.55;320.55;28.45;16;387.35;323.85;1.60;34.18 +DN300;SO;520.70;327.15;50.80;73.15;374.65;31.75;16;450.85;381.00;1.60;49.91 +DN350;SO;584.20;359.16;53.85;76.20;425.45;31.75;20;514.35;412.75;1.60;69.54 +DN400;SO;647.70;410.46;57.15;82.55;482.60;35.05;20;571.50;469.90;1.60;88.25 +DN450;SO;711.20;461.77;60.45;88.90;533.40;35.05;24;628.65;533.40;1.60;108.76 +DN500;SO;774.70;513.08;63.50;95.25;587.25;35.05;24;685.80;584.20;1.60;134.18 diff --git a/tablez/Flange_ASME-SO-RF-STD-600lb.csv b/tablez/Flange_ASME-SO-RF-STD-600lb.csv new file mode 100644 index 0000000..fa5836e --- /dev/null +++ b/tablez/Flange_ASME-SO-RF-STD-600lb.csv @@ -0,0 +1,20 @@ +PSize;FlangeType;D;d;t;T1;ODp;f;n;df;drf;trf;kg +DN15;SO;95.25;22.35;14.22;22.35;38.10;15.75;4;66.55;35.05;6.40;0.74 +DN20;SO;117.35;27.69;15.75;25.40;47.75;19.05;4;82.55;42.93;6.40;1.25 +DN25;SO;123.95;34.54;17.53;26.92;53.85;19.05;4;88.90;50.80;6.40;1.53 +DN32;SO;133.35;43.18;20.57;28.45;63.50;19.05;4;98.55;63.50;6.40;2.02 +DN40;SO;155.45;49.53;22.35;31.75;69.85;22.35;4;114.30;73.15;6.40;2.97 +DN50;SO;165.10;61.98;25.40;36.58;84.07;19.05;8;127.00;91.95;6.40;3.62 +DN65;SO;190.50;74.68;28.45;41.15;100.08;22.35;8;149.35;104.65;6.40;5.24 +DN80;SO;209.55;90.68;31.75;45.97;117.35;22.35;8;168.15;127.00;6.40;7.00 +DN90;SO;228.60;103.38;35.05;49.58;133.35;25.40;8;169.15;139.70;6.40;8.84 +DN100;SO;273.05;116.08;38.10;53.85;152.40;25.40;8;215.90;157.53;6.40;14.52 +DN125;SO;330.20;143.76;44.45;80.45;188.98;28.45;8;266.70;185.67;6.40;24.47 +DN150;SO;355.60;170.69;47.75;66.55;222.25;28.45;12;292.0;215.90;6.40;28.82 +DN200;SO;419.10;221.49;55.63;76.20;273.05;31.75;12;349.25;269.75;6.40;43.43 +DN250;SO;508.00;276.35;63.50;85.85;342.90;35.05;16;431.80;323.85;6.40;70.23 +DN300;SO;558.80;327.15;66.55;91.95;400.05;35.05;20;488.95;381.00;6.40;83.92 +DN350;SO;603.25;359.16;69.85;93.73;431.80;38.10;20;527.05;412.75;6.40;98.74 +DN400;SO;685.80;410.46;76.20;106.43;495.30;41.15;20;603.25;469.90;6.40;142.27 +DN450;SO;742.95;461.77;82.55;117.35;546.10;44.45;20;654.05;533.40;6.40;173.32 +DN500;SO;812.80;513.08;88.90;127.00;609.60;44.45;24;723.90;584.20;6.40;220.33 diff --git a/tablez/Flange_ASME-SO-RF-STD-900lb.csv b/tablez/Flange_ASME-SO-RF-STD-900lb.csv new file mode 100644 index 0000000..86f4ae5 --- /dev/null +++ b/tablez/Flange_ASME-SO-RF-STD-900lb.csv @@ -0,0 +1,20 @@ +PSize;FlangeType;D;d;t;T1;ODp;f;n;df;drf;trf;kg +DN15;SO;120.65;22.35;22.35;31.75;38.10;22.35;4;82.55;35.05;6.40;1.75 +DN20;SO;130.05;27.69;25.40;35.05;44.45;22.35;4;88.90;42.93;6.40;2.33 +DN25;SO;149.35;34.54;28.45;41.15;52.32;25.40;4;101.60;50.80;6.40;3.43 +DN32;SO;158.75;43.18;28.45;41.15;63.50;25.40;4;111.25;63.50;6.40;3.90 +DN40;SO;177.80;49.53;31.75;44.45;69.85;28.45;4;123.95;73.15;6.40;5.38 +DN50;SO;215.90;61.98;38.10;57.15;104.65;25.40;8;165.10;91.95;6.40;9.85 +DN65;SO;244.35;74.68;41.15;63.50;123.95;28.45;8;190.50;104.65;6.40;13.65 +DN80;SO;241.30;90.68;38.10;53.85;127.00;25.40;8;190.50;127.00;6.40;11.61 +DN100;SO;292.10;116.08;44.45;69.85;158.75;31.75;8;234.95;157.23;6.40;19.76 +DN125;SO;349.25;143.76;50.80;79.25;190.50;35.05;8;279.40;185.67;6.40;31.93 +DN150;SO;381.00;170.69;55.63;85.85;234.95;31.75;8;317.50;215.90;6.40;41.19 +DN200;SO;469.90;221.49;63.50;101.60;298.45;38.10;12;393.70;269.75;6.40;70.75 +DN250;SO;546.10;276.35;69.85;107.95;368.30;38.10;16;469.90;323.85;6.40;100.58 +DN300;SO;609.60;327.15;79.25;117.35;419.10;38.10;20;533.40;381.00;6.40;132.70 +DN350;SO;641.35;359.16;85.85;130.05;450.85;41.15;20;558.80;412.75;6.40;153.37 +DN400;SO;704.85;410.46;88.90;133.35;508.00;44.45;20;615.95;469.90;6.40;184.90 +DN450;SO;787.40;461.77;101.60;152.40;565.15;50.80;20;685.80;533.40;6.40;258.51 +DN500;SO;857.25;513.08;107.95;158.75;622.30;53.85;20;749.30;584.20;6.40;317.19 +DN600;SO;1041.40;615.95;139.70;203.20;749.30;66.55;20;901.70;692.15;6.40;606.21 diff --git a/tablez/Pipe_SCH-10.csv b/tablez/Pipe_SCH-10.csv new file mode 100644 index 0000000..b423c90 --- /dev/null +++ b/tablez/Pipe_SCH-10.csv @@ -0,0 +1,7 @@ +PSize;OD;thk +DN350;355.6;12.7 +DN400;406.4;12.7 +DN450;457.2;12.7 +DN500;508;12.7 +DN600;609.6;12.7 + diff --git a/tablez/Pipe_SCH-100.csv b/tablez/Pipe_SCH-100.csv new file mode 100644 index 0000000..8b73c42 --- /dev/null +++ b/tablez/Pipe_SCH-100.csv @@ -0,0 +1,9 @@ +PSize;OD;thk +DN200;219.07;30.12 +DN250;273.05;36.47 +DN300;323.85;42.82 +DN350;355.6;47.6 +DN400;406.4;52.37 +DN450;457.2;58.72 +DN500;508;65.07 +DN600;609.6;77.77 diff --git a/tablez/Pipe_SCH-120.csv b/tablez/Pipe_SCH-120.csv new file mode 100644 index 0000000..2f08cc6 --- /dev/null +++ b/tablez/Pipe_SCH-120.csv @@ -0,0 +1,12 @@ +PSize;OD;thk +DN100;114.3;22.25 +DN125;141.3;25.4 +DN150;168.27;28.54 +DN200;219.07;36.47 +DN250;273.05;42.82 +DN300;323.85;50.8 +DN350;355.6;55.52 +DN400;406.4;61.87 +DN450;457.2;69.85 +DN500;508;76.2 +DN600;609.6;92.05 diff --git a/tablez/Pipe_SCH-140.csv b/tablez/Pipe_SCH-140.csv new file mode 100644 index 0000000..d20f96e --- /dev/null +++ b/tablez/Pipe_SCH-140.csv @@ -0,0 +1,9 @@ +PSize;OD;thk +DN200;219.07;41.24 +DN250;273.05;50.8 +DN300;323.85;57.15 +DN350;355.6;63.5 +DN400;406.4;73.05 +DN450;457.2;79.35 +DN500;508;88.9 +DN600;609.6;104.75 diff --git a/tablez/Pipe_SCH-160.csv b/tablez/Pipe_SCH-160.csv new file mode 100644 index 0000000..89fd150 --- /dev/null +++ b/tablez/Pipe_SCH-160.csv @@ -0,0 +1,21 @@ +PSize;OD;thk +DN15;21.34;9.5 +DN20;26.67;11.07 +DN25;33.4;12.7 +DN32;42.16;12.7 +DN40;48.26;14.27 +DN50;60.32;17.42 +DN65;73.02;19.04 +DN80;88.9;22.25 +DN90;101.6;25.4 +DN100;114.3;26.97 +DN125;141.3;31.75 +DN150;168.27;36.47 +DN200;219.07;46.02 +DN250;273.05;57.15 +DN300;323.85;66.65 +DN350;355.6;71.42 +DN400;406.4;80.92 +DN450;457.2;90.47 +DN500;508;99.97 +DN600;609.6;119.02 diff --git a/tablez/Pipe_SCH-20.csv b/tablez/Pipe_SCH-20.csv new file mode 100644 index 0000000..192a21b --- /dev/null +++ b/tablez/Pipe_SCH-20.csv @@ -0,0 +1,18 @@ +PSize;OD;thk +DN200;219.07;12.69 +DN250;273.05;12.7 +DN300;323.85;12.7 +DN350;355.6;15.87 +DN400;406.4;15.87 +DN450;457.2;15.87 +DN500;508;19.05 +DN600;609.6;19.05 + + + + + + + + + diff --git a/tablez/Pipe_SCH-30.csv b/tablez/Pipe_SCH-30.csv new file mode 100644 index 0000000..ec06ed4 --- /dev/null +++ b/tablez/Pipe_SCH-30.csv @@ -0,0 +1,9 @@ +PSize;OD;thk +DN200;219.07;14.07 +DN250;273.05;15.6 +DN300;323.85;16.76 +DN350;355.6;19.05 +DN400;406.4;19.05 +DN450;457.2;22.25 +DN500;508;25.4 +DN600;609.6;28.57 diff --git a/tablez/Pipe_SCH-40.csv b/tablez/Pipe_SCH-40.csv new file mode 100644 index 0000000..ac8d565 --- /dev/null +++ b/tablez/Pipe_SCH-40.csv @@ -0,0 +1,21 @@ +PSize;OD;thk +DN15;21.34;5.54 +DN20;26.67;5.74 +DN25;33.4;6.76 +DN32;42.16;7.11 +DN40;48.26;7.37 +DN50;60.32;7.82 +DN65;73.02;10.31 +DN80;88.9;10.97 +DN90;101.6;11.48 +DN100;114.3;12.04 +DN125;141.3;13.11 +DN150;168.27;14.22 +DN200;219.07;16.35 +DN250;273.05;18.54 +DN300;323.85;20.62 +DN350;355.6;22.25 +DN400;406.4;25.4 +DN450;457.2;28.55 +DN500;508;30.12 +DN600;609.6;34.9 diff --git a/tablez/Pipe_SCH-60.csv b/tablez/Pipe_SCH-60.csv new file mode 100644 index 0000000..99af0e8 --- /dev/null +++ b/tablez/Pipe_SCH-60.csv @@ -0,0 +1,9 @@ +PSize;OD;thk +DN200;219.07;20.62 +DN250;273.05;25.4 +DN300;323.85;28.55 +DN350;355.6;30.12 +DN400;406.4;33.32 +DN450;457.2;38.1 +DN500;508;41.25 +DN600;609.6;49.17 diff --git a/tablez/Pipe_SCH-80.csv b/tablez/Pipe_SCH-80.csv new file mode 100644 index 0000000..4520ef0 --- /dev/null +++ b/tablez/Pipe_SCH-80.csv @@ -0,0 +1,21 @@ +PSize;OD;thk +DN15;21.34;7.47 +DN20;26.67;7.82 +DN25;33.4;9.09 +DN32;42.16;9.7 +DN40;48.26;10.16 +DN50;60.32;11.07 +DN65;73.02;14.02 +DN80;88.9;15.24 +DN90;101.6;16.15 +DN100;114.3;17.12 +DN125;141.3;19.05 +DN150;168.27;21.94 +DN200;219.07;25.39 +DN250;273.05;30.12 +DN300;323.85;34.9 +DN350;355.6;38.1 +DN400;406.4;42.82 +DN450;457.2;47.6 +DN500;508;52.37 +DN600;609.6;61.87 diff --git a/tablez/Pipe_SCH-XS.csv b/tablez/Pipe_SCH-XS.csv new file mode 100644 index 0000000..fd135db --- /dev/null +++ b/tablez/Pipe_SCH-XS.csv @@ -0,0 +1,21 @@ +PSize;OD;thk +DN15;21.34;7.47 +DN20;26.67;7.82 +DN25;33.4;9.09 +DN32;42.16;9.7 +DN40;48.26;10.16 +DN50;60.32;11.07 +DN65;73.02;14.02 +DN80;88.9;15.24 +DN90;101.6;16.15 +DN100;114.3;17.12 +DN125;141.3;19.05 +DN150;168.27;21.94 +DN200;219.07;25.39 +DN250;273.05;25.4 +DN300;323.85;25.4 +DN350;355.6;25.4 +DN400;406.4;25.4 +DN450;457.2;25.4 +DN500;508;25.4 +DN600;609.6;25.4 From 66725920c80683c7e61f884ac0bf9463ace8a568 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 7 Nov 2024 17:52:47 -0600 Subject: [PATCH 083/135] Update some icons, part 2 Get better contrast on dark themes --- CPipe.py | 2 +- iconz/delta.svg | 1088 ++++++++++++++++++-------------- iconz/grid.svg | 425 ++++++------- iconz/hackedL.svg | 540 +++++++++------- iconz/insertAnyZhape.svg | 271 ++++++++ iconz/moveHandle.svg | 652 +++++++++---------- iconz/offsetWP.svg | 501 +++++++-------- iconz/query.svg | 1273 +++++++++++++++++--------------------- iconz/rotWP.svg | 948 +++++++++++++++++++--------- iconz/solids.svg | 760 ++++++++--------------- 10 files changed, 3385 insertions(+), 3075 deletions(-) create mode 100644 iconz/insertAnyZhape.svg diff --git a/CPipe.py b/CPipe.py index 625c1cc..591177e 100644 --- a/CPipe.py +++ b/CPipe.py @@ -429,9 +429,9 @@ def Activated(self): def GetResources(self): return { + "Pixmap": get_icon_path("insertAnyZhape"), "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertAnyz", "Insert any shape"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertAnyz", "Insert a STEP, IGES or BREP"), - # TODO: Create an icon } diff --git a/iconz/delta.svg b/iconz/delta.svg index f12eb80..44bdb44 100644 --- a/iconz/delta.svg +++ b/iconz/delta.svg @@ -1,473 +1,625 @@ - - - - - - - - - - - - - - + + + + + Quetzal - Delta + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Delta + + + + + + + + + + + + + - - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - \ No newline at end of file + diff --git a/iconz/grid.svg b/iconz/grid.svg index 8da44c2..fd75c98 100644 --- a/iconz/grid.svg +++ b/iconz/grid.svg @@ -1,237 +1,194 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + Quetzal - Grid + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Grid + + + + + + + + + + + + + + + - - - \ No newline at end of file + + + + + + diff --git a/iconz/hackedL.svg b/iconz/hackedL.svg index 613ac5b..2a2e0fa 100644 --- a/iconz/hackedL.svg +++ b/iconz/hackedL.svg @@ -1,246 +1,306 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Quetzal - Hacked Line + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Hacked Line + Modification from Draft_wire + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - + + + + + - - - - - - - - + + + + + - - - - \ No newline at end of file + diff --git a/iconz/insertAnyZhape.svg b/iconz/insertAnyZhape.svg new file mode 100644 index 0000000..f0eb1c2 --- /dev/null +++ b/iconz/insertAnyZhape.svg @@ -0,0 +1,271 @@ + + + + + Quetzal - Insert any Shape + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Insert any Shape + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iconz/moveHandle.svg b/iconz/moveHandle.svg index f1255b4..d6dd0da 100644 --- a/iconz/moveHandle.svg +++ b/iconz/moveHandle.svg @@ -1,363 +1,295 @@ - - - - - - - - - - - - - - + + + + + Quetzal - Move Handle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Move Handle + + + + + + + + + + + + + + + - - + + + + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/iconz/offsetWP.svg b/iconz/offsetWP.svg index 677a4b6..e2d3831 100644 --- a/iconz/offsetWP.svg +++ b/iconz/offsetWP.svg @@ -1,273 +1,232 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Quetzal - Offset Workplane + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Offset Workplane + + + + + + + + + + + + + + + - - - \ No newline at end of file + + + + + + + + diff --git a/iconz/query.svg b/iconz/query.svg index dd3479a..cbe8383 100644 --- a/iconz/query.svg +++ b/iconz/query.svg @@ -1,696 +1,585 @@ - - - - - - - - - - - - - - + + + + + Quetzal - Query the Model + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Query the Model + + + + + + + + + + + + + - - + - - + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/iconz/rotWP.svg b/iconz/rotWP.svg index db73c42..cea286f 100644 --- a/iconz/rotWP.svg +++ b/iconz/rotWP.svg @@ -1,297 +1,663 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Quetzal - Rotate Workplane + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Rotate Workplane + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + - - + + + + + + + + - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - \ No newline at end of file + + diff --git a/iconz/solids.svg b/iconz/solids.svg index 949a2b5..6450eb6 100644 --- a/iconz/solids.svg +++ b/iconz/solids.svg @@ -1,519 +1,243 @@ - - - - - - - - - - - - - - - - - + + + + + Quetzal - Select Solids + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Select Solids + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + From 0d535fe63ab8827e87910c310788bd13b6ffd5c0 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 12 Jan 2025 17:13:42 -0600 Subject: [PATCH 084/135] Fix typos --- CUtils.py | 3 ++- fFeatures.py | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CUtils.py b/CUtils.py index 0aff878..9eb9f7f 100644 --- a/CUtils.py +++ b/CUtils.py @@ -161,7 +161,8 @@ def GetResources(self): "MenuText": QT_TRANSLATE_NOOP("Quetzal_DpCalc", "Pressure loss calculator"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_DpCalc", - 'Calculate pressure loss in "pypes" using ChEDL libraries.\n See __doc__ of the module for further information.', + "Calculate pressure loss in 'pypes' using ChEDL libraries.\n" + "See __doc__ of the module for further information.", ), } diff --git a/fFeatures.py b/fFeatures.py index 6787e6b..d295772 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -754,7 +754,7 @@ def accept(self): if self.form.editName.text(): name = self.form.editName.text() else: - name = translate("makeframenbranch","Travatura") + name = translate("makeframenbranch","Structure") # Travatura is Structure? a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", name) FrameBranch(a, bases[0], profile) ViewProviderFrameBranch(a.ViewObject) @@ -1677,13 +1677,13 @@ def __init__(self, obj, profile): "App::PropertyLength", "r1", "Draft", - QT_TRANSLATE_NOOP("App::Property", "Radius of cornes r1"), + QT_TRANSLATE_NOOP("App::Property", "Radius of corner r1"), ).r1 = float(self.sa[3]) obj.addProperty( "App::PropertyLength", "r2", "Draft", - QT_TRANSLATE_NOOP("App::Property", "Radius of cornes r2"), + QT_TRANSLATE_NOOP("App::Property", "Radius of corner r2"), ).r2 = float(self.sa[4]) _Profile.__init__(self, obj, profile) return @@ -1746,13 +1746,13 @@ def __init__(self, obj, profile): "App::PropertyLength", "r1", "Draft", - QT_TRANSLATE_NOOP("App::Property", "Radius of cornes r1"), + QT_TRANSLATE_NOOP("App::Property", "Radius of corner r1"), ).r1 = float(self.sa[3]) obj.addProperty( "App::PropertyLength", "r2", "Draft", - QT_TRANSLATE_NOOP("App::Property", "Radius of cornes r2"), + QT_TRANSLATE_NOOP("App::Property", "Radius of corner r2"), ).r2 = float(self.sa[4]) _Profile.__init__(self, obj, profile) return From f173ccc484f761708d356ceac8fac85ba98eb647 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 12 Jan 2025 17:25:02 -0600 Subject: [PATCH 085/135] Update translations - Include script to download translations via CrowdIn API - Update bash script - Bring new translations from CrowdIn --- translationz/Quetzal.ts | 1585 ++++--- translationz/Quetzal_de.qm | Bin 0 -> 1419 bytes translationz/Quetzal_de.ts | 2965 +++++++++++++ translationz/Quetzal_el.qm | Bin 0 -> 31112 bytes translationz/Quetzal_el.ts | 2968 +++++++++++++ translationz/Quetzal_es-AR.qm | Bin 0 -> 50592 bytes .../{dodo_es-ES.ts => Quetzal_es-AR.ts} | 3793 ++++++++--------- translationz/Quetzal_es-ES.qm | Bin 45363 -> 50592 bytes translationz/Quetzal_es-ES.ts | 1435 ++++--- translationz/Quetzal_pl.qm | Bin 0 -> 22480 bytes translationz/Quetzal_pl.ts | 2981 +++++++++++++ translationz/Quetzal_sv-SE.qm | Bin 0 -> 4196 bytes translationz/Quetzal_sv-SE.ts | 2965 +++++++++++++ translationz/dodo.ts | 3174 -------------- translationz/dodo_es-ES.qm | Bin 50817 -> 0 bytes translationz/update_crowdin.py | 432 ++ translationz/update_translation.sh | 50 +- 17 files changed, 15959 insertions(+), 6389 deletions(-) create mode 100644 translationz/Quetzal_de.qm create mode 100644 translationz/Quetzal_de.ts create mode 100644 translationz/Quetzal_el.qm create mode 100644 translationz/Quetzal_el.ts create mode 100644 translationz/Quetzal_es-AR.qm rename translationz/{dodo_es-ES.ts => Quetzal_es-AR.ts} (56%) create mode 100644 translationz/Quetzal_pl.qm create mode 100644 translationz/Quetzal_pl.ts create mode 100644 translationz/Quetzal_sv-SE.qm create mode 100644 translationz/Quetzal_sv-SE.ts delete mode 100644 translationz/dodo.ts delete mode 100644 translationz/dodo_es-ES.qm create mode 100755 translationz/update_crowdin.py diff --git a/translationz/Quetzal.ts b/translationz/Quetzal.ts index 74c6f5f..af70714 100644 --- a/translationz/Quetzal.ts +++ b/translationz/Quetzal.ts @@ -4,421 +4,461 @@ App::Property - - - - - - - Outside diameter + + + The extension of the tail - - - - - - - - Wall thickness + + + The extension of the head - - - - - Inside diameter + + + The rotation of the section - - - Length of tube + + + Type of frameFeature - - - - - Section dim. + + Size of frame - - Bend Angle + + the edges - - - Bend Radius + + the profile - - Type of flange + + The beams names - - Flange diameter + + + The path. - - Bore diameter + + The profile - - Bolts distance + + + + + + + + + + + + Type of section - - Bolts hole diameter + + + + + + + + + Width of the beam - - Thickness of flange + + + + + + + + + + + Height of the beam - - Nr. of bolts + + Thickness of the vertical sides - - Thickness of raised face + + Thickness of the horizontal sides - - Diameter of raised face + + Diameter of the beam - - Length of welding neck + + Thickness - - Diameter of welding neck + + + + + Thickness of the webs - - Outside diameter of pipe + + + Radius of corner r1 - - Major diameter + + + Radius of corner r2 - - Minor diameter + + + + Thickness of the web - - Make the length variable + + Thickness of the flanges - - Length of reduction + + Width of the flanges - - Concentric or Eccentric + + + + Thickness 1 - - the radius of bending + + + + Thickness 2 - - - The extension of the tail + + + + Thickness 3 - - - The extension of the head + + + Width of the bottom flange - - - The rotation of the section + + + Width of the top flange - - - Type of frameFeature + + Type of tubeFeature - - Size of frame + + Rating of pipeFeature - - The group. + + Nominal diameter - - the edges + + + Ports position relative to the origin of Shape - - the profile + + Flow factor (m3/h/bar) - - The beams names + + + + + + + Outside diameter - - The profile + + + + + + + + Wall thickness - - - - - - - - - - Type of section + + + + + Inside diameter - - - - - - - Width of the beam + + + Length of tube - - - - - - - - - Height of the beam + + + + + Section dim. - - Thickness of the vertical sides + + Bend Angle - - Thickness of the horizontal sides + + + Bend Radius - - Diameter of the beam + + Type of flange - - Thickness + + Flange diameter - - - Thickness of the webs + + Bore diameter - - - - Thickness of the web + + Bolts distance - - Thickness of the flanges + + Bolts hole diameter - - Width of the flanges + + Thickness of flange - - - - Thickness 1 + + Nr. of bolts - - - - Thickness 2 + + Thickness of raised face - - - - Thickness 3 + + Diameter of raised face - - - Width of the bottom flange + + Length of welding neck - - - Width of the top flange + + Diameter of welding neck - - Type of pipeFeature + + Outside diameter of pipe - - Type of clamp + + Flange fillet radius - - Size of clamp + + Flange neck length - - Arc diameter + + Socket diameter - - Overall height + + Socket depth - - Rod diameter + + Major diameter - - Size of thread + + Minor diameter - - - Ports position relative to the origin of Shape + + Make the length variable - - Type of tubeFeature + + Length of reduction - - Rating of pipeFeature + + Concentric or Eccentric - - Nominal diameter + + the radius of bending - - Flow factor (m3/h/bar) + + The group. + + + + + Type of pipeFeature + + + + + Type of clamp - + + Size of clamp + + + + + Arc diameter + + + + + Overall height + + + + + Rod diameter + + + + + Size of thread + + + + Tank's length - + Tank's width - + Tank's height - - Thikness of tank's shell + + Thickness of tank's shell - - Thikness of tank's top + + Thickness of tank's top - + The tubes of the branch. - + The curves of the branch. - - - - The path. - - App::PropertyString - + The group. @@ -812,83 +852,88 @@ - - <degrees> + + AddBeams - - offset tail + + Generate planes - - Trim/Extend + + RemoveBeams - - AddBeams + + Cut Miters - - ChangeProfile + + offset head - - <name> + + <no target selected> - - <no item selected> + + <degrees> - - Redraw + + Add single - - offset head + + <length> - - RemoveBeams + + hotkeys: "S" to select, "X" to trim - + Get targets - - <length> + + offset tail - - hotkeys: "S" to select, "X" to trim + + Redraw - - <no target selected> + + Trim/Extend - - Slice Intersections + + <no item selected> - - Add single + + ChangeProfile + + + + + <name> @@ -994,7 +1039,7 @@ DialogQM - + Quick Insert @@ -1290,189 +1335,309 @@ profile - Quetzal_AdjustFrameAngle + Objects - - adjustFrameAngle + + Rectangular hollow + Profile name in the Tree View - - Adjust the angle of frame by two edges + + Rectangular solid + Profile name in the Tree View - - - Quetzal_AlignEdge - - Mate the edges + + Circle-profile + Profile name in the Tree View - - Join two edges: select two or pre-select several + + L-profile + Profile name in the Tree View - - - Quetzal_AlignFlange - - alignFlange + + U-profile + Profile name in the Tree View - - Rotates the section of the beam to make the faces parallel to another face + + T-profile + Profile name in the Tree View - - - Quetzal_Attach2tube - - Attach to tube + + Z-profile + Profile name in the Tree View - - Attach one pype to the nearest port of selected pipe + + Omega-profile + Profile name in the Tree View - - - Quetzal_BreakPipe - - Break the pipe + + H-profile + Profile name in the Tree View - - Break one pipe at point and insert gap + + Tube - - - Quetzal_CreateCutList - - createCutList + + Elbow - - Create a new Cut List from Dodo Beams + + Flange - - - Quetzal_DpCalc - - Pressure loss calculator + + Reduct - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. + + U-Bolt - - - Quetzal_Extend - - extendTheBeam + + Tank - - Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + Cap - - - Quetzal_Extend1intersection - - - Extends pipe to intersection + + Valve - - - Quetzal_Extend2intersection - - - Extends pipes to intersection + + Pipe route - Quetzal_Flat + Quetzal_AdjustFrameAngle - - Fit one elbow + + Adjust frame angle - - Place the elbow between two pipes or beams + + Adjust the angle of frame by two edges - Quetzal_FrameBranchManager + Quetzal_AlignEdge - - FrameBranch Manager + + Mate the edges - - Open FrameBranch Manager + + Join two edges: select two or pre-select several - Quetzal_FrameIt + Quetzal_AlignFlange - - Place one-beam over one-edge + + Align flange - + + Rotates the section of the beam to make the faces parallel to another face + + + + + Quetzal_Attach2Tube + + + Attach to tube + + + + + Attach one pype to the nearest port of selected pipe + + + + + Quetzal_BreakPipe + + + Break the pipe + + + + + Break one pipe at point and insert gap + + + + + Quetzal_CapQM + + + QM for caps + + + + + Quetzal_CreateCutList + + + createCutList + + + + + Create a new Cut List from Quetzal Beams + + + + + Quetzal_ElbowQM + + + QM for elbows + + + + + Quetzal_ExtendBeam + + + Extend the beam + + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + + + + Quetzal_ExtendIntersection1 + + + Extend pipe to intersection + + + + + Extends pipe to intersection + + + + + Quetzal_ExtendIntersection2 + + + Extend pipes to intersection + + + + + Extends pipes to intersection + + + + + Quetzal_FlangeQM + + + QM for flanges + + + + + Quetzal_Flat + + + Fit one elbow + + + + + Place the elbow between two pipes or beams + + + + + Quetzal_FrameBranchManager + + + FrameBranch Manager + + + + + Open FrameBranch Manager + + + + + Quetzal_FrameIt + + + Place one-beam over one-edge + + + + Place one beam after the other over the edges - Quetzal_HackedL + Quetzal_HackedLine - - draw a DWire + + Draw a Draft wire - + WP is re-positioned at each point. Possible to spin and offset it. - Quetzal_InsertAnyz + Quetzal_InsertAnyShape - + Insert any shape - + Insert a STEP, IGES or BREP @@ -1480,12 +1645,12 @@ profile Quetzal_InsertBranch - + Insert a branch - + Insert a PypeBranch @@ -1502,8 +1667,8 @@ profile Quetzal_InsertElbow - - + + Insert a curve @@ -1511,8 +1676,8 @@ profile Quetzal_InsertFlange - - + + Insert a flange @@ -1520,12 +1685,12 @@ profile Quetzal_InsertPath - - insert Path + + Insert path - + Creates one path along selected edges @@ -1533,8 +1698,8 @@ profile Quetzal_InsertPipe - - + + Insert a tube @@ -1542,12 +1707,12 @@ profile Quetzal_InsertPypeLine - + PypeLine Manager - + Open PypeLine Manager @@ -1555,8 +1720,8 @@ profile Quetzal_InsertReduct - - + + Insert a reduction @@ -1564,12 +1729,12 @@ profile Quetzal_InsertRoute - + Insert a pipe route - + Create a sketch attached to a circular edge @@ -1577,12 +1742,12 @@ profile Quetzal_InsertSection - + Insert sections - + Creates customized beam profiles 2D @@ -1590,12 +1755,12 @@ profile Quetzal_InsertTank - + Insert a tank - + Create tank and nozzles @@ -1603,8 +1768,8 @@ profile Quetzal_InsertUbolt - - + + Insert a U-bolt @@ -1612,8 +1777,8 @@ profile Quetzal_InsertValve - - + + Insert a valve @@ -1621,12 +1786,12 @@ profile Quetzal_JoinPype - - Join pypes + + Join pipes - + Select the part-pype and the port @@ -1634,12 +1799,12 @@ profile Quetzal_Laydown - + Lay-down the pipe - + Lay-down the pipe on the support plane @@ -1647,12 +1812,12 @@ profile Quetzal_LevelBeam - + Flush the surfaces - + Shift the beams to line-up the faces to the first selection (faces must be //) @@ -1660,12 +1825,12 @@ profile Quetzal_MakeHeader - + Connect to header - + Connect branches to one header pipe Branches and header's axes must be ortho @@ -1674,12 +1839,12 @@ Branches and header's axes must be ortho Quetzal_MateEdges - + Mate pipes edges - + Mate two terminations through their edges @@ -1687,12 +1852,12 @@ Branches and header's axes must be ortho Quetzal_MoveHandle - + Move objects - + Move quickly objects inside viewport @@ -1700,12 +1865,12 @@ Branches and header's axes must be ortho Quetzal_MoveWorkPlane - - align Workplane + + Align workplane - + Moves and rotates the drafting workplane with points, edges and faces @@ -1713,61 +1878,83 @@ Branches and header's axes must be ortho Quetzal_OffsetWorkPlane - + Offset Work Plane - + Offset: - - offset Workplane + + Offset workplane - + Shifts the WP along its normal. + + Quetzal_PipeQM + + + QM for pipes + + + Quetzal_PivotBeam - - pivotTheBeam + + Pivot the beam - + Rotates the beam around an axis (edge or center-of-curvature) - Quetzal_Point2point + Quetzal_Point2Point - - draw a tube point-to-point + + Draw a tube point by point - - Click on subsequent points. + + A new body is created on each click on subsequent points + + + + + Quetzal_PressureLossCalculator + + + Pressure loss calculator + + + + + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. Quetzal_QueryModel - - query the model + + Query the model - + Click objects to print infos @@ -1775,12 +1962,12 @@ Branches and header's axes must be ortho Quetzal_Raiseup - + Raise-up the support - + Raise the support to the pipe @@ -1788,25 +1975,25 @@ Branches and header's axes must be ortho Quetzal_ReverseBeam - + Reverse orientation - + Reverse the orientation of selected objects - Quetzal_RotJoin + Quetzal_RotateJoin - - rotJoinEdge + + Rotate join to edge - + Rotates and align the beam according another edge @@ -1814,12 +2001,12 @@ Branches and header's axes must be ortho Quetzal_RotateWorkPlane - - rotate Workplane + + Rotate workplane - + Spin the Draft working plane about one of its axes @@ -1827,12 +2014,12 @@ Branches and header's axes must be ortho Quetzal_SelectSolids - + Select solids - + Grab all solids or those partially selected to export in .step format @@ -1841,25 +2028,25 @@ Branches and header's axes must be ortho Quetzal_ShiftBeam - - shiftTheBeam + + Shift the beam - + Translate objects by vectors defined on existing geometry - Quetzal_SpinSect + Quetzal_SpinSection - + Spin beams by 45 deg. - + Rotates the section of the beam by 45 degrees @@ -1867,16 +2054,252 @@ Branches and header's axes must be ortho Quetzal_StretchBeam - - stretchTheBeam + + Stretch the beam - + Changes the length of the beam, either according a preselected edge or a direct input + + Quetzal_ValveQM + + + QM for valves + + + + + Transaction + + + Spin + + + + + Reverse + + + + + Level The Beams + + + + + Align Edge + + + + + Rotate to Join on Edge + + + + + Make Path + + + + + Mate + + + + + Extend pipes to intersection + + + + + Extend pipe to intersection + + + + + Lay-down the pipe + + + + + Raise-up the support + + + + + Attach to tube + + + + + Connect to header + + + + + Insert Single Structure + + + + + Insert Frame Branch + + + + + Trim Frame Branch + + + + + Update Frame Line + + + + + Fill frame + + + + + Extend beam + + + + + Stretch beam + + + + + Translate + + + + + Align Flange + + + + + Rotate The Beam Around + + + + + Insert profile + + + + + Modify profile + + + + + Adjust angle + + + + + Insert pipe + + + + + Insert elbow + + + + + Insert flange + + + + + Insert cap + + + + + Insert valve + + + + + Place one curve + + + + + Redraw pipe-lines + + + + + Trim pipes + + + + + Insert reduction + + + + + Insert clamp in (0,0,0) + + + + + Insert clamp on tube + + + + + Insert pipe line + + + + + Assign Base + + + + + Insert pipe branch + + + + + Break pipes + + + + + Point to Point + + + + + Add nozzles + + + + + Make pipe route + + + + + Join + + + Workbench @@ -1890,142 +2313,124 @@ Branches and header's axes must be ortho - - pypetools - - - - + Frame tools - - Pype tools + + + + Utils - - - Utils + + + + Pipe tools - + QM Menus - + Frames - - Pypes + + Pipes breakForm - + Break the pipes - + Length - + <reference> - + PypeLine: - - + + <none> - + <new> - - capQM - - - QM for caps - - - dpCalcDialog - - + + *** CUSTOM FLUID *** - + <custom fluid> - - + + No data found - + It seems the fluid has not a liquid state. - + *** LIQUID *** - + Flow (m3/h) - + It seems the fluid has not a gas state. - + *** GAS/VAPOUR *** - + Flow (kg/h) - - elbowQM - - - QM for elbows - - - fObservers @@ -2034,98 +2439,84 @@ Branches and header's axes must be ortho - + First select the base beam, then the edges - + First select the target plane, then the faces to align - + levelTheBeam Transaction - + Select the target face, then the others - + alignFlange Transaction - + Select two edges to join. - + joinTheBeamsEdges Transaction - + Select the beam and input the length - + First Select the target shape, then the beams to extend. - + Select 2 edges - - Adjust angle - Transaction - - - - + Select 2 edges =>[Ctrl]+select - + rotJoin Transaction - - flangeQM - - - QM for flanges - - - insertBranchForm - + Insert a branch - + <name> - + <bend radius> @@ -2133,17 +2524,17 @@ Branches and header's axes must be ortho insertCapForm - + Insert caps - + Reverse - + Apply @@ -2151,48 +2542,48 @@ Branches and header's axes must be ortho insertElbowForm - + Insert elbows - + <bend angle> - + <bend radius> - + Trim/Extend - + Reverse - + Apply - + 0 deg - + Wrong selection - + deg @@ -2200,17 +2591,17 @@ Branches and header's axes must be ortho insertFlangeForm - + Insert flanges - + Reverse - + Apply @@ -2218,22 +2609,22 @@ Branches and header's axes must be ortho insertPipeForm - + Insert pipes - + <length> - + Reverse - + Apply @@ -2241,48 +2632,48 @@ Branches and header's axes must be ortho insertPypeLineForm - + PypeLine Manager - + <name> - + Redraw - + Part list - + Color - + Get Path - + Get Profile - - - - - - - + + + + + + + <new> @@ -2290,22 +2681,22 @@ Branches and header's axes must be ortho insertReductForm - + Insert reductions - + Reverse - + Apply - + Eccentric @@ -2313,63 +2704,40 @@ Branches and header's axes must be ortho insertRouteForm - + <select an edge> - - insertTankForm - - - doing combine - - - - - files read - - - - - files not read - - - - - listNozzles: %s - - - insertUboltForm - + Insert U-bolt - + - no ref. face - - + Ref. face - + Head - + Middle - + Tail @@ -2377,22 +2745,22 @@ Branches and header's axes must be ortho insertValveForm - + Insert valves - + Reverse - + Apply - + Insert in pipe @@ -2400,15 +2768,15 @@ Branches and header's axes must be ortho makeframenbranch - - Travatura + + Structure mouseActionB1 - + ____TAIL @@ -2416,33 +2784,25 @@ Branches and header's axes must be ortho pForms - + Offset Work Plane - + Offset: - - pipeQM - - - QM for pipes - - - point2pointPipe - + Reset - + Move WP on click @@ -2450,82 +2810,21 @@ Branches and header's axes must be ortho profEdit - - Square - Profile name in the Tree View - - - - - T-profile - Profile name in the Tree View - - - - - U-profile - Profile name in the Tree View - - - - - H-profile - Profile name in the Tree View - - - - - L-profile - Profile name in the Tree View - - - - - Z-profile - Profile name in the Tree View - - - - - Omega-profile - Profile name in the Tree View - - - - - Circle-profile - Profile name in the Tree View - - - - - Insert profile - Transaction, used on undo/redo lists - - - - - Modify profile - Transaction, used on undo/redo lists - - - - + Shift profile - Transaction, used on undo/redo lists protoPypeForm - - + + Rating: - + Insert @@ -2533,17 +2832,17 @@ Branches and header's axes must be ortho protoTypeDialog - + "%s" to select; "%s" to execute - + No view available. - + Actions "%s" and "%s" removed @@ -2551,12 +2850,12 @@ Branches and header's axes must be ortho rotWPForm - + Angle: - + Rotate working plane @@ -2564,18 +2863,18 @@ Branches and header's axes must be ortho uCmd - + Quick move Transaction - + Offset Work Plane - + Offset: @@ -2623,42 +2922,34 @@ Branches and header's axes must be ortho - + (Sub object property) - + (Beam property) - + (Profile property) - + QueryObject - + Exit - + Rotate WP - - valveQM - - - QM for valves - - - diff --git a/translationz/Quetzal_de.qm b/translationz/Quetzal_de.qm new file mode 100644 index 0000000000000000000000000000000000000000..ace5d8255f05423622a01f2eac30f15371adbe01 GIT binary patch literal 1419 zcmb7EJ!lj`6n?jNyIwBl2bGY*;csJbL%(6Qh6I&7N zHC-CDP%8x+8xh4uAx1>75*w{8Z7lp|X4$CWNWwDv<}vSm@8^3n=U)WF?|*J?Y@Im% z>e~I6Ump>X6R;}8GprG!+>n*d56DsI7a;nH@!Pt83BUXaSW?zVb}*j2CghC!0I`SBCP z?VitDh+hx`4~8b7f8kJ`=dl~2Dsf`ez`B8*pcZ!RB96$zDpi>X%HyKZW{05mjfdgb z*nA{I7OC~z{|FKJ6aXcmI78?)2n&9|leh~+na1Jr4S@yR6N;!#P3l08@iB@ru)#}- zih01w0rxvhv8W5;Fyi@PP{&`4&S8__WaYTR$jMwR)U z#U{V5Oz94d?wE~sH9Jf-^u(t&Nor&co<-DNCA+QhI80kQNoy3sJVN%Go=Ep*$8~Zo zl#$Y|#njb07HJM~(74RBFo!*IO)@<${^ShUu!I=Qjvy8EO>W{3kVc zfyK;ZmUe7LaxuRive*FZ8TY7-iwRS5o`-BoMjhkXPm^XmV-$#>S%Ka~5n~p0iCukn z)7fjoEXYLJ$~>y*FN4ijDiw{{XAKuwU2!S)S3^qYk}q1up+vJ7L80$hhVRWX(NIkt z;(+EoD-rWsSzk&tg^onD@)x)}A=}bijU(K2M-!k)%)AanWC#k?Y4g{V?3a$d(2$7G xS=f`bXs))v%(U_83tq+xq~9L<2JH-a>2iWgTJFeIGrxsoq7&rqpkGcd_Xm4090vdZ literal 0 HcmV?d00001 diff --git a/translationz/Quetzal_de.ts b/translationz/Quetzal_de.ts new file mode 100644 index 0000000..a711e4f --- /dev/null +++ b/translationz/Quetzal_de.ts @@ -0,0 +1,2965 @@ + + + + + App::Property + + + + The extension of the tail + The extension of the tail + + + + + The extension of the head + The extension of the head + + + + + The rotation of the section + The rotation of the section + + + + + Type of frameFeature + Type of frameFeature + + + + Size of frame + Size of frame + + + + the edges + the edges + + + + the profile + the profile + + + + The beams names + The beams names + + + + + The path. + The path. + + + + The profile + The profile + + + + + + + + + + + + + + Type of section + Type of section + + + + + + + + + + + Width of the beam + Width of the beam + + + + + + + + + + + + + Height of the beam + Height of the beam + + + + Thickness of the vertical sides + Thickness of the vertical sides + + + + Thickness of the horizontal sides + Thickness of the horizontal sides + + + + Diameter of the beam + Diameter of the beam + + + + Thickness + Wandstärke + + + + + + + Thickness of the webs + Thickness of the webs + + + + + Radius of corner r1 + Radius of corner r1 + + + + + Radius of corner r2 + Radius of corner r2 + + + + + + Thickness of the web + Thickness of the web + + + + Thickness of the flanges + Thickness of the flanges + + + + Width of the flanges + Width of the flanges + + + + + + Thickness 1 + Thickness 1 + + + + + + Thickness 2 + Thickness 2 + + + + + + Thickness 3 + Thickness 3 + + + + + Width of the bottom flange + Width of the bottom flange + + + + + Width of the top flange + Width of the top flange + + + + Type of tubeFeature + Type of tubeFeature + + + + Rating of pipeFeature + Rating of pipeFeature + + + + Nominal diameter + Nominal diameter + + + + + Ports position relative to the origin of Shape + Ports position relative to the origin of Shape + + + + Flow factor (m3/h/bar) + Flow factor (m3/h/bar) + + + + + + + + + Outside diameter + Außendurchmesser + + + + + + + + + + Wall thickness + Wall thickness + + + + + + + Inside diameter + Inside diameter + + + + + Length of tube + Length of tube + + + + + + + Section dim. + Section dim. + + + + Bend Angle + Biegewinkel + + + + + Bend Radius + Biegeradius + + + + Type of flange + Type of flange + + + + Flange diameter + Flange diameter + + + + Bore diameter + Bore diameter + + + + Bolts distance + Bolts distance + + + + Bolts hole diameter + Bolts hole diameter + + + + Thickness of flange + Thickness of flange + + + + Nr. of bolts + Nr. of bolts + + + + Thickness of raised face + Thickness of raised face + + + + Diameter of raised face + Diameter of raised face + + + + Length of welding neck + Length of welding neck + + + + Diameter of welding neck + Diameter of welding neck + + + + Outside diameter of pipe + Outside diameter of pipe + + + + Flange fillet radius + Flange fillet radius + + + + Flange neck length + + + + + Socket diameter + Socket diameter + + + + Socket depth + Socket depth + + + + Major diameter + Major diameter + + + + Minor diameter + Minor diameter + + + + Make the length variable + Make the length variable + + + + Length of reduction + Length of reduction + + + + Concentric or Eccentric + Concentric or Eccentric + + + + the radius of bending + the radius of bending + + + + The group. + The group. + + + + Type of pipeFeature + Type of pipeFeature + + + + Type of clamp + Type of clamp + + + + Size of clamp + Size of clamp + + + + Arc diameter + Arc diameter + + + + Overall height + Overall height + + + + Rod diameter + Rod diameter + + + + Size of thread + Size of thread + + + + Tank's length + Tank's length + + + + Tank's width + Tank's width + + + + Tank's height + Tank's height + + + + Thickness of tank's shell + Thickness of tank's shell + + + + Thickness of tank's top + Thickness of tank's top + + + + The tubes of the branch. + The tubes of the branch. + + + + The curves of the branch. + The curves of the branch. + + + + App::PropertyString + + + The group. + The group. + + + + DialogAlign + + + Align flanges + Align flanges + + + + normY + normY + + + + YZ + YZ + + + + (S)elect face + (S)elect face + + + + XZ + XZ + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + XY + XY + + + + < select a target face > + < select a target face > + + + + Set normal + Set normal + + + + normX + normX + + + + normZ + normZ + + + + Invert normal + Invert normal + + + + DialogBeamShift + + + Move + Move + + + + Multiple: + Multiple: + + + + + 1 + 1 + + + + + + 0 + 0 + + + + Set dist. + Set dist. + + + + Z: + Z: + + + + Steps: + Steps: + + + + Y: + Y: + + + + copy + copy + + + + X: + X: + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + DialogBeamStretch + + + Stretch + Stretch + + + + (S)et length + (S)et length + + + + both + both + + + + head + head + + + + tail + tail + + + + New length - mm: + New length - mm: + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + Stretched end: + Stretched end: + + + + DialogCutList + + + Create Cut List + Create Cut List + + + + Select Profile + Select Profile + + + + Cut List Options + Cut List Options + + + + Group Parts by Size + Group Parts by Size + + + + Nesting Options + Nesting Options + + + + Maximum Stock Length + Maximum Stock Length + + + + Cut Width + Cut Width + + + + Use Nesting + Use Nesting + + + + DialogDisp + + + Dialog + Dialog + + + + Angle: + Angle: + + + + SET + SET + + + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + + + + Displacement: + Displacement: + + + + 100 + 100 + + + + 90 + 90 + + + + DialogDp + + + Dp calculator + Dp calculator + + + + calculation + calculation + + + + Nr. of curves = 0 + Nr. of curves = 0 + + + + Roughness (um) + Roughness (um) + + + + Flow-rate (m3/h) + Flow-rate (m3/h) + + + + Total length = 0 + Total length = 0 + + + + Scope + Scope + + + + <on selection> + <on selection> + + + + Pipe material + Pipe material + + + + fluid properties + fluid properties + + + + Density (kg/m3) + Density (kg/m3) + + + + liquid + liquid + + + + T (°C) + T (°C) + + + + Viscosity (cP) + Viscosity (cP) + + + + gas/vapour + gas/vapour + + + + Name + Name + + + + P abs. (bar) + P abs. (bar) + + + + results + results + + + + Export + Exportieren + + + + *** LIQUID *** + *** LIQUID *** + + + + --- + --- + + + + DialogExtend + + + Extend beams + Extend beams + + + + < select a target > + < select a target > + + + + (S)elect target + (S)elect target + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + DialogFBranch + + + FrameBranch Manager + FrameBranch Manager + + + + AddBeams + AddBeams + + + + Generate planes + Generate planes + + + + RemoveBeams + RemoveBeams + + + + Cut Miters + Cut Miters + + + + offset head + offset head + + + + <no target selected> + <no target selected> + + + + <degrees> + <degrees> + + + + Add single + Add single + + + + <length> + <length> + + + + hotkeys: "S" to select, "X" to trim + hotkeys: "S" to select, "X" to trim + + + + Get targets + Get targets + + + + offset tail + offset tail + + + + Redraw + Redraw + + + + Trim/Extend + Trim/Extend + + + + <no item selected> + <no item selected> + + + + ChangeProfile + ChangeProfile + + + + <name> + <name> + + + + DialogFillFrame + + + Fill frame + Fill frame + + + + move + move + + + + (S)elect + (S)elect + + + + < select a beam > + < select a beam > + + + + copy + copy + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + DialogHackedLine + + + Dialog + Dialog + + + + (M)ove origin on click + (M)ove origin on click + + + + (R)otate WP + (R)otate WP + + + + (O)ffset WP + (O)ffset WP + + + + + + Align WP to principal plane + Align WP to principal plane + + + + DialogJoinPypes + + + Join pypes + Join pypes + + + + Reset + Zurücksetzen + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + DialogProtoPipeForm + + + Dialog + Dialog + + + + Rating: + Rating: + + + + Insert + Einsatz + + + + DialogQM + + + Quick Insert + Quick Insert + + + + DialogRotAround + + + Rotate around axis + Rotate around axis + + + + Reverse + Reverse + + + + <select one axis> + <select one axis> + + + + copy items + copy items + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + (S)et axis + (S)et axis + + + + DialogRoute + + + Create pipe route + Create pipe route + + + + Y + Y + + + + X + X + + + + Z + Z + + + + global Z + global Z + + + + Normal to sketch: + Normal to sketch: + + + + Offset (mm): + Offset (mm): + + + + 0 + 0 + + + + <select an edge> + <select an edge> + + + + Get edge + Get edge + + + + (S)et normal + (S)et normal + + + + hotkeys: +"S" to select normal from geometry +"X" to execute + hotkeys: +"S" to select normal from geometry +"X" to execute + + + + DialogSection + + + Beams profile editor + Beams profile editor + + + + <name> + <name> + + + + NW + NW + + + + N + N + + + + NE + NE + + + + W + W + + + + C + C + + + + E + E + + + + SW + SW + + + + S + S + + + + SE + SE + + + + + + + + + + + ... + ... + + + + Full section + Full section + + + + Apply +dimensions + Apply +dimensions + + + + Shift +profile + Shift +profile + + + + DialogShapes + + + Import shapes + Import shapes + + + + <shapes> + <shapes> + + + + DialogTank + + + Dialog + Dialog + + + + Tank + Tank + + + + Length + Länge + + + + X + X + + + + Width: + Width: + + + + Y + Y + + + + Height: + Height: + + + + Z + Z + + + + Nozzles + Nozzles + + + + Pipe type: + Pipe type: + + + + + <select> + <select> + + + + Flange type: + Flange type: + + + + Add nozzle + Add nozzle + + + + DialogValves + + + Insert valves + Insert valves + + + + Apply + Apply + + + + Reverse + Reverse + + + + Type: + Type: + + + + Objects + + + Rectangular hollow + Profile name in the Tree View + + + + + Rectangular solid + Profile name in the Tree View + + + + + Circle-profile + Profile name in the Tree View + Circle-profile + + + + L-profile + Profile name in the Tree View + L-profile + + + + U-profile + Profile name in the Tree View + U-profile + + + + T-profile + Profile name in the Tree View + T-profile + + + + Z-profile + Profile name in the Tree View + Z-profile + + + + Omega-profile + Profile name in the Tree View + Omega-profile + + + + H-profile + Profile name in the Tree View + H-profile + + + + Tube + + + + + Elbow + + + + + Flange + + + + + Reduct + + + + + U-Bolt + + + + + Tank + Tank + + + + Cap + + + + + Valve + + + + + Pipe route + + + + + Quetzal_AdjustFrameAngle + + + Adjust frame angle + + + + + Adjust the angle of frame by two edges + Adjust the angle of frame by two edges + + + + Quetzal_AlignEdge + + + Mate the edges + Mate the edges + + + + Join two edges: select two or pre-select several + Join two edges: select two or pre-select several + + + + Quetzal_AlignFlange + + + Align flange + + + + + Rotates the section of the beam to make the faces parallel to another face + Rotates the section of the beam to make the faces parallel to another face + + + + Quetzal_Attach2Tube + + + Attach to tube + + + + + Attach one pype to the nearest port of selected pipe + Attach one pype to the nearest port of selected pipe + + + + Quetzal_BreakPipe + + + Break the pipe + Break the pipe + + + + Break one pipe at point and insert gap + Break one pipe at point and insert gap + + + + Quetzal_CapQM + + + QM for caps + QM for caps + + + + Quetzal_CreateCutList + + + createCutList + createCutList + + + + Create a new Cut List from Quetzal Beams + Create a new Cut List from Quetzal Beams + + + + Quetzal_ElbowQM + + + QM for elbows + QM for elbows + + + + Quetzal_ExtendBeam + + + Extend the beam + + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + + + Quetzal_ExtendIntersection1 + + + Extend pipe to intersection + + + + + Extends pipe to intersection + Extends pipe to intersection + + + + Quetzal_ExtendIntersection2 + + + Extend pipes to intersection + + + + + Extends pipes to intersection + Extends pipes to intersection + + + + Quetzal_FlangeQM + + + QM for flanges + QM for flanges + + + + Quetzal_Flat + + + Fit one elbow + Fit one elbow + + + + Place the elbow between two pipes or beams + Place the elbow between two pipes or beams + + + + Quetzal_FrameBranchManager + + + FrameBranch Manager + FrameBranch Manager + + + + Open FrameBranch Manager + Open FrameBranch Manager + + + + Quetzal_FrameIt + + + Place one-beam over one-edge + Place one-beam over one-edge + + + + Place one beam after the other over the edges + Place one beam after the other over the edges + + + + Quetzal_HackedLine + + + Draw a Draft wire + + + + + WP is re-positioned at each point. Possible to spin and offset it. + WP is re-positioned at each point. Possible to spin and offset it. + + + + Quetzal_InsertAnyShape + + + Insert any shape + Insert any shape + + + + Insert a STEP, IGES or BREP + Insert a STEP, IGES or BREP + + + + Quetzal_InsertBranch + + + Insert a branch + Insert a branch + + + + Insert a PypeBranch + Insert a PypeBranch + + + + Quetzal_InsertCap + + + + Insert a cap + Insert a cap + + + + Quetzal_InsertElbow + + + + Insert a curve + Insert a curve + + + + Quetzal_InsertFlange + + + + Insert a flange + Insert a flange + + + + Quetzal_InsertPath + + + Insert path + + + + + Creates one path along selected edges + Creates one path along selected edges + + + + Quetzal_InsertPipe + + + + Insert a tube + Insert a tube + + + + Quetzal_InsertPypeLine + + + PypeLine Manager + PypeLine Manager + + + + Open PypeLine Manager + Open PypeLine Manager + + + + Quetzal_InsertReduct + + + + Insert a reduction + Insert a reduction + + + + Quetzal_InsertRoute + + + Insert a pipe route + Insert a pipe route + + + + Create a sketch attached to a circular edge + Create a sketch attached to a circular edge + + + + Quetzal_InsertSection + + + Insert sections + Insert sections + + + + Creates customized beam profiles 2D + Creates customized beam profiles 2D + + + + Quetzal_InsertTank + + + Insert a tank + Insert a tank + + + + Create tank and nozzles + Create tank and nozzles + + + + Quetzal_InsertUbolt + + + + Insert a U-bolt + Insert a U-bolt + + + + Quetzal_InsertValve + + + + Insert a valve + Insert a valve + + + + Quetzal_JoinPype + + + Join pipes + + + + + Select the part-pype and the port + Select the part-pype and the port + + + + Quetzal_Laydown + + + Lay-down the pipe + Lay-down the pipe + + + + Lay-down the pipe on the support plane + Lay-down the pipe on the support plane + + + + Quetzal_LevelBeam + + + Flush the surfaces + Flush the surfaces + + + + Shift the beams to line-up the faces to the first selection (faces must be //) + Shift the beams to line-up the faces to the first selection (faces must be //) + + + + Quetzal_MakeHeader + + + Connect to header + Connect to header + + + + Connect branches to one header pipe +Branches and header's axes must be ortho + Connect branches to one header pipe +Branches and header's axes must be ortho + + + + Quetzal_MateEdges + + + Mate pipes edges + Mate pipes edges + + + + Mate two terminations through their edges + Mate two terminations through their edges + + + + Quetzal_MoveHandle + + + Move objects + Move objects + + + + Move quickly objects inside viewport + Move quickly objects inside viewport + + + + Quetzal_MoveWorkPlane + + + Align workplane + + + + + Moves and rotates the drafting workplane with points, edges and faces + Moves and rotates the drafting workplane with points, edges and faces + + + + Quetzal_OffsetWorkPlane + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + Offset workplane + + + + + Shifts the WP along its normal. + Shifts the WP along its normal. + + + + Quetzal_PipeQM + + + QM for pipes + QM for pipes + + + + Quetzal_PivotBeam + + + Pivot the beam + + + + + Rotates the beam around an axis (edge or center-of-curvature) + Rotates the beam around an axis (edge or center-of-curvature) + + + + Quetzal_Point2Point + + + Draw a tube point by point + + + + + A new body is created on each click on subsequent points + + + + + Quetzal_PressureLossCalculator + + + Pressure loss calculator + Pressure loss calculator + + + + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + + + + Quetzal_QueryModel + + + Query the model + + + + + Click objects to print infos + Click objects to print infos + + + + Quetzal_Raiseup + + + Raise-up the support + Raise-up the support + + + + Raise the support to the pipe + Raise the support to the pipe + + + + Quetzal_ReverseBeam + + + Reverse orientation + Reverse orientation + + + + Reverse the orientation of selected objects + Reverse the orientation of selected objects + + + + Quetzal_RotateJoin + + + Rotate join to edge + + + + + Rotates and align the beam according another edge + Rotates and align the beam according another edge + + + + Quetzal_RotateWorkPlane + + + Rotate workplane + + + + + Spin the Draft working plane about one of its axes + Spin the Draft working plane about one of its axes + + + + Quetzal_SelectSolids + + + Select solids + Select solids + + + + Grab all solids or those partially selected + to export in .step format + Grab all solids or those partially selected + to export in .step format + + + + Quetzal_ShiftBeam + + + Shift the beam + + + + + Translate objects by vectors defined on existing geometry + Translate objects by vectors defined on existing geometry + + + + Quetzal_SpinSection + + + Spin beams by 45 deg. + Spin beams by 45 deg. + + + + Rotates the section of the beam by 45 degrees + Rotates the section of the beam by 45 degrees + + + + Quetzal_StretchBeam + + + Stretch the beam + + + + + Changes the length of the beam, either according a preselected edge or a direct input + Changes the length of the beam, either according a preselected edge or a direct input + + + + Quetzal_ValveQM + + + QM for valves + QM for valves + + + + Transaction + + + Spin + + + + + Reverse + Reverse + + + + Level The Beams + + + + + Align Edge + + + + + Rotate to Join on Edge + + + + + Make Path + + + + + Mate + + + + + Extend pipes to intersection + + + + + Extend pipe to intersection + + + + + Lay-down the pipe + Lay-down the pipe + + + + Raise-up the support + Raise-up the support + + + + Attach to tube + + + + + Connect to header + Connect to header + + + + Insert Single Structure + + + + + Insert Frame Branch + + + + + Trim Frame Branch + + + + + Update Frame Line + + + + + Fill frame + Fill frame + + + + Extend beam + + + + + Stretch beam + + + + + Translate + + + + + Align Flange + + + + + Rotate The Beam Around + + + + + Insert profile + Insert profile + + + + Modify profile + Modify profile + + + + Adjust angle + Adjust angle + + + + Insert pipe + + + + + Insert elbow + + + + + Insert flange + + + + + Insert cap + + + + + Insert valve + + + + + Place one curve + + + + + Redraw pipe-lines + + + + + Trim pipes + + + + + Insert reduction + + + + + Insert clamp in (0,0,0) + + + + + Insert clamp on tube + + + + + Insert pipe line + + + + + Assign Base + + + + + Insert pipe branch + + + + + Break pipes + + + + + Point to Point + + + + + Add nozzles + + + + + Make pipe route + + + + + Join + + + + + Workbench + + + Quetzal + Quetzal + + + + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + + + + Frame tools + Frame tools + + + + + + Utils + Utils + + + + + + Pipe tools + + + + + QM Menus + QM Menus + + + + Frames + Frames + + + + Pipes + + + + + breakForm + + + Break the pipes + Break the pipes + + + + Length + Länge + + + + <reference> + <reference> + + + + PypeLine: + PypeLine: + + + + + <none> + <none> + + + + <new> + <new> + + + + dpCalcDialog + + + + *** CUSTOM FLUID *** + *** CUSTOM FLUID *** + + + + <custom fluid> + <custom fluid> + + + + + No data found + No data found + + + + It seems the fluid has not a liquid state. + It seems the fluid has not a liquid state. + + + + *** LIQUID *** + *** LIQUID *** + + + + Flow (m3/h) + Flow (m3/h) + + + + It seems the fluid has not a gas state. + It seems the fluid has not a gas state. + + + + *** GAS/VAPOUR *** + *** GAS/VAPOUR *** + + + + Flow (kg/h) + Flow (kg/h) + + + + fObservers + + + Select one beam and one edge + Select one beam and one edge + + + + First select the base beam, then the edges + First select the base beam, then the edges + + + + First select the target plane, then the faces to align + First select the target plane, then the faces to align + + + + levelTheBeam + Transaction + levelTheBeam + + + + Select the target face, then the others + Select the target face, then the others + + + + alignFlange + Transaction + alignFlange + + + + Select two edges to join. + Select two edges to join. + + + + joinTheBeamsEdges + Transaction + joinTheBeamsEdges + + + + Select the beam and input the length + Select the beam and input the length + + + + First Select the target shape, then the beams to extend. + First Select the target shape, then the beams to extend. + + + + Select 2 edges + Select 2 edges + + + + Select 2 edges =>[Ctrl]+select + Select 2 edges =>[Ctrl]+select + + + + rotJoin + Transaction + rotJoin + + + + insertBranchForm + + + Insert a branch + Insert a branch + + + + <name> + <name> + + + + <bend radius> + <bend radius> + + + + insertCapForm + + + Insert caps + Insert caps + + + + Reverse + Reverse + + + + Apply + Apply + + + + insertElbowForm + + + Insert elbows + Insert elbows + + + + <bend angle> + <bend angle> + + + + <bend radius> + <bend radius> + + + + Trim/Extend + Trim/Extend + + + + Reverse + Reverse + + + + Apply + Apply + + + + 0 deg + 0 deg + + + + Wrong selection + + Wrong selection + + + + + deg + deg + + + + insertFlangeForm + + + Insert flanges + Insert flanges + + + + Reverse + Reverse + + + + Apply + Apply + + + + insertPipeForm + + + Insert pipes + Insert pipes + + + + <length> + <length> + + + + Reverse + Reverse + + + + Apply + Apply + + + + insertPypeLineForm + + + PypeLine Manager + PypeLine Manager + + + + <name> + <name> + + + + Redraw + Redraw + + + + Part list + Part list + + + + Color + Farbe + + + + Get Path + Get Path + + + + Get Profile + Get Profile + + + + + + + + + + <new> + <new> + + + + insertReductForm + + + Insert reductions + Insert reductions + + + + Reverse + Reverse + + + + Apply + Apply + + + + Eccentric + Eccentric + + + + insertRouteForm + + + <select an edge> + <select an edge> + + + + insertUboltForm + + + Insert U-bolt + Insert U-bolt + + + + - no ref. face - + - no ref. face - + + + + Ref. face + Ref. face + + + + Head + Head + + + + Middle + Middle + + + + Tail + Tail + + + + insertValveForm + + + Insert valves + Insert valves + + + + Reverse + Reverse + + + + Apply + Apply + + + + Insert in pipe + Insert in pipe + + + + makeframenbranch + + + Structure + + + + + mouseActionB1 + + + ____TAIL + ____TAIL + + + + pForms + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + point2pointPipe + + + Reset + Zurücksetzen + + + + Move WP on click + Move WP on click + + + + profEdit + + + Shift profile + Shift profile + + + + protoPypeForm + + + + Rating: + Rating: + + + + Insert + Einsatz + + + + protoTypeDialog + + + "%s" to select; "%s" to execute + "%s" to select; "%s" to execute + + + + No view available. + No view available. + + + + Actions "%s" and "%s" removed + Actions "%s" and "%s" removed + + + + rotWPForm + + + Angle: + Angle: + + + + Rotate working plane + Rotate working plane + + + + uCmd + + + Quick move + Transaction + Schnelles Bewegen + + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + uForms + + + QueryTool + QueryTool + + + + (Select a object) + (Select a object) + + + + (base) + (base) + + + + Base: + Base: + + + + (angle) + (angle) + + + + Rotation angle: + Rotation angle: + + + + v = (x,y,z) + v = (x,y,z) + + + + Rotation axis: + Rotation axis: + + + + (Sub object property) + (Sub object property) + + + + (Beam property) + (Beam property) + + + + (Profile property) + (Profile property) + + + + QueryObject + QueryObject + + + + Exit + Exit + + + + Rotate WP + Rotate WP + + + diff --git a/translationz/Quetzal_el.qm b/translationz/Quetzal_el.qm new file mode 100644 index 0000000000000000000000000000000000000000..34d8adbd745d6480c6776e99874b92bfc3fed90f GIT binary patch literal 31112 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 Z3i~`g;7jro5{{tcpCPx4O literal 0 HcmV?d00001 diff --git a/translationz/Quetzal_el.ts b/translationz/Quetzal_el.ts new file mode 100644 index 0000000..6be4fe1 --- /dev/null +++ b/translationz/Quetzal_el.ts @@ -0,0 +1,2968 @@ + + + + + App::Property + + + + The extension of the tail + Η προέκταση της ουράς + + + + + The extension of the head + Η προέκταση κεφαλής + + + + + The rotation of the section + Περιστροφή τμήματος + + + + + Type of frameFeature + Τύπος Πλαισίου Χαρακτηριστικά + + + + Size of frame + Μέγεθος πλαισίου + + + + the edges + τις άκρες + + + + the profile + το προφίλ + + + + The beams names + Ονόματα δοκών + + + + + The path. + Η διαδρομή. + + + + The profile + Το προφίλ + + + + + + + + + + + + + + Type of section + Τύπος τμήματος + + + + + + + + + + + Width of the beam + Πλάτος Δοκού + + + + + + + + + + + + + Height of the beam + Ύψος Δοκού + + + + Thickness of the vertical sides + Πάχος των κάθετων πλευρών + + + + Thickness of the horizontal sides + Πάχος οριζόντιων πλευρών + + + + Diameter of the beam + Διάμετρος Δοκού + + + + Thickness + Πάχος + + + + + + + Thickness of the webs + Πάχος Δοκού + + + + + Radius of corner r1 + Radius of corner r1 + + + + + Radius of corner r2 + Radius of corner r2 + + + + + + Thickness of the web + Πάχος Δοκού + + + + Thickness of the flanges + Πάχος Φλάντζας + + + + Width of the flanges + Πλάτος Φλάντζας + + + + + + Thickness 1 + Πάχος1 + + + + + + Thickness 2 + Πάχος2 + + + + + + Thickness 3 + Πάχος3 + + + + + Width of the bottom flange + Πλάτος της κάτω φλάντζας + + + + + Width of the top flange + Πλάτος της πάνω φλάντζας + + + + Type of tubeFeature + Τύπος Σωλήνα Χαρακτηριστικά + + + + Rating of pipeFeature + Αξιολόγηση Χαρακτηριστικά Σωλήνα + + + + Nominal diameter + Ονομαστική διάμετρος + + + + + Ports position relative to the origin of Shape + Θέση Εισόδων σε σχέση με την προέλευση του Σχήματος + + + + Flow factor (m3/h/bar) + Συντελεστής ροής (m3/h/bar) + + + + + + + + + Outside diameter + Εξωτερική διάμετρος + + + + + + + + + + Wall thickness + Πάχος τοιχώματος + + + + + + + Inside diameter + Εσωτερική διάμετρος + + + + + Length of tube + Μήκος Σωλήνα + + + + + + + Section dim. + Section dim. + + + + Bend Angle + Γωνία Κάμψης + + + + + Bend Radius + Ακτίνα Κάμψης + + + + Type of flange + Τύπος φλάντζας + + + + Flange diameter + Διάμετρος Φλάντζας + + + + Bore diameter + Διάμετρος Οπής + + + + Bolts distance + Απόσταση Μπουλονιών + + + + Bolts hole diameter + Διάμετρος οπής μπουλονιών + + + + Thickness of flange + Πάχος Φλάντζας + + + + Nr. of bolts + Αρ. Μπουλονιών + + + + Thickness of raised face + Πάχος ανυψωμένης όψης + + + + Diameter of raised face + Διάμετρος ανασηκωμένης όψης + + + + Length of welding neck + Μήκος λαιμού συγκόλλησης + + + + Diameter of welding neck + Διάμετρος λαιμού συγκόλλησης + + + + Outside diameter of pipe + Εξωτερική διάμετρος σωλήνα + + + + Flange fillet radius + Flange fillet radius + + + + Flange neck length + Flange neck length + + + + Socket diameter + Socket diameter + + + + Socket depth + Socket depth + + + + Major diameter + Κύρια διάμετρος + + + + Minor diameter + Δευτερεύων διάμετρος + + + + Make the length variable + Make the length variable + + + + Length of reduction + Μήκος Μειωτήρα πίεσης + + + + Concentric or Eccentric + Ομόκεντρα ή Έκκεντρα + + + + the radius of bending + την ακτίνα κάμψης + + + + The group. + Το γκρουπ. + + + + Type of pipeFeature + Τύπος Σωλήνα Χαρακτηριστικά + + + + Type of clamp + Τύπος σφιγκτήρα + + + + Size of clamp + Μέγεθος σφικτήρα + + + + Arc diameter + Διάμετρος τόξου + + + + Overall height + Συνολικό ύψος + + + + Rod diameter + Διάμετρος Ράβδου + + + + Size of thread + Μέγεθος Σπειρώματος + + + + Tank's length + Μήκος's Δεξαμενής + + + + Tank's width + Πλάτος's Δεξαμενής + + + + Tank's height + Υψος's Δεξαμενής + + + + Thickness of tank's shell + Thickness of tank's shell + + + + Thickness of tank's top + Thickness of tank's top + + + + The tubes of the branch. + Οι Σωλήνες της διακλάδωσης. + + + + The curves of the branch. + Οι καμπύλες της διακλάδωσης. + + + + App::PropertyString + + + The group. + Το γκρουπ. + + + + DialogAlign + + + Align flanges + Ευθυγράμμιση φλαντζών + + + + normY + κανόνεςΥ + + + + YZ + YZ + + + + (S)elect face + (S)Επιλέξτε όψεις + + + + XZ + XZ + + + + hotkeys: "S" to select, "X" to execute + κουμπιά συντόμευσης: S; για να επιλέξετε;X; για εκτέλεση + + + + XY + XY + + + + < select a target face > + < Επιλέξτε όψη στόχο > + + + + Set normal + Set normal + + + + normX + κανόνας Χ + + + + normZ + κανόνας Z + + + + Invert normal + Αναστροφή κανονικού + + + + DialogBeamShift + + + Move + Μετακίνηση + + + + Multiple: + Πολλαπλούς: + + + + + 1 + 1 + + + + + + 0 + 0 + + + + Set dist. + Ορισμός απόστασης. + + + + Z: + Z: + + + + Steps: + Steps: + + + + Y: + Y: + + + + copy + αντιγραφή + + + + X: + X: + + + + hotkeys: "S" to select, "X" to execute + κουμπιά συντόμευσης: S; για να επιλέξετε;X; για εκτέλεση + + + + DialogBeamStretch + + + Stretch + Έκταση + + + + (S)et length + (S)et μήκος + + + + both + και τα δυο + + + + head + κεφάλι + + + + tail + ουρά + + + + New length - mm: + Νέο Μήκος - mm: + + + + hotkeys: "S" to select, "X" to execute + κουμπιά συντόμευσης: S; για να επιλέξετε;X; για εκτέλεση + + + + Stretched end: + Τέντωμα άκρου: + + + + DialogCutList + + + Create Cut List + Create Cut List + + + + Select Profile + Select Profile + + + + Cut List Options + Cut List Options + + + + Group Parts by Size + Group Parts by Size + + + + Nesting Options + Nesting Options + + + + Maximum Stock Length + Maximum Stock Length + + + + Cut Width + Cut Width + + + + Use Nesting + Use Nesting + + + + DialogDisp + + + Dialog + Διάλογος + + + + Angle: + Γωνία: + + + + SET + SET + + + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + * Κάντε κλικ στο βέλος για να μετακινηθείτε + * Ctrl+Click για επιστροφή + * Ctrl+Alt+Κλικ για περιστροφή + + + + Displacement: + Μετατόπιση: + + + + 100 + 100 + + + + 90 + 90 + + + + DialogDp + + + Dp calculator + Υπολογιστής Dp + + + + calculation + υπολογισμός + + + + Nr. of curves = 0 + Αρ, καμπυλών = 0 + + + + Roughness (um) + Τραχύτητα (um) + + + + Flow-rate (m3/h) + Ρυθμός ροής (m3/h) + + + + Total length = 0 + Συνολικό μήκος = 0 + + + + Scope + Πεδίο εφαρμογής + + + + <on selection> + <στην επιλογή> + + + + Pipe material + Υλικό Σωλήνα + + + + fluid properties + ιδιότητες Ρευστών Υλικών + + + + Density (kg/m3) + Πυκνότητα (kg/m3) + + + + liquid + Υγρό + + + + T (°C) + T (°C) + + + + Viscosity (cP) + Ιξώδες (cP) + + + + gas/vapour + αέριο/ατμός + + + + Name + Όνομα + + + + P abs. (bar) + P (πίεση)abs. (bar) + + + + results + αποτελέσματα + + + + Export + Εξαγωγή + + + + *** LIQUID *** + *** ΥΓΡΟ *** + + + + --- + --- + + + + DialogExtend + + + Extend beams + Επεκτείνετε τους Δοκούς + + + + < select a target > + < Επιλέξτε στόχο > + + + + (S)elect target + (S)Επιλέξτε στόχο + + + + hotkeys: "S" to select, "X" to execute + κουμπιά συντόμευσης: S; για να επιλέξετε;X; για εκτέλεση + + + + DialogFBranch + + + FrameBranch Manager + Manager Υποσυγκρότημα_Πλαισίου + + + + AddBeams + Προσθήκη Δοκών + + + + Generate planes + Generate planes + + + + RemoveBeams + Αφαιρέστε τος Δοκούς + + + + Cut Miters + Cut Miters + + + + offset head + offset κεφαλής + + + + <no target selected> + <δεν επιλέχθηκε στόχος> + + + + <degrees> + <μοίρες> + + + + Add single + Add single + + + + <length> + <μήκος> + + + + hotkeys: "S" to select, "X" to trim + πλήκτρα συντόμευσης: "S" για να επιλέξετε, "X" για κόψιμο + + + + Get targets + Λάβετε στόχους + + + + offset tail + μετατόπιση ουράς(πίσω μέρος) + + + + Redraw + Επανασχεδιασμός + + + + Trim/Extend + Περικοπή/Επέκταση + + + + <no item selected> + <δεν επιλέχθηκε κανένα στοιχείο> + + + + ChangeProfile + Αλλαγή Προφίλ + + + + <name> + <Όνομα> + + + + DialogFillFrame + + + Fill frame + Γέμισμα πλαισίου + + + + move + μετακίνηση + + + + (S)elect + (S)Επιλέξτε + + + + < select a beam > + < επιλέξτε μια δοκό > + + + + copy + αντιγραφή + + + + hotkeys: "S" to select, "X" to execute + κουμπιά συντόμευσης: S; για να επιλέξετε;X; για εκτέλεση + + + + DialogHackedLine + + + Dialog + Διάλογος + + + + (M)ove origin on click + (Μ)ετακινήστε την αρχή με το κλικ + + + + (R)otate WP + (R)Περιστροφή WP + + + + (O)ffset WP + (Ο) Μετατόπιση WP + + + + + + Align WP to principal plane + Ευθυγραμμίστε το WP στο κύριο επίπεδο + + + + DialogJoinPypes + + + Join pypes + Ενώστε σωλήνες + + + + Reset + Επαναφορά + + + + hotkeys: "S" to select, "X" to execute + κουμπιά συντόμευσης: S; για να επιλέξετε;X; για εκτέλεση + + + + DialogProtoPipeForm + + + Dialog + Διάλογος + + + + Rating: + Εκτίμηση: + + + + Insert + Εισαγωγή + + + + DialogQM + + + Quick Insert + Quick Insert + + + + DialogRotAround + + + Rotate around axis + Περιστροφή γύρω από τον άξονα + + + + Reverse + Αντιστροφή + + + + <select one axis> + <Επιλέξτε έναν Άξονα> + + + + copy items + αντιγραφή αντικειμένων + + + + hotkeys: "S" to select, "X" to execute + κουμπιά συντόμευσης: S; για να επιλέξετε;X; για εκτέλεση + + + + (S)et axis + (S)et άξονες + + + + DialogRoute + + + Create pipe route + Δημιουργία διαδρομής σωλήνα + + + + Y + Y + + + + X + X + + + + Z + Z + + + + global Z + καθολικό Z + + + + Normal to sketch: + Κανονικό σκίτσο: + + + + Offset (mm): + Μετατόπιση Αντιστάθμιση(mm): + + + + 0 + 0 + + + + <select an edge> + <επιλέξτε μια άκρη> + + + + Get edge + Πιάσε άκρη + + + + (S)et normal + (S)et κανονικό + + + + hotkeys: +"S" to select normal from geometry +"X" to execute + Πλήκτρα συντόμευσης: +"S" για να επιλέξετε την κανονική από τη γεωμετρία +"Χ" για να εκτελέσετε + + + + DialogSection + + + Beams profile editor + Beams profile editor + + + + <name> + <Όνομα> + + + + NW + NW + + + + N + N + + + + NE + NE + + + + W + W + + + + C + C + + + + E + E + + + + SW + SW + + + + S + S + + + + SE + SE + + + + + + + + + + + ... + ... + + + + Full section + Full section + + + + Apply +dimensions + Apply +dimensions + + + + Shift +profile + Shift +profile + + + + DialogShapes + + + Import shapes + Εισαγωγή σχημάτων + + + + <shapes> + <Σχήματα> + + + + DialogTank + + + Dialog + Διάλογος + + + + Tank + Δεξαμενή + + + + Length + Μήκος + + + + X + X + + + + Width: + Πλάτος: + + + + Y + Y + + + + Height: + Ύψος: + + + + Z + Z + + + + Nozzles + Ακροφύσια/Ακροστόμια + + + + Pipe type: + Τύπος Σωλήνα: + + + + + <select> + <Επιλέξτε> + + + + Flange type: + Τύπος Φλάντζας: + + + + Add nozzle + Προσθέστε Ακροφύσιο-Ακροστόμιο + + + + DialogValves + + + Insert valves + Εισαγωγή Βαλβίδων + + + + Apply + Εφαρμογή + + + + Reverse + Αντιστροφή + + + + Type: + Τύπος: + + + + Objects + + + Rectangular hollow + Profile name in the Tree View + Rectangular hollow + + + + Rectangular solid + Profile name in the Tree View + Rectangular solid + + + + Circle-profile + Profile name in the Tree View + Circle-profile + + + + L-profile + Profile name in the Tree View + L-profile + + + + U-profile + Profile name in the Tree View + U-profile + + + + T-profile + Profile name in the Tree View + T-profile + + + + Z-profile + Profile name in the Tree View + Z-profile + + + + Omega-profile + Profile name in the Tree View + Omega-profile + + + + H-profile + Profile name in the Tree View + H-profile + + + + Tube + Σωλήνας + + + + Elbow + Γωνία Σωλήνα + + + + Flange + Φλάντζα + + + + Reduct + Reduct + + + + U-Bolt + U-Βίδα (Φουρκέτα) + + + + Tank + Δεξαμενή + + + + Cap + Καπάκι + + + + Valve + Βαλβίδα + + + + Pipe route + Pipe route + + + + Quetzal_AdjustFrameAngle + + + Adjust frame angle + Adjust frame angle + + + + Adjust the angle of frame by two edges + Προσαρμόστε τη γωνία του πλαισίου ως προς τα δύο άκρα + + + + Quetzal_AlignEdge + + + Mate the edges + Ενώστε τις Άκρες + + + + Join two edges: select two or pre-select several + Ένωσή δύο Άκρων: επιλέξτε δύο ή προεπιλέξτε περισσότερες + + + + Quetzal_AlignFlange + + + Align flange + Align flange + + + + Rotates the section of the beam to make the faces parallel to another face + Περιστρέφει την δοκό για να κάνει τις όψεις παράλληλες με μια άλλη όψη + + + + Quetzal_Attach2Tube + + + Attach to tube + Attach to tube + + + + Attach one pype to the nearest port of selected pipe + Συνδέστε ένα Σωλήνα στην πλησιέστερη θύρα του επιλεγμένου σωλήνα + + + + Quetzal_BreakPipe + + + Break the pipe + Σπάστε τον σωλήνα + + + + Break one pipe at point and insert gap + Σταματήστε έναν σωλήνα στο σημείο και εισάγετε το κενό + + + + Quetzal_CapQM + + + QM for caps + QM για καπάκια + + + + Quetzal_CreateCutList + + + createCutList + createCutList + + + + Create a new Cut List from Quetzal Beams + Create a new Cut List from Quetzal Beams + + + + Quetzal_ElbowQM + + + QM for elbows + QM για Γωνίες + + + + Quetzal_ExtendBeam + + + Extend the beam + Extend the beam + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Επεκτείνετε τη δοκό είτε ως προς την όψη, κορυφή ή την κ.ο.m. του επιλεγμένου αντικειμένου + + + + Quetzal_ExtendIntersection1 + + + Extend pipe to intersection + Extend pipe to intersection + + + + Extends pipe to intersection + Επεκτείνει τον σωλήνα έως τη διασταύρωση + + + + Quetzal_ExtendIntersection2 + + + Extend pipes to intersection + Extend pipes to intersection + + + + Extends pipes to intersection + Επεκτείνει τους σωλήνες μέχρι τη διασταύρωση + + + + Quetzal_FlangeQM + + + QM for flanges + QM για φλάντζες + + + + Quetzal_Flat + + + Fit one elbow + Τοποθετήστε μια γωνία + + + + Place the elbow between two pipes or beams + Τοποθετήστε γωνία μεταξύ δύο σωλήνων ή δοκών + + + + Quetzal_FrameBranchManager + + + FrameBranch Manager + Manager Υποσυγκρότημα_Πλαισίου + + + + Open FrameBranch Manager + Άνοιγμα Manager Υποσυγκρότημα_Πλαισίου + + + + Quetzal_FrameIt + + + Place one-beam over one-edge + Τοποθετήστε τη δοκό πάνω από τη μία άκρη + + + + Place one beam after the other over the edges + Τοποθετήστε τη μια δοκό μετά την άλλη στις άκρες + + + + Quetzal_HackedLine + + + Draw a Draft wire + Draw a Draft wire + + + + WP is re-positioned at each point. Possible to spin and offset it. + Το WP επανατοποθετείται σε κάθε σημείο. +Δυνατότητα περιστροφής και αντιστάθμισης. + + + + Quetzal_InsertAnyShape + + + Insert any shape + Εισαγάγετε οποιοδήποτε σχήμα + + + + Insert a STEP, IGES or BREP + Εισαγάγετε ένα STEP, IGES ή BREP + + + + Quetzal_InsertBranch + + + Insert a branch + Εισαγάγετε έναν τμήμα + + + + Insert a PypeBranch + Εισαγάγετε ένα τμήμα ενός Σωλήνα + + + + Quetzal_InsertCap + + + + Insert a cap + Εισάγετε ένα καπάκι + + + + Quetzal_InsertElbow + + + + Insert a curve + Εισαγάγετε μια καμπύλη + + + + Quetzal_InsertFlange + + + + Insert a flange + Εισαγάγετε μια φλάντζα + + + + Quetzal_InsertPath + + + Insert path + Insert path + + + + Creates one path along selected edges + Δημιουργεί μία διαδρομή κατά μήκος των επιλεγμένων άκρων + + + + Quetzal_InsertPipe + + + + Insert a tube + Τοποθετήστε ένα σωλήνα + + + + Quetzal_InsertPypeLine + + + PypeLine Manager + Manager Γραμμής Σωλήνων + + + + Open PypeLine Manager + Άνοιγμα Manager Γραμμής Σωλήνων + + + + Quetzal_InsertReduct + + + + Insert a reduction + Εισαγωγή Μειωτήρα + + + + Quetzal_InsertRoute + + + Insert a pipe route + Εισαγάγετε μια διαδρομή σωλήνα + + + + Create a sketch attached to a circular edge + Δημιουργήστε ένα σκίτσο προσαρτημένο σε μια κυκλική άκρη + + + + Quetzal_InsertSection + + + Insert sections + Εισαγάγετε τμήματα + + + + Creates customized beam profiles 2D + Δημιουργεί προσαρμοσμένα προφίλ δοκών 2D + + + + Quetzal_InsertTank + + + Insert a tank + Τοποθετήστε μια δεξαμενή + + + + Create tank and nozzles + Δημιουργήστε δεξαμενή και ακροφύσια + + + + Quetzal_InsertUbolt + + + + Insert a U-bolt + Τοποθετήστε μια βίδα τύπου U + + + + Quetzal_InsertValve + + + + Insert a valve + Εισαγωγή Βαλβίδας + + + + Quetzal_JoinPype + + + Join pipes + Join pipes + + + + Select the part-pype and the port + Επιλέξτε ένα μέρος σωλήνα και την είσοδο + + + + Quetzal_Laydown + + + Lay-down the pipe + Τοποθετήστε το σωλήνα + + + + Lay-down the pipe on the support plane + Τοποθετήστε τον σωλήνα στο επίπεδο στήριξης + + + + Quetzal_LevelBeam + + + Flush the surfaces + Ευθυγράμμισή επιφανειών + + + + Shift the beams to line-up the faces to the first selection (faces must be //) + Μετακινήστε τα δοκάρια για να ευθυγραμμίσετε τις όψεις στην πρώτη επιλογή (οι όψεις πρέπει να είναι //) + + + + Quetzal_MakeHeader + + + Connect to header + Connect to header + + + + Connect branches to one header pipe +Branches and header's axes must be ortho + Connect branches to one header pipe +Branches and header's axes must be ortho + + + + Quetzal_MateEdges + + + Mate pipes edges + Ένωση άκρες σωλήνων + + + + Mate two terminations through their edges + Ενώστε δύο άκρες στις άκρες τους + + + + Quetzal_MoveHandle + + + Move objects + Μετακίνηση αντικειμένων + + + + Move quickly objects inside viewport + Μετακινήστε γρήγορα αντικείμενα μέσα στο παράθυρο προβολής + + + + Quetzal_MoveWorkPlane + + + Align workplane + Align workplane + + + + Moves and rotates the drafting workplane with points, edges and faces + Μετακινεί και περιστρέφει το επίπεδο εργασίας σχεδίασης με σημεία, άκρες και επιφάνειες + + + + Quetzal_OffsetWorkPlane + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + Offset workplane + Offset workplane + + + + Shifts the WP along its normal. + Shifts the WP along its normal. + + + + Quetzal_PipeQM + + + QM for pipes + QM για σωλήνες + + + + Quetzal_PivotBeam + + + Pivot the beam + Pivot the beam + + + + Rotates the beam around an axis (edge or center-of-curvature) + Περιστρέφει τη δοκό γύρω από έναν άξονα (ακμή ή κέντρο καμπυλότητας) + + + + Quetzal_Point2Point + + + Draw a tube point by point + Draw a tube point by point + + + + A new body is created on each click on subsequent points + A new body is created on each click on subsequent points + + + + Quetzal_PressureLossCalculator + + + Pressure loss calculator + Υπολογιστής Απώλειας Πίεσης + + + + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + + + + Quetzal_QueryModel + + + Query the model + Query the model + + + + Click objects to print infos + Κάντε κλικ σε αντικείμενα για να εκτυπώσετε πληροφορίες + + + + Quetzal_Raiseup + + + Raise-up the support + Ανεβάστε την υποστήριξη + + + + Raise the support to the pipe + Ανεβάστε το στήριγμα στον σωλήνα + + + + Quetzal_ReverseBeam + + + Reverse orientation + Αντίστροφος προσανατολισμός + + + + Reverse the orientation of selected objects + Αντιστρέψτε τον προσανατολισμό των επιλεγμένων αντικειμένων + + + + Quetzal_RotateJoin + + + Rotate join to edge + Rotate join to edge + + + + Rotates and align the beam according another edge + Περιστρέφει και ευθυγραμμίζει τη δοκό +σύμφωνα με μια άλλη άκρη + + + + Quetzal_RotateWorkPlane + + + Rotate workplane + Rotate workplane + + + + Spin the Draft working plane about one of its axes + Περιστρέψτε το σκίτσο γύρω από τον άξονά του + + + + Quetzal_SelectSolids + + + Select solids + Επιλογή Στερεών + + + + Grab all solids or those partially selected + to export in .step format + Πιάστε όλα τα στερεά ή μερικώς επιλεγμένα + για εξαγωγή σε μορφή .step + + + + Quetzal_ShiftBeam + + + Shift the beam + Shift the beam + + + + Translate objects by vectors defined on existing geometry + Μετάφραση αντικειμένων με διανύσματα που +ορίζονται στην υπάρχουσα γεωμετρία + + + + Quetzal_SpinSection + + + Spin beams by 45 deg. + Περιστροφή δοκών κατά 45 μοίρες. + + + + Rotates the section of the beam by 45 degrees + Περιστροφή τμήμα της δέσμης κατά 45 μοίρες + + + + Quetzal_StretchBeam + + + Stretch the beam + Stretch the beam + + + + Changes the length of the beam, either according a preselected edge or a direct input + Αλλάζει το μήκος της δέσμης, είτε σύμφωνα με προεπιλεγμένο άκρο είτε με απευθείας είσοδο + + + + Quetzal_ValveQM + + + QM for valves + QM για βαλβίδες + + + + Transaction + + + Spin + Spin + + + + Reverse + Αντιστροφή + + + + Level The Beams + Level The Beams + + + + Align Edge + Align Edge + + + + Rotate to Join on Edge + Rotate to Join on Edge + + + + Make Path + Make Path + + + + Mate + Mate + + + + Extend pipes to intersection + Extend pipes to intersection + + + + Extend pipe to intersection + Extend pipe to intersection + + + + Lay-down the pipe + Τοποθετήστε το σωλήνα + + + + Raise-up the support + Ανεβάστε την υποστήριξη + + + + Attach to tube + Attach to tube + + + + Connect to header + Connect to header + + + + Insert Single Structure + Insert Single Structure + + + + Insert Frame Branch + Insert Frame Branch + + + + Trim Frame Branch + Trim Frame Branch + + + + Update Frame Line + Update Frame Line + + + + Fill frame + Γέμισμα πλαισίου + + + + Extend beam + Extend beam + + + + Stretch beam + Stretch beam + + + + Translate + Translate + + + + Align Flange + Align Flange + + + + Rotate The Beam Around + Rotate The Beam Around + + + + Insert profile + Insert profile + + + + Modify profile + Modify profile + + + + Adjust angle + Adjust angle + + + + Insert pipe + Insert pipe + + + + Insert elbow + Insert elbow + + + + Insert flange + Insert flange + + + + Insert cap + Insert cap + + + + Insert valve + Insert valve + + + + Place one curve + Place one curve + + + + Redraw pipe-lines + Redraw pipe-lines + + + + Trim pipes + Trim pipes + + + + Insert reduction + Insert reduction + + + + Insert clamp in (0,0,0) + Insert clamp in (0,0,0) + + + + Insert clamp on tube + Insert clamp on tube + + + + Insert pipe line + Insert pipe line + + + + Assign Base + Assign Base + + + + Insert pipe branch + Insert pipe branch + + + + Break pipes + Break pipes + + + + Point to Point + Point to Point + + + + Add nozzles + Add nozzles + + + + Make pipe route + Make pipe route + + + + Join + Join + + + + Workbench + + + Quetzal + Quetzal + + + + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + + + + Frame tools + Εργαλεία Πλαισίου + + + + + + Utils + Χρήση + + + + + + Pipe tools + + + + + QM Menus + QM Menus + + + + Frames + Frames + + + + Pipes + + + + + breakForm + + + Break the pipes + Break the pipes + + + + Length + Μήκος + + + + <reference> + <reference> + + + + PypeLine: + PypeLine: + + + + + <none> + <none> + + + + <new> + <new> + + + + dpCalcDialog + + + + *** CUSTOM FLUID *** + *** CUSTOM FLUID *** + + + + <custom fluid> + <custom fluid> + + + + + No data found + No data found + + + + It seems the fluid has not a liquid state. + It seems the fluid has not a liquid state. + + + + *** LIQUID *** + *** ΥΓΡΟ *** + + + + Flow (m3/h) + Flow (m3/h) + + + + It seems the fluid has not a gas state. + It seems the fluid has not a gas state. + + + + *** GAS/VAPOUR *** + *** GAS/VAPOUR *** + + + + Flow (kg/h) + Flow (kg/h) + + + + fObservers + + + Select one beam and one edge + Select one beam and one edge + + + + First select the base beam, then the edges + First select the base beam, then the edges + + + + First select the target plane, then the faces to align + First select the target plane, then the faces to align + + + + levelTheBeam + Transaction + levelTheBeam + + + + Select the target face, then the others + Select the target face, then the others + + + + alignFlange + Transaction + ευθυγραμμίστε τη φλάντζα + + + + Select two edges to join. + Select two edges to join. + + + + joinTheBeamsEdges + Transaction + joinTheBeamsEdges + + + + Select the beam and input the length + Select the beam and input the length + + + + First Select the target shape, then the beams to extend. + First Select the target shape, then the beams to extend. + + + + Select 2 edges + Select 2 edges + + + + Select 2 edges =>[Ctrl]+select + Select 2 edges =>[Ctrl]+select + + + + rotJoin + Transaction + rotJoin + + + + insertBranchForm + + + Insert a branch + Εισαγάγετε έναν τμήμα + + + + <name> + <Όνομα> + + + + <bend radius> + <bend radius> + + + + insertCapForm + + + Insert caps + Insert caps + + + + Reverse + Αντιστροφή + + + + Apply + Εφαρμογή + + + + insertElbowForm + + + Insert elbows + Insert elbows + + + + <bend angle> + <bend angle> + + + + <bend radius> + <bend radius> + + + + Trim/Extend + Περικοπή/Επέκταση + + + + Reverse + Αντιστροφή + + + + Apply + Εφαρμογή + + + + 0 deg + 0 deg + + + + Wrong selection + + Wrong selection + + + + + deg + deg + + + + insertFlangeForm + + + Insert flanges + Insert flanges + + + + Reverse + Αντιστροφή + + + + Apply + Εφαρμογή + + + + insertPipeForm + + + Insert pipes + Insert pipes + + + + <length> + <μήκος> + + + + Reverse + Αντιστροφή + + + + Apply + Εφαρμογή + + + + insertPypeLineForm + + + PypeLine Manager + Manager Γραμμής Σωλήνων + + + + <name> + <Όνομα> + + + + Redraw + Επανασχεδιασμός + + + + Part list + Part list + + + + Color + Χρώμα + + + + Get Path + Get Path + + + + Get Profile + Get Profile + + + + + + + + + + <new> + <new> + + + + insertReductForm + + + Insert reductions + Insert reductions + + + + Reverse + Αντιστροφή + + + + Apply + Εφαρμογή + + + + Eccentric + Eccentric + + + + insertRouteForm + + + <select an edge> + <επιλέξτε μια άκρη> + + + + insertUboltForm + + + Insert U-bolt + Insert U-bolt + + + + - no ref. face - + - no ref. face - + + + + Ref. face + Ref. face + + + + Head + Head + + + + Middle + Middle + + + + Tail + Tail + + + + insertValveForm + + + Insert valves + Εισαγωγή Βαλβίδων + + + + Reverse + Αντιστροφή + + + + Apply + Εφαρμογή + + + + Insert in pipe + Insert in pipe + + + + makeframenbranch + + + Structure + Structure + + + + mouseActionB1 + + + ____TAIL + ____TAIL + + + + pForms + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + point2pointPipe + + + Reset + Επαναφορά + + + + Move WP on click + Move WP on click + + + + profEdit + + + Shift profile + Shift profile + + + + protoPypeForm + + + + Rating: + Εκτίμηση: + + + + Insert + Εισαγωγή + + + + protoTypeDialog + + + "%s" to select; "%s" to execute + "%s" to select; "%s" to execute + + + + No view available. + No view available. + + + + Actions "%s" and "%s" removed + Actions "%s" and "%s" removed + + + + rotWPForm + + + Angle: + Γωνία: + + + + Rotate working plane + Rotate working plane + + + + uCmd + + + Quick move + Transaction + Quick move + + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + uForms + + + QueryTool + QueryTool + + + + (Select a object) + (Select a object) + + + + (base) + (base) + + + + Base: + Base: + + + + (angle) + (angle) + + + + Rotation angle: + Rotation angle: + + + + v = (x,y,z) + v = (x,y,z) + + + + Rotation axis: + Rotation axis: + + + + (Sub object property) + (Sub object property) + + + + (Beam property) + (Beam property) + + + + (Profile property) + (Profile property) + + + + QueryObject + QueryObject + + + + Exit + Exit + + + + Rotate WP + Rotate WP + + + diff --git a/translationz/Quetzal_es-AR.qm b/translationz/Quetzal_es-AR.qm new file mode 100644 index 0000000000000000000000000000000000000000..3ac04c917557f14c9557a10b2bba62894c2855b2 GIT binary patch literal 50592 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 DZCDVl literal 0 HcmV?d00001 diff --git a/translationz/dodo_es-ES.ts b/translationz/Quetzal_es-AR.ts similarity index 56% rename from translationz/dodo_es-ES.ts rename to translationz/Quetzal_es-AR.ts index 5798226..2b6bc96 100644 --- a/translationz/dodo_es-ES.ts +++ b/translationz/Quetzal_es-AR.ts @@ -1,3138 +1,2961 @@ - + App::Property - + + + + + + Outside diameter - Diametro exterior + Diámetro exterior - + + + + + + + Wall thickness Espesor de muro - + + + + Inside diameter - Diametro interno + Diámetro interno - + + Length of tube Longitud del tubo - + + + + Section dim. - Dimension de seccion. + Dimensión de sección. - + Bend Angle - Angulo de dobles + Ángulo de doblez - + + Bend Radius - Radio de dobles + Radio de doblez - + Type of flange Tipo de brida - - Type of tubeFeature - Tipo caracteristica de tubo - - - - Rating of pipeFeature - Relacion de caracteristicas de tubo - - - - Nominal diameter - Diametro nominal - - - - Flow factor (m3/h/bar) - Factor de flujo (m3/h/bar) - - - + Flange diameter - Diametro de brida + Diámetro de brida - + Bore diameter - Diametro de orificio + Diámetro de orificio - + Bolts distance - Distancia de tornillos + Distancia de pernos - + Bolts hole diameter - Diametro de orificio para tornillo + Diámetro de orificio para perno - + Thickness of flange Espesor de brida - + Nr. of bolts - Numero de tornillos + Numero de pernos - + Thickness of raised face Espesor de cara elevada - + Diameter of raised face - Diametro de cara elevada + Diámetro de cara elevada - + Length of welding neck Longitud de cuello para soldadura - + Diameter of welding neck - Diametro de cuello para soldadura + Diámetro de cuello para soldadura - + Outside diameter of pipe - Diametro exterior de tuberia + Diámetro exterior de tubería + + + + Flange fillet radius + Diámetro de redondeo de brida - + + Socket diameter + Diámetro de zócalo + + + + Socket depth + Profundidad de zócalo + + + Major diameter - Diametro mayor + Diámetro mayor - + Minor diameter - Diametro menor + Diámetro menor - - Make the lenght variable + + Make the length variable Hace la longitud variable - + Length of reduction Longitud de reducción - + Concentric or Eccentric - Concentrico o excentrico + Concéntrico o excéntrico - + the radius of bending - El radio de dobles - - - - The group. - El grupo. - - - - Type of pipeFeature - Tipo de caracteristica de tubo - - - - Type of clamp - Tipo de sujeccion - - - - Size of clamp - Tamaño de sujeccion - - - - Arc diameter - Diametro de arco - - - - Overall height - Altura total - - - - Rod diameter - Diametro de vastago - - - - Size of thread - Tamaño de rosca + El radio de doblez - - Ports position relative to the origin of Shape - Posicion de los puertos relativos al origen de la forma + + Thickness of tank's shell + Espesor de carcasa del depósito - - Tank's length - Longitud de deposito + + Thickness of tank's top + Espesor superior del depósito - - Tank's width - Ancho de deposito + + + The extension of the tail + La extensión de la cola - - Tank's height - Altura de deposito + + + The extension of the head + La extensión de la cabecera - - Thikness of tank's shell - Espesor de carcaza del deposito + + + The rotation of the section + La rotación de la sección - - Thikness of tank's top - Espesor superior del deposito + + + Type of frameFeature + Tipo de característica de marco - - The tubes of the branch. - Tubos de la derivación. + + Size of frame + Tamaño de marco - - The curves of the branch. - Las curvas de la derivacion. + + The group. + El grupo. - - The path. - La ruta. + + the edges + Los bordes - - - App::PropertyFloat - - - The extension of the tail - La extension de la cola + + the profile + El perfil - - - The extension of the head - La extension de la cabezera + + The beams names + Los nombres de las vigas - - - The rotation of the section - La rotacion de la seccion + + The profile + El perfil - - Flow factor (m3/h/bar) - Factor de flujo (m3/h/bar) + + + + + + + + + + + + Type of section + Tipo de sección - - - App::PropertyLength - - - - + + + + + + + + Width of the beam Ancho de la viga - - - - - - - + + + + + + + + + + Height of the beam Alto de la viga - + Thickness of the vertical sides Espesor de los lados verticales - + Thickness of the horizontal sides Espesor de los lados horizontales - + Diameter of the beam - Diametro de la viga + Diámetro de la viga - + Thickness Espesor - - + + + + Thickness of the webs Espesor de la redes - - - + + + Radius of corner r1 + Radio de esquina r1 + + + + + Radius of corner r2 + Radio de esquina r2 + + + + + Thickness of the web Espesor de la red - + Thickness of the flanges Espesor de las bridas - + Width of the flanges Ancho de las bridas - - - + + + Thickness 1 Espesor 1 - - - + + + Thickness 2 Espesor 2 - - - + + + Thickness 3 Espesor 3 - - + + Width of the bottom flange Ancho inferior de la brida - - + + Width of the top flange Ancho superior de la brida - - Outside diameter - Diametro exterior - - - - Wall thickness - Espesor de pared - - - - App::PropertyLink - - - the edges - Los bordes + + Type of pipeFeature + Tipo de característica de tubo - - the profile - El perfil + + Type of clamp + Tipo de sujeción - - The path. - La trayectoria. + + Size of clamp + Tamaño de sujeción - - The profile - El perfil + + Arc diameter + Diámetro de arco - - - App::PropertyString - - - Type of frameFeature - Tipo de caracteristica de marco + + Overall height + Altura total - - Size of frame - Tamaño de marco + + Rod diameter + Diámetro de vástago - - The group. - El grupo. + + Size of thread + Tamaño de rosca - - - - - - - - - - Type of section - Tipo de seccion + + + Ports position relative to the origin of Shape + Posición de los puertos relativos al origen de la forma - + Type of tubeFeature - Tipo de caracteristica de tubo + Tipo de característica de tubo - + Rating of pipeFeature - Grado de caracteristica de tuberia + Grado de característica de tubería - + Nominal diameter - Diametro nominal + Diámetro nominal - - - App::PropertyStringList - - The beams names - Los nombres de las vigas + + Flow factor (m3/h/bar) + Factor de flujo (m3/h/bar) - - - App::PropertyVectorList - - Ports position relative to the origin of Shape - Posiciones de los puertos relativos al origen de la forma + + Flange neck length + Longitud de cuello de brida - - - DialogQM - - Quick Insert - Insercion rapida + + Tank's length + Longitud de depósito - - - FrameBranchManager - - FrameBranch Manager - Derivacion de gestor de marcos + + Tank's width + Ancho de depósito - - Open FrameBranch Manager - Abre gestor de marcos + + Tank's height + Altura de depósito - - - Part::Feature - - CurvaSemplice - Curva simple + + The tubes of the branch. + Tubos de la derivación. - - Simple curve - Curva simple + + The curves of the branch. + Las curvas de la derivación. - - Tube - Tubo + + + The path. + La ruta. - Part::FeaturePython + App::PropertyString - - Tube - Tubo + + The group. + El grupo. + + + DialogAlign - - Elbow - Codo + + Align flanges + Alinear bridas - - Flange - Brida + + normY + Normal a Y - - Reduction - Reduccion + + YZ + YZ - - U-Bolt - Tornillo U + + (S)elect face + (S)elecciona cara - - Tank - Deposito + + XZ + XZ - - Cap - Tapon + + hotkeys: "S" to select, "X" to execute + Teclas rápidas: "S" para seleccionar, "X" para ejecutar - - Valve - Valvula + + XY + XY - - - Sketcher::SketchObject - - pipeRoute - Rutatuberia + + < select a target face > + < selecciona una cara como objetivo > - - - adjustFrameAngle - - adjustFrameAngle - Adjuste de angulo de marcos + + Set normal + Asignar normal - - Adjust the angle of frame by two edges - Ajusta del angulo del marco por medio de dos aristas + + normX + Normal a X - - - alignEdge - - Mate the edges - Coindicir las aristas + + normZ + Normal a Z - - Join two edges: select two or pre-select several - Une dos aristas:selecciona dos o pre selecciona varias + + Invert normal + Invertir normal - alignFlange + DialogBeamShift - - alignFlange - Alinear superficies + + Move + Mover - - Rotates the section of the beam to make the faces parallel to another face - Rota la seccion de la viga para hacer las caras paralelas a otra cara + + Multiple: + Multiplicar: - - - attach2tube - - Attach to tube - Ligado al tubo + + + 1 + 1 - - Attach one pype to the nearest port of selected pipe - Liga un tipo de tuberia al puerto mas cercano de la tuberia seleccionada + + + + 0 + 0 - - - breakForm - - Break the pipes - Romper las tuberias + + Set dist. + Asignar distancia. - - Length - Longituf + + Z: + Z: - - <reference> - <referencia> + + Steps: + Pasos: - - PypeLine: - Linea de tubo: + + Y: + Y: - - <none> - <ninguno> - - - - breakPipe - - - Break the pipe - Rompe la tuberia + + copy + copiar - - Break one pipe at point and insert gap - Dividir un tubo al punto e insertar un espacio + + X: + X: - - - capQM - - QM for caps - QM para tapones + + hotkeys: "S" to select, "X" to execute + teclas rápidas: "S" para seleccionar, "X" para ejecutar - dodo + DialogBeamStretch - - Utils - Utilerias + + Stretch + Estirar - - frametools - Herramientas estructurales + + (S)et length + (S)Asignar longitud - - pypetools - Herramientas de tuberia + + both + ambos - - Frame tools - Herramientas para estructuras + + head + cabecera - - Pype tools - Herramientas para tuberias + + tail + cola - - QkMenus - Menus QK + + New length - mm: + Nueva longitud - mm: - - - dpCalc - - Pressure loss calculator - Calculadora de Perdida de presion + + hotkeys: "S" to select, "X" to execute + teclas rápidas: "S" para seleccionar, "X" para ejecutar - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. - Calcular perdida de presión en tuberias utilizando biblioteca ChEDL. - Revisar __doc__ del modulo para mayor información. + + Stretched end: + Estirado final: - dpCalcDialog - - - - *** CUSTOM FLUID *** - *** FLUIDO PERSONALIZADO *** - + DialogCutList - - <custom fluid> - <Fluido personalizado> + + Create Cut List + Crear lista de corte - - - No data found - Datos no encontrados + + Select Profile + Seleccionar perfil - - It seems the fluid has not a liquid state. - Parece que el fluido no tiene un estado liquido. + + Cut List Options + Opciones de lista de corte - - *** LIQUID *** - *** LIQUIDO *** + + Group Parts by Size + Agrupar piezas por tamaño - - Flow (m3/h) - Flujo (m3/h) + + Nesting Options + Opciones de anidado - - It seems the fluid has not a gas state. - Parece que el fluido no tiene un estado gaseoso. + + Maximum Stock Length + Longitud máxima de surtido - - *** GAS/VAPOUR *** - *** GAS/VAPOR *** + + Cut Width + Ancho de corte - - Flow (kg/h) - Flujo (kg/h) + + Use Nesting + Usar anidado - elbowQM + DialogDisp - - QM for elbows - QM para codos + + Dialog + Dialogo - - - extend - - extendTheBeam - Extender la viga + + Angle: + Ángulo: - - Extend the beam either to a face, a vertex or the c.o.m. of the selected object - Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado + + SET + Asignar - - - extend1intersection - - Extends pipe to intersection - Extender tubo a la interseccion + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + * Dar clic en la flecha para mover + * Control+clic para regresar + * Control+alt+clic para rotar - - - extend2intersection - - Extends pipes to intersection - Extender tubos a la interseccion + + Displacement: + Desplazamiento: + + + + 100 + + + + + 90 + - fObservers + DialogDp - - Select one beam and one edge - Seleccionar una viga y un borde + + Dp calculator + Calculadora de Dp - - First select the base beam, then the edges - Primero seleccionar la base, luego los bordes + + calculation + calculo - - First select the target plane, then the faces to align - Primero seleccionar el plano objetivo, luego las caras a alinear + + Nr. of curves = 0 + Numero de curvas = 0 - - levelTheBeam - Transaction - Nivelar la viga + + Roughness (um) + Rugosidad (um) - - Select the target face, then the others - Seleccionar la cara objetivo, luego las otras + + Flow-rate (m3/h) + Ritmo de flujo (m3/h) - - alignFlange - Transaction - Alinear brida + + Total length = 0 + Longitud total = 0 - - Select two edges to join. - Seleccionar dos bordes para unir. + + Scope + Alcance - - joinTheBeamsEdges - Transaction - Unir los bordes de las vigas + + <on selection> + <en selección> - - Select the beam and input the length - Selecciona la viga y la entrada de la longitud + + Pipe material + Material de tubo - - First Select the target shape, then the beams to extend. - Primero selecciona la forma objetivo, luego la viga a extender. + + fluid properties + Propiedades del fluido - - Select 2 edges - Seleccionar 2 bordes + + Density (kg/m3) + Densidad (kg/m3) - - Adjust angle - Transaction - Ajustar angulo + + liquid + liquido - - Select 2 edges =>[Ctrl]+select - Seleccionar 2 bordes =>[Ctrl]+seleccionar + + T (°C) + T (°C) - - rotJoin - Transaction - Rotar union + + Viscosity (cP) + Viscosidad (cP) - - - flangeQM - - QM for flanges - QM para bridas + + gas/vapour + gas/vapor - - - flat - - Fit one elbow - Colocar un codo + + Name + Nombre - - Place the elbow between two pipes or beams - Colocar un codo entre 2 tuberias o vigas + + P abs. (bar) + Presión absoluta. (bar) - - - frameIt - - Place one-beam over one-edge - Coloca una viga sobre una arista + + results + resultados - - Place one beam after the other over the edges - Coloca una viga despues de las otras aristas + + Export + Exportar - - - hackedL - - draw a DWire - Dibuja un Dwire + + *** LIQUID *** + *** LÍQUIDO *** - - WP is re-positioned at each point. Possible to spin and offset it. - Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. + + --- + - insertAnyz + DialogExtend - - Insert any shape - Insertar cualquier forma + + Extend beams + Extender viga - - Insert a STEP, IGES or BREP - Insertar un solido STEP, IGES, BREP + + < select a target > + <seleccionar un objetivo> - - - insertBranch - - Insert a branch - Insertar una derivación + + (S)elect target + (S)elecciona un objetivo - - Insert a PypeBranch - Insertar una derivacion de tuberia + + hotkeys: "S" to select, "X" to execute + teclas rápidas: "S" para seleccionar, "X" para ejecutar - insertBranchForm + DialogFBranch - - Insert a branch - Insertar una ramificacion + + FrameBranch Manager + Gestor de marcos ramificados - - <name> - <nombre> + + Generate planes + Generar planos - - <bend radius> - <radio de dobles> + + Cut Miters + Cortar ingletes - - - insertCap - - Insert a cap - Insertar un tapon + + <no target selected> + <ningún objetivo seleccionado> - - - insertCapForm - - Insert caps - Insertar tapones + + <degrees> + <grados> - - Reverse - Invertir + + offset tail + Desfasar cola - - Apply - Aplicar + + Trim/Extend + Cortar/Extender - - - insertElbow - - Insert a curve - Insertar una curva + + AddBeams + Agregar vigas - - - insertElbowForm - - Insert elbows - Insertar codos + + ChangeProfile + Cambiar perfil - - <bend angle> - <angulo de dobles> + + <name> + <nombre> - - <bend radius> - <radio de dobles> + + <no item selected> + <ningún elemento seleccionado> - - Trim/Extend - Cortar/Extender + + Redraw + Redibujar - - Reverse - Invertir + + offset head + Desfasar cabecera - - Apply - Aplicar + + RemoveBeams + Eliminar vigas - - 0 deg - 0 grados + + Get targets + Obtener objetivos - - Wrong selection - - Seleccion equivocada - + + <length> + <longitud> - - deg - grados + + hotkeys: "S" to select, "X" to trim + teclas rápidas: "S" para seleccionar, "X" para ejecutar - - - insertFlange - - Insert a flange - Insertar una brida + + Add single + Agregar viga sencilla - insertFlangeForm + DialogFillFrame - - Insert flanges - Insertar bridas + + Fill frame + Llenar marco - - Reverse - Invertir + + move + mover - - Apply - Aplicar + + (S)elect + (S)eleccionar - - - insertPath - - insert Path - Insertar trayectoria + + < select a beam > + < selecciona una viga > - - Creates one path along selected edges - Crea una trayectoria a lo largo de la arista seleccionada + + copy + copiar - - - insertPipe - - Insert a tube - Insertar un tubo + + hotkeys: "S" to select, "X" to execute + teclas rápidas: "S" para seleccionar, "X" para ejecutar - insertPipeForm - - - Insert pipes - Insertar tuberia - + DialogHackedLine - - <length> - <Longitud> + + Dialog + Dialogo - - Reverse - Invertir + + (M)ove origin on click + (M)over origen en clic - - Apply - Aplicar + + (R)otate WP + (R)otar plano de trabajo - - - insertPypeLine - - PypeLine Manager - Gestor de tuberia de linea + + (O)ffset WP + (O)Desface de plano de trabajo - - Open PypeLine Manager - Abre gestor de tuberia de linea + + + + Align WP to principal plane + Alinear plano de trabajo al plano principal - insertPypeLineForm - - - PypeLine Manager - Gestor de linea de tubo - - - - <name> - <nombre> - + DialogJoinPypes - - Redraw - Redibujar + + Join pypes + Unir tubos - - Part list - Lista de parte + + Reset + Reiniciar - - Color - Color + + hotkeys: "S" to select, "X" to execute + teclas rápidas: "S" para seleccionar, "X" para ejecutar + + + DialogProtoPipeForm - - Get Path - Obtener trayectoria + + Dialog + Dialogo - - Get Profile - Obtener perfil + + Rating: + Grado: - - <new> - <nuevo> + + Insert + Insertar - insertReduct + DialogQM - - Insert a reduction - Insertar una reducción + + Quick Insert + Inserción rápida - insertReductForm + DialogRotAround - - Insert reductions - Insertar reducciones + + Rotate around axis + Rotar alrededor del eje - + Reverse Invertir - - Apply - Aplicar + + <select one axis> + <selecciona un eje> - - Eccentric - Excentrico + + copy items + copiar elementos - - - insertRoute - - Insert a pipe route - Insertar una ruta de tuberia + + hotkeys: "S" to select, "X" to execute + teclas rápidas: "S" para seleccionar, "X" para ejecutar - - Create a sketch attached to a circular edge - Crea un boceto adjunta a una aristar circular + + (S)et axis + (S)Asignar eje - insertRouteForm + DialogRoute - - <select an edge> - <seleccionar un borde> + + Create pipe route + Crear trayectoria de tubería - - - insertSection - - Insert sections - Inserta secciones + + Y + - - Creates customized beam profiles 2D - Crea un perfil de viga 2D personalizado + + X + - - - insertTank - - Insert a tank - Inserta un deposito + + Z + - - Create tank and nozzles - Crea un deposito y boquillas + + global Z + Z global - - - insertTankForm - - doing combine - Haciendo combinado + + Normal to sketch: + Normal al croquis: - - files read - leer archivos + + Offset (mm): + Desfasar (mm): - - files not read - no leer archivos + + 0 + - - listNozzles: %s - Lista de boquillas: %s + + <select an edge> + <seleccionar un borde> - - - insertUbolt - - Insert a U-bolt - Insertar un tornillo U + + Get edge + Obtener borde - - - insertUboltForm - - Insert U-bolt - Insertar tornillo U + + (S)et normal + (S)Asignar normal - - - no ref. face - - Sin cara de referencia + + hotkeys: +"S" to select normal from geometry +"X" to execute + teclas rápidas: "S" para seleccionar la normal de la geometría + "X" para ejecutar + + + DialogSection - - Ref. face - Cara de referencia + + Beams profile editor + Editor de perfiles de vigas - - Head - Cabecera + + <name> + <nombre> - - Middle - Medio + + NW + Nor Oeste - - Tail - Cola + + N + Norte - - - insertValve - - Insert a valve - Insertar una valvula + + NE + Nor Este - - - insertValveForm - - Insert valves - Insertar valvulas + + W + Oeste - - Reverse - Invertir + + C + Centro - - Apply - Aplicar + + E + Este - - Insert in pipe - Insertar en tubo + + SW + Sur Oeste - - - joinPype - - Join pypes - Unir tuberias + + S + Sur - - Select the part-pype and the port - Selecciona la pieza de tuberia y el puerto + + SE + Sur Este - - - laydown - - Lay-down the pipe - Empotra la tuberia + + + + + + + + + ... + ... - - Lay-down the pipe on the support plane - Empotra la tuberia sobre el plano de soporte + + Full section + sección completa - - - levelBeam - - Flush the surfaces - Empotrar las superficies + + Apply +dimensions + Aplicar dimensiones - - Shift the beams to line-up the faces to the first selection (faces must be //) - Desplaza la viga para alinearla a la cara de la primera seleccion (caras deben ser paralelas) + + Shift +profile + Rotar Perfil - makeHeader - - - Connect to header - Conectar a la cabezera - - - - Connect branches to one header pipe Branches and header's axes must be ortho - Conectar rama a una de las cabezeras de tubo; Ejes de ramificaciones y cabezeras deben ser ortogonales - + DialogShapes - - Connect branches to one header pipe -Branches and header's axes must be ortho - Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + + Import shapes + Importar formas - - Connect branches to one header pipe - Branches and header's axes must be ortho - Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + + <shapes> + <formas> - mateEdges + DialogTank - - Mate pipes edges - Coincidir las aristas de las tuberias + + Dialog + Dialogo - - Mate two terminations through their edges - Coincidir dos terminaciones a traves de sus aristas + + Tank + depósito - - - moveHandle - - Move objects - Mover objetos + + Length + Longitud - - Move quickly objects inside viewport - Mover objetos rapidamente dentro de la vista + + X + - - - moveWorkPlane - - align Workplane - Alinear plano de trabajo + + Width: + Ancho: - - Moves and rotates the drafting workplane with points, edges and faces - Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras + + Y + - - - offsetWorkPlane - - Offset Work Plane - Desplazar plano de trabajo + + Height: + Alto: - - Offset: - Desplazamiento: + + Z + - - offset Workplane - Desfazar plano de trabajo + + Nozzles + Boquillas - - Shifts the WP alongg its normal. - Desplaza el plano de trabajo a lo largo de su normal. + + Pipe type: + Tipo de tubo: - - - pForms - - Offset Work Plane - Desface de plano de trabajo + + + <select> + <seleccionar> - - Offset: - Desface: + + Flange type: + Tipo de brida: - - - pipeQM - - QM for pipes - QM para tuberias + + Add nozzle + Agregar boquilla - pivotBeam + DialogValves - - pivotTheBeam - Pivotea la viga + + Insert valves + Insertar válvulas - - Rotates the beam around an axis (edge or center-of-curvature) - Rota la viga alrededor de un eje (arista o centro de curvatura) + + Apply + Aplicar - - - point2point - - draw a tube point-to-point - Dibuja un tubo de punto a punto + + Reverse + Invertir - - Click on subsequent points. - Da clic en puntos subsecuentes. + + Type: + Tipo: - point2pointPipe + Objects - - Reset - Reiniciar + + Rectangular hollow + Profile name in the Tree View + Rectangular hueco - - Move WP on click - Mover plano de trabajo al click + + Rectangular solid + Profile name in the Tree View + Rectangular sólido - - - profEdit - - Square + + Circle-profile Profile name in the Tree View - Rectangular + Perfil circular - - T-profile + + L-profile Profile name in the Tree View - Perfil T + Perfil L - + U-profile Profile name in the Tree View Perfil U - - H-profile - Profile name in the Tree View - Perfil H - - - - L-profile + + T-profile Profile name in the Tree View - Perfil L + Perfil T - + Z-profile Profile name in the Tree View Perfil Z - + Omega-profile Profile name in the Tree View Perfil Omega - - Circle-profile + + H-profile Profile name in the Tree View - Perfil circular + Perfil H - - Insert profile - Transaction, used on undo/redo lists - Insertar perfil + + Tube + Tubo - - Modify profile - Transaction, used on undo/redo lists - Modificar perfil + + Elbow + Codo - - Shift profile - Transaction, used on undo/redo lists - Gira perfil + + Flange + Brida - - - protoPypeForm - - - Rating: - Grado: + + Reduct + Reducción - - Insert - Insertar + + U-Bolt + Perno en U - - - protoTypeDialog - - "%s" to select; "%s" to execute - "%s" para seleccionar; "%s" para ejecutar + + Tank + Depósito - - No view available. - Vista no disponible. + + Cap + Tapón - - Actions "%s" and "%s" removed - Acciones "%s" y "%s" eliminado + + Valve + Válcula + + + + Pipe route + Ruta de tubo - queryModel + Quetzal_AdjustFrameAngle - - query the model - Consultar el modelo + + Adjust frame angle + Ajuste de ángulo de marcos - - Click objects to print infos - Cliquear objetos para imprimir información + + Adjust the angle of frame by two edges + Ajustar el ángulo del marco por medio de dos aristas - raiseup + Quetzal_AlignEdge - - Raise-up the support - Eleva el soporte + + Mate the edges + Coincidir las aristas - - Raise the support to the pipe - Eleva el soporte hacia la tuberia + + Join two edges: select two or pre-select several + Unir dos aristas:selecciona dos o pre selecciona varias - reverseBeam + Quetzal_AlignFlange - - Reverse orientation - Invertir orientacion + + Align flange + Alinear brida - - Reverse the orientation of selected objects - Invertir orientacion a los objetos seleccionados + + Rotates the section of the beam to make the faces parallel to another face + Rota la sección de la viga para hacer las caras paralelas a otra cara - rotJoin + Quetzal_Attach2Tube - - rotJoinEdge - Rotar arista de union + + Attach to tube + Ligado al tubo - - Rotates and align the beam according another edge - Rota y alinea la viga acorde a otra arista + + Attach one pype to the nearest port of selected pipe + Liga un tipo de tubería al puerto mas cercano de la tubería seleccionada - rotWPForm + Quetzal_BreakPipe - - Angle: - Angulo: + + Break the pipe + Romper la tubería - - Rotate working plane - Rotar plano de trabajo + + Break one pipe at point and insert gap + Dividir un tubo al punto e insertar un espacio - rotateWorkPlane - - - rotate Workplane - Rotar plano de trabajo - + Quetzal_CapQM - - Spin the Draft working plane about one of its axes - Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes + + QM for caps + QM para tapones - selectSolids + Quetzal_CreateCutList - - Select solids - Seleccionar solidos + + createCutList + Crear lista de corte - - Grab all solids or those partially selected - to export in .step format - Sujeta todos los solidos parcialmente seleccionados -para exportar en formato step + + Create a new Cut List from Quetzal Beams + Crear una lista nueva de corte desde vigas Quetzal - shiftBeam + Quetzal_ElbowQM - - shiftTheBeam - Desplaza la viga + + QM for elbows + QM para codos + + + Quetzal_ExtendBeam - - Translate objects by vectors defined on existing geometry - Traslada el objeto por vectores definidos sobre la geometria existente + + Extend the beam + Extender la viga + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Extender la viga a sea hacia una cara, vértice o centro de masa del objeto seleccionado - spinSect + Quetzal_ExtendIntersection1 - - Spin beams by 45 deg. - Gira viga a 45 grados. + + Extend pipe to intersection + Extender tubo a la intersección - - Rotates the section of the beam by 45 degrees - Rota la seccion de la viga a 45 grados + + Extends pipe to intersection + Extender tubo a la intersección - stretchBeam + Quetzal_ExtendIntersection2 - - stretchTheBeam - Estira la viga + + Extend pipes to intersection + Extender tubos a la intersección - - Changes the length of the beam, either according a preselected edge or a direct input - Cambia la longituf de la viga, ya sea acorde a la arista preseleccionada o una entrada directa + + Extends pipes to intersection + Extender tubos a la intersección - uCmd + Quetzal_FlangeQM - - Quick move - Transaction - Movimiento rapido + + QM for flanges + QM para bridas + + + Quetzal_Flat - - Offset Work Plane - Desfasar plano de trabajo + + Fit one elbow + Colocar un codo - - Offset: - Desface: + + Place the elbow between two pipes or beams + Colocar un codo entre 2 tuberías o vigas - uForms + Quetzal_FrameBranchManager - - QueryTool - Herramienta de consulta + + FrameBranch Manager + Gestor de marcos ramificados - - (Select a object) - (Seleccionar un objeto) + + Open FrameBranch Manager + Abre gestor de marcos + + + Quetzal_FrameIt - - (base) - (base) + + Place one-beam over one-edge + Colocar una viga sobre una arista - - Base: - Base: + + Place one beam after the other over the edges + Coloca una viga después de las otras aristas + + + Quetzal_HackedLine - - (angle) - (angulo) + + Draw a Draft wire + Dibujar un alambre de Draft - - Rotation angle: - Angulo de rotacion: + + WP is re-positioned at each point. Possible to spin and offset it. + Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. + + + Quetzal_InsertAnyShape - - v = (x,y,z) - v = (x,y,z) + + Insert any shape + Insertar cualquier forma - - Rotation axis: - Eje de rotacion: + + Insert a STEP, IGES or BREP + Insertar un solido STEP, IGES, BREP + + + Quetzal_InsertBranch - - (Sub object property) - (Propiedad de sub objeto) + + Insert a branch + Insertar una ramificación - - (Beam property) - (Propiedad de viga) + + Insert a PypeBranch + Insertar una derivación de tubería + + + Quetzal_InsertCap - - (Profile property) - (Propiedad de perfil) + + + Insert a cap + Insertar un tapón + + + Quetzal_InsertElbow - - QueryObject - Consulta de objeto + + + Insert a curve + Insertar una curva + + + Quetzal_InsertFlange - - Exit - Salir + + + Insert a flange + Insertar una brida + + + Quetzal_InsertPath - - Angle: - Angulo: + + Insert path + Insertar trayectoria - - Rotate WP - Rotar plano de trabajo + + Creates one path along selected edges + Crea una trayectoria a lo largo de la arista seleccionada - valveQM + Quetzal_InsertPipe - - QM for valves - QM para valvulas + + + Insert a tube + Insertar un tubo - Dialog + Quetzal_InsertPypeLine - - Dp calculator - Calculadora de Dp + + PypeLine Manager + Gestor de línea de tubo - - calculation - calculos + + Open PypeLine Manager + Abre gestor de tubería de línea + + + Quetzal_InsertReduct - - Nr. of curves = 0 - Numero de curvas = 0 + + + Insert a reduction + Insertar una reducción + + + Quetzal_InsertRoute - - Roughness (um) - Rugozidad (um) + + Insert a pipe route + Insertar una ruta de tubería - - Flow-rate (m3/h) - Ritmo de flujo (m3/h) + + Create a sketch attached to a circular edge + Crea un boceto adjunta a una arista circular + + + Quetzal_InsertSection - - Total length = 0 - Longitud total = 0 + + Insert sections + Insertar secciones - - Scope - Alcance + + Creates customized beam profiles 2D + Crea un perfil de viga 2D personalizado + + + Quetzal_InsertTank - - <on selection> - <en seleccion> + + Insert a tank + Insertar un depósito - - Pipe material - Material de tubo + + Create tank and nozzles + Crear un depósito y boquillas + + + Quetzal_InsertUbolt - - fluid properties - Propiedades del fluido + + + Insert a U-bolt + Insertar un perno U + + + Quetzal_InsertValve - - Density (kg/m3) - Densidad (kg/m3) + + + Insert a valve + Insertar una válvula + + + Quetzal_JoinPype - - liquid - liquido + + Join pipes + Unir tuberías - - T (°C) - + + Select the part-pype and the port + Selecciona la pieza de tubería y el puerto + + + Quetzal_Laydown - - Viscosity (cP) - Viscosidad (cP) + + Lay-down the pipe + Empotrar la tubería - - gas/vapour - gas/vapor + + Lay-down the pipe on the support plane + Empotra la tubería sobre el plano de soporte + + + Quetzal_LevelBeam - - Name - Nombre + + Flush the surfaces + Empotrar las superficies - - P abs. (bar) - Presion absoluta (bar) + + Shift the beams to line-up the faces to the first selection (faces must be //) + Desplaza la viga para alinearla a la cara de la primera selección (caras deben ser paralelas) + + + Quetzal_MakeHeader - - results - resultados + + Connect to header + Conectar a la cabecera - - Export - Exportar + + Connect branches to one header pipe +Branches and header's axes must be ortho + Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales + + + Quetzal_MateEdges - - *** LIQUID *** - *** LIQUIDO *** + + Mate pipes edges + Coincidir las aristas de las tuberías - - --- - + + Mate two terminations through their edges + Coincidir dos terminaciones a través de sus aristas + + + Quetzal_MoveHandle - - - Dialog - Dialogo + + Move objects + Mover objetos - - (M)ove origin on click - (M)over origen sobre clic + + Move quickly objects inside viewport + Mover objetos rápidamente dentro de la vista + + + Quetzal_MoveWorkPlane - - (R)otate WP - (R)otar plano de trabajo + + Align workplane + Alinear plano de trabajo - - (O)ffset WP - (O)Desfasar plano de trabajo + + Moves and rotates the drafting workplane with points, edges and faces + Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras + + + Quetzal_OffsetWorkPlane - - - - Align WP to principal plane - Alinear plano de trabajo al plano principal + + Offset Work Plane + Desfase de plano de trabajo - - Rotate around axis - Rotar alrededor del eje + + Offset: + Desface: - - Reverse - Invertir + + Offset workplane + Desfasar plano de trabajo - - <select one axis> - <Seleccionar un eje> + + Shifts the WP along its normal. + Desplaza el plano de trabajo a lo largo de su normal. + + + Quetzal_PipeQM - - copy items - copiar elementos + + QM for pipes + QM para tuberías + + + Quetzal_PivotBeam - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Pivot the beam + Pivotear viga - - (S)et axis - (S)Asignar eje + + Rotates the beam around an axis (edge or center-of-curvature) + Rota la viga alrededor de un eje (arista o centro de curvatura) + + + Quetzal_Point2Point - - Beams profile editor - Editor de perfiles de vigas + + Draw a tube point by point + Dibujar un tubo de punto a punto - - t1 - + + A new body is created on each click on subsequent points + Un nuevo cuerpo es creado en cada punto creado de foma subsequente + + + Quetzal_PressureLossCalculator - - t2 - + + Pressure loss calculator + Calculadora de pérdida de presión - - t3 - + + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + Calcular pérdida de presión en tuberías utilizando bibliotecas de ChEDL. +Revisar __doc__ del módulo para mayor información. + + + Quetzal_QueryModel - - <name> - <nombre> + + Query the model + Consultar el modelo - - NW - + + Click objects to print infos + Dar clic en objetos para imprimir información + + + Quetzal_Raiseup - - N - + + Raise-up the support + Elevar el soporte - - NE - + + Raise the support to the pipe + Eleva el soporte hacia la tubería + + + Quetzal_ReverseBeam - - W - + + Reverse orientation + Invertir orientación - - C - + + Reverse the orientation of selected objects + Invertir orientación a los objetos seleccionados + + + Quetzal_RotateJoin - - E - + + Rotate join to edge + Rotar para unir en borde - - SW - + + Rotates and align the beam according another edge + Rota y alinea la viga acorde a otra arista + + + Quetzal_RotateWorkPlane - - S - + + Rotate workplane + Rotar plano de trabajo - - SE - + + Spin the Draft working plane about one of its axes + Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes + + + Quetzal_SelectSolids - - - - - - - - - ... - + + Select solids + Seleccionar sólidos - - Full section - Seccion completa + + Grab all solids or those partially selected + to export in .step format + Sujeta todos los solidos parcialmente seleccionados +para exportar en formato step + + + Quetzal_ShiftBeam - - Apply -dimensions - Aplicar -dimensiones + + Shift the beam + Desplazar la viga - - Shift -profile - Desfasar perfil + + Translate objects by vectors defined on existing geometry + Traslada el objeto por vectores definidos sobre la geometría existente + + + Quetzal_SpinSection - - Import shapes - Importar formas + + Spin beams by 45 deg. + Girar viga 45 grados - - <shapes> - <formas> + + Rotates the section of the beam by 45 degrees + Rota la sección de la viga 45 grados + + + Quetzal_StretchBeam - - Tank - Deposito + + Stretch the beam + Estirar viga - - Length - Longitud + + Changes the length of the beam, either according a preselected edge or a direct input + Cambia la longitud de la viga, ya sea acorde a la arista preseleccionada o una entrada directa + + + Quetzal_ValveQM - - X - + + QM for valves + QM para válvulas + + + Transaction - - Width: - Ancho: + + Spin + Girar - - Y - + + Reverse + Invertir - - Height: - Alto: + + Level The Beams + Nivelar las vigas - - Z - + + Align Edge + Alinear Borde - - Nozzles - Boquillas + + Rotate to Join on Edge + Rotar para unir en Borde - - Pipe type: - Tipo de tubo: + + Make Path + Crear Ruta - - - <select> - <seleccionar> + + Mate + Emparejar - - Flange type: - Tipo de brida: + + Extend pipes to intersection + Extender tubos a la intersección - - Add nozzle - Agregar boquilla + + Extend pipe to intersection + Extender tubo a la intersección - - - DialogAlign - - Align flanges - Alinear bridas + + Lay-down the pipe + Empotra la tubería - - normY - Normal a Y + + Raise-up the support + Elevar el soporte - - YZ - YZ + + Attach to tube + Ligado al tubo - - (S)elect face - (S)elecciona cara + + Connect to header + Conectar a la cabecera - - XZ - XZ + + Insert Single Structure + Insertar Estructura Única - - hotkeys: "S" to select, "X" to execute - Teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Insert Frame Branch + Insertar una ramificación de marco - - XY - XY + + Trim Frame Branch + Recortar una ramificación de marco - - < select a target face > - < selecciona una cara como objetivo > + + Update Frame Line + Actualizar línea de marco - - Set normal - Asignar normal + + Fill frame + Llenar marco - - normX - Normal a X + + Extend beam + Extender viga - - normZ - Normal a Z + + Stretch beam + Estirar viga - - Invert normal - Invertir normal + + Translate + Trasladar - - - DialogBeamShift - - Move - Mover + + Align Flange + Alinear brida - - Multiple: - Multiplicar: + + Rotate The Beam Around + Rotar la viga alrededor - - - 1 - 1 + + Insert profile + Insertar perfil - - - - 0 - 0 + + Modify profile + Modificar perfil - - Set dist. - Asignar distancia. + + Adjust angle + Ajustar ángulo - - Z: - Z: + + Insert pipe + Insertar tubería - - Steps: - Pasos: + + Insert elbow + Insertar codo - - Y: - Y: + + Insert flange + Insertar brida - - copy - copiar + + Insert cap + Insertar tapón - - X: - X: + + Insert valve + Insertar válvula - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Place one curve + Colocar una curva - - - DialogBeamStretch - - Stretch - Estirar + + Redraw pipe-lines + Redibujar líneas de tubería - - (S)et length - (S)Asignar longitud + + Trim pipes + Cortar tuberías - - both - ambos + + Insert reduction + Insertar reducción - - head - cabecera + + Insert clamp in (0,0,0) + Insertar perno en U en (0,0,0) - - tail - cola + + Insert clamp on tube + Insertar perno en U en tubo - - New length - mm: - Nueva longitud - mm: + + Insert pipe line + Insertar tubería - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Assign Base + Asignar base - - Stretched end: - Estirado final: + + Insert pipe branch + Insertar una derivación de tubería + + + + Break pipes + Romper tuberías + + + + Point to Point + Punto a punto + + + + Add nozzles + Agregar boquillas + + + + Make pipe route + Crear trayectoria de tubería + + + + Join + Unión - DialogDisp + Workbench - - Dialog - Dialogo + + Quetzal + Quetzal - - Angle: - Angulo: + + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + Quetzal es la bifurcación del banco de trabajo Dodo para FreeCAD. Extendiendo soporte al banco de trabajo Dodo y agregando soporte de traducción. - - SET - Asignar + + Frame tools + Herramientas para estructuras - - * Click on arrow to move - * Ctrl+Click to go back - * Ctrl+Alt+Click to rotate - * Cliquear en flecha para mover - * Control+clic para regresar - * Control+alt+clic para rotar + + + + Utils + Utilidades - - Displacement: - Desplazamiento: + + + + Pipe tools + Herramientas de tuberías - - 100 - + + QM Menus + Menús QM - - 90 - + + Frames + Estructuras + + + + Pipes + Tuberías - DialogExtend + breakForm - - Extend beams - Extender viga + + Break the pipes + Romper las tuberías - - < select a target > - <seleccionar un objetivo> + + Length + longitud - - (S)elect target - (S)elecciona un objetivo + + <reference> + <referencia> - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + PypeLine: + Linea de tubo: + + + + + <none> + <ninguno> + + + + <new> + <nuevo> - DialogFBranch + dpCalcDialog - - FrameBranch Manager - Gestor de marcos ramificados + + + *** CUSTOM FLUID *** + *** FLUIDO PERSONALIZADO *** - - <no target selected> - <ningun objetivo seleccionado> + + <custom fluid> + <Fluido personalizado> - - <degrees> - <grados> + + + No data found + Datos no encontrados - - offset tail - Desfasar cola + + It seems the fluid has not a liquid state. + Parece que el fluido no tiene un estado liquido. - - Trim/Extend - Cortar/Extender + + *** LIQUID *** + *** LIQUIDO *** - - AddBeams - Agregar vigas + + Flow (m3/h) + Flujo (m3/h) - - Add single beam - Agregar viga simple + + It seems the fluid has not a gas state. + Parece que el fluido no tiene un estado gaseoso. - - ChangeProfile - Cambiar perfil + + *** GAS/VAPOUR *** + *** GAS/VAPOR *** - - <name> - <nombre> + + Flow (kg/h) + Flujo (kg/h) + + + fObservers - - <no item selected> - <ningun elemento seleccionado> + + Select one beam and one edge + Seleccionar una viga y un borde - - Redraw - Redibujar + + First select the base beam, then the edges + Primero seleccionar la base, luego los bordes - - offset head - Desfasar cabezera + + First select the target plane, then the faces to align + Primero seleccionar el plano objetivo, luego las caras a alinear - - RemoveBeams - Eliminar vigas + + levelTheBeam + Transaction + Nivelar la viga - - Get targets - Obtener objetivos + + Select the target face, then the others + Seleccionar la cara objetivo, luego las otras - - <length> - <longitud> + + alignFlange + Transaction + Alinear brida - - hotkeys: "S" to select, "X" to trim - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Select two edges to join. + Seleccionar dos bordes para unir. - - - DialogFillFrame - - Fill frame - Llenar marco + + joinTheBeamsEdges + Transaction + Unir los bordes de las vigas - - move - mover + + Select the beam and input the length + Selecciona la viga y la entrada de la longitud - - (S)elect - (S)eleccionar + + First Select the target shape, then the beams to extend. + Primero selecciona la forma objetivo, luego la viga a extender. - - < select a beam > - < selecciona una viga > + + Select 2 edges + Seleccionar 2 bordes - - copy - copiar + + Select 2 edges =>[Ctrl]+select + Seleccionar 2 bordes =>[Ctrl]+seleccionar - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + rotJoin + Transaction + Rotar unión - DialogJoinPypes + insertBranchForm - - Join pypes - Unir tubos + + Insert a branch + Insertar una ramificación - - Reset - Reiniciar + + <name> + <nombre> - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + <bend radius> + <radio de doblez> - DialogProtoPipeForm + insertCapForm - - Dialog - Dialogo + + Insert caps + Insertar tapones - - Rating: - Grado: + + Reverse + Invertir - - Insert - Insertar + + Apply + Aplicar - DialogRoute - - - Create pipe route - Crear trayectoria de tuberia - - - - Y - - - - - X - - + insertElbowForm - - Z - + + Insert elbows + Insertar codos - - global Z - Z global + + <bend angle> + <ángulo de doblez> - - Normal to sketch: - Normal al croquis: + + <bend radius> + <radio de doblez> - - Offset (mm): - Desfasar (mm): + + Trim/Extend + Cortar/Extender - - 0 - + + Reverse + Invertir - - <select an edge> - <seleccionar un borde> + + Apply + Aplicar - - Get edge - Obtener borde + + 0 deg + 0 grados - - (S)et normal - (S)Asignar normal + + Wrong selection + + Selección equivocada + - - hotkeys: -"S" to select normal from geometry -"X" to execute - teclas rapidas: "S" para seleccionar la normal de la geometria - "X" para ejecutar + + deg + grados - DialogValves - - - Insert valves - Insertar valvulas - + insertFlangeForm - - Apply - Aplicar + + Insert flanges + Insertar bridas - + Reverse Invertir - - Type: - Tipo: + + Apply + Aplicar - DialogDp - - - Dp calculator - Calculadora de Dp - - - - calculation - calculo - - - - Nr. of curves = 0 - Numero de curvas = 0 - - - - Roughness (um) - Rugozidad (um) - - - - 100 - - - - - - 20 - - - - - Flow-rate (m3/h) - Ritmo de flujo (m3/h) - - - - Total length = 0 - Longitud total = 0 - - - - Scope - Alcance - - - - <on selection> - <en seleccion> - - - - Pipe material - Material de tubo - - - - fluid properties - Propiedades del fluido - - - - Density (kg/m3) - Densidad (kg/m3) - - - - liquid - liquido - - - - T (°C) - T (°C) - - - - Viscosity (cP) - Viscosidad (cP) - - - - - 0 - - - - - gas/vapour - gas/vapor - - - - 1 - - - - - Name - Nombre - - - - P abs. (bar) - Presion absoluta. (bar) - + insertPipeForm - - results - resultados + + Insert pipes + Insertar tubería - - Export - Exportar + + <length> + <Longitud> - - *** LIQUID *** - *** LIQUIDO *** + + Reverse + Invertir - - --- - + + Apply + Aplicar - DialogHackedLine - - - Dialog - Dialogo - - - - (M)ove origin on click - (M)over origen en clic - - - - (R)otate WP - (R)otar plano de trabajo - - - - (O)ffset WP - (O)Desface de plano de trabajo - - - - - - Align WP to principal plane - Alinear plano de trabajo al plano principal - - - - XY - - + insertPypeLineForm - - XZ - + + PypeLine Manager + Gestor de línea de tubo - - YZ - + + <name> + <nombre> - - - DialogRotAround - - Rotate around axis - Rotar alrededor del eje + + Redraw + Redibujar - - Z - + + Part list + Lista de parte - - 90 - + + Color + Color - - Y - + + Get Path + Obtener trayectoria - - Reverse - Invertir + + Get Profile + Obtener perfil - - X - + + + + + + + + <new> + <nuevo> + + + insertReductForm - - <select one axis> - <selecciona un eje> + + Insert reductions + Insertar reducciones - - copy items - copiar elementos + + Reverse + Invertir - - hotkeys: "S" to select, "X" to execute - teclas rapidas: "S" para seleccionar, "X" para ejecutar + + Apply + Aplicar - - (S)et axis - (S)Asignar eje + + Eccentric + Excéntrico - DialogSections - - - Beams profile editor - Editor de perfiles de vigas - + insertRouteForm - - - 45 - + + <select an edge> + <seleccionar un borde> + + + insertUboltForm - - D - + + Insert U-bolt + Insertar perno en U - - 80 - + + - no ref. face - + Sin cara de referencia - - H - + + Ref. face + Cara de referencia - - B - + + Head + Cabecera - - t1 - + + Middle + Medio - - - - 5 - + + Tail + Cola + + + insertValveForm - - t2 - + + Insert valves + Insertar válvulas - - t3 - + + Reverse + Invertir - - <name> - <nombre> + + Apply + Aplicar - - NW - Nor Oeste + + Insert in pipe + Insertar en tubo + + + makeframenbranch - - N - Norte + + Structure + Estructura + + + mouseActionB1 - - NE - Nor Este + + ____TAIL + ____COLA + + + pForms - - W - Oeste + + Offset Work Plane + Desface de plano de trabajo - - C - Centro + + Offset: + Desface: + + + point2pointPipe - - E - Este + + Reset + Reiniciar - - SW - Sur Oeste + + Move WP on click + Mover plano de trabajo al clic + + + profEdit - - S - Sur + + Shift profile + Girar perfil + + + protoPypeForm - - SE - Sur Este + + + Rating: + Grado: - - - - - - - - - ... - + + Insert + Insertar + + + protoTypeDialog - - Full section - Seccion completa + + "%s" to select; "%s" to execute + "%s" para seleccionar; "%s" para ejecutar - - Apply -dimensions - Aplicar dimensiones + + No view available. + Vista no disponible. - - Apply - dimensions - Aplicar - dimensiones + + Actions "%s" and "%s" removed + Acciones "%s" y "%s" eliminado + + + rotWPForm - - Shift -profile - Desfazar perfil + + Angle: + Ángulo: - - Shift - profile - Orientar - perfil + + Rotate working plane + Rotar plano de trabajo - DialogShapes + uCmd - - Import shapes - Importar formas + + Quick move + Transaction + Movimiento rápido - - <shapes> - <formas> + + Offset Work Plane + Desfasar plano de trabajo - - - - + + Offset: + Desface: - DialogTank + uForms - - Dialog - Dialogo + + QueryTool + Herramienta de consulta - - Tank - Deposito + + (Select a object) + (Seleccionar un objeto) - - Length - Longitud + + (base) + (base) - - X - + + Base: + Base: - - Width: - Ancho: + + (angle) + (ángulo) - - Y - + + Rotation angle: + Ángulo de rotación: - - Height: - Alto: + + v = (x,y,z) + v = (x,y,z) - - Z - + + Rotation axis: + Eje de rotación: - - Nozzles - Boquillas + + (Sub object property) + (Propiedad de sub objeto) - - Pipe type: - Tipo de tubo: + + (Beam property) + (Propiedad de viga) - - - <select> - <seleccionar> + + (Profile property) + (Propiedad de perfil) - - Flange type: - Tipo de brida: + + QueryObject + Consulta de objeto - - 200 - + + Exit + Salir - - Add nozzle - Agregar boquilla + + Rotate WP + Rotar plano de trabajo diff --git a/translationz/Quetzal_es-ES.qm b/translationz/Quetzal_es-ES.qm index e0adcb22f705022fc379bd7b0ee9a64d6a75f6fe..4ab2b13e0c5d6822ca6409a3e38c183e41116d1e 100644 GIT binary patch delta 9654 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 delta 5908 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 App::Property - - - - - - + + + + + + Outside diameter Diámetro exterior - - - - - - - + + + + + + + Wall thickness Espesor de muro - - - - + + + + Inside diameter Diámetro interno - - + + Length of tube Longitud del tubo - - - - + + + + Section dim. Dimensión de sección. - + Bend Angle Ángulo de doblez - - + + Bend Radius Radio de doblez - + Type of flange Tipo de brida - + Flange diameter Diámetro de brida - + Bore diameter Diámetro de orificio - + Bolts distance - Distancia de tornillos + Distancia de pernos - + Bolts hole diameter - Diámetro de orificio para tornillo + Diámetro de orificio para perno - + Thickness of flange Espesor de brida - + Nr. of bolts - Numero de tornillos + Numero de pernos - + Thickness of raised face Espesor de cara elevada - + Diameter of raised face Diámetro de cara elevada - + Length of welding neck Longitud de cuello para soldadura - + Diameter of welding neck Diámetro de cuello para soldadura - + Outside diameter of pipe Diámetro exterior de tubería - + + Flange fillet radius + Diámetro de redondeo de brida + + + + Socket diameter + Diámetro de zócalo + + + + Socket depth + Profundidad de zócalo + + + Major diameter Diámetro mayor - + Minor diameter Diámetro menor - + Make the length variable Hace la longitud variable - + Length of reduction Longitud de reducción - + Concentric or Eccentric Concéntrico o excéntrico - + the radius of bending El radio de doblez - - + + Thickness of tank's shell + Espesor de carcasa del depósito + + + + Thickness of tank's top + Espesor superior del depósito + + + + The extension of the tail La extensión de la cola - - + + The extension of the head La extensión de la cabecera - - + + The rotation of the section La rotación de la sección - - + + Type of frameFeature Tipo de característica de marco - + Size of frame Tamaño de marco - + The group. El grupo. - + the edges Los bordes - + the profile El perfil - + The beams names Los nombres de las vigas - + The profile El perfil - - - - - - - - - + + + + + + + + + + + Type of section Tipo de sección - - - - - - + + + + + + + + Width of the beam Ancho de la viga - - - - - - - - + + + + + + + + + + Height of the beam Alto de la viga - + Thickness of the vertical sides Espesor de los lados verticales - + Thickness of the horizontal sides Espesor de los lados horizontales - + Diameter of the beam Diámetro de la viga - + Thickness Espesor - - + + + + Thickness of the webs Espesor de la redes - - - + + + Radius of corner r1 + Radio de esquina r1 + + + + + Radius of corner r2 + Radio de esquina r2 + + + + + Thickness of the web Espesor de la red - + Thickness of the flanges Espesor de las bridas - + Width of the flanges Ancho de las bridas - - - + + + Thickness 1 Espesor 1 - - - + + + Thickness 2 Espesor 2 - - - + + + Thickness 3 Espesor 3 - - + + Width of the bottom flange Ancho inferior de la brida - - + + Width of the top flange Ancho superior de la brida - + Type of pipeFeature Tipo de característica de tubo - + Type of clamp Tipo de sujeción - + Size of clamp Tamaño de sujeción - + Arc diameter Diámetro de arco - + Overall height Altura total - + Rod diameter Diámetro de vástago - + Size of thread Tamaño de rosca - - + + Ports position relative to the origin of Shape Posición de los puertos relativos al origen de la forma - + Type of tubeFeature Tipo de característica de tubo - + Rating of pipeFeature Grado de característica de tubería - + Nominal diameter Diámetro nominal - + Flow factor (m3/h/bar) Factor de flujo (m3/h/bar) - + + Flange neck length + Longitud de cuello de brida + + + Tank's length Longitud de depósito - + Tank's width Ancho de depósito - + Tank's height Altura de depósito - - Thikness of tank's shell - Espesor de carcasa del depósito - - - - Thikness of tank's top - Espesor superior del depósito - - - + The tubes of the branch. Tubos de la derivación. - + The curves of the branch. Las curvas de la derivación. - - + + The path. La ruta. @@ -418,7 +458,7 @@ App::PropertyString - + The group. El grupo. @@ -814,82 +854,87 @@ Gestor de marcos ramificados - + + Generate planes + Generar planos + + + + Cut Miters + Cortar ingletes + + + <no target selected> <ningún objetivo seleccionado> - + <degrees> <grados> - + offset tail Desfasar cola - + Trim/Extend Cortar/Extender - + AddBeams Agregar vigas - + ChangeProfile Cambiar perfil - + <name> <nombre> - + <no item selected> <ningún elemento seleccionado> - + Redraw Redibujar - + offset head Desfasar cabecera - + RemoveBeams Eliminar vigas - + Get targets Obtener objetivos - + <length> <longitud> - + hotkeys: "S" to select, "X" to trim teclas rápidas: "S" para seleccionar, "X" para ejecutar - - Slice Intersections - Cortar ingletes - - - + Add single Agregar viga sencilla @@ -996,7 +1041,7 @@ DialogQM - + Quick Insert Inserción rápida @@ -1292,15 +1337,117 @@ profile Tipo: + + Objects + + + Rectangular hollow + Profile name in the Tree View + Rectangular hueco + + + + Rectangular solid + Profile name in the Tree View + Rectangular sólido + + + + Circle-profile + Profile name in the Tree View + Perfil circular + + + + L-profile + Profile name in the Tree View + Perfil L + + + + U-profile + Profile name in the Tree View + Perfil U + + + + T-profile + Profile name in the Tree View + Perfil T + + + + Z-profile + Profile name in the Tree View + Perfil Z + + + + Omega-profile + Profile name in the Tree View + Perfil Omega + + + + H-profile + Profile name in the Tree View + Perfil H + + + + Tube + Tubo + + + + Elbow + Codo + + + + Flange + Brida + + + + Reduct + Reducción + + + + U-Bolt + Perno en U + + + + Tank + Depósito + + + + Cap + Tapón + + + + Valve + Válcula + + + + Pipe route + Ruta de tubo + + Quetzal_AdjustFrameAngle - - adjustFrameAngle + + Adjust frame angle Ajuste de ángulo de marcos - + Adjust the angle of frame by two edges Ajustar el ángulo del marco por medio de dos aristas @@ -1308,12 +1455,12 @@ profile Quetzal_AlignEdge - + Mate the edges - Coindicir las aristas + Coincidir las aristas - + Join two edges: select two or pre-select several Unir dos aristas:selecciona dos o pre selecciona varias @@ -1321,25 +1468,25 @@ profile Quetzal_AlignFlange - - alignFlange + + Align flange Alinear brida - + Rotates the section of the beam to make the faces parallel to another face Rota la sección de la viga para hacer las caras paralelas a otra cara - Quetzal_Attach2tube + Quetzal_Attach2Tube - - Attach to tube + + Attach to tube Ligado al tubo - + Attach one pype to the nearest port of selected pipe Liga un tipo de tubería al puerto mas cercano de la tubería seleccionada @@ -1347,84 +1494,101 @@ profile Quetzal_BreakPipe - + Break the pipe - Rompe la tubería + Romper la tubería - + Break one pipe at point and insert gap Dividir un tubo al punto e insertar un espacio + + Quetzal_CapQM + + + QM for caps + QM para tapones + + Quetzal_CreateCutList - + createCutList Crear lista de corte - + Create a new Cut List from Quetzal Beams Crear una lista nueva de corte desde vigas Quetzal - Quetzal_DpCalc + Quetzal_ElbowQM - - Pressure loss calculator - Calculadora de Perdida de presion - - - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. - Calcular perdida de presión en tuberías utilizando biblioteca ChEDL. - Revisar __doc__ del modulo para mayor información. + + QM for elbows + QM para codos - Quetzal_Extend + Quetzal_ExtendBeam - - extendTheBeam + + Extend the beam Extender la viga - + Extend the beam either to a face, a vertex or the c.o.m. of the selected object - Extender la viga a sea hacia una cara, vertice o centro de masa del objeto seleccionado + Extender la viga a sea hacia una cara, vértice o centro de masa del objeto seleccionado - Quetzal_Extend1intersection + Quetzal_ExtendIntersection1 + + + Extend pipe to intersection + Extender tubo a la intersección + - - + Extends pipe to intersection Extender tubo a la intersección - Quetzal_Extend2intersection + Quetzal_ExtendIntersection2 - - + + Extend pipes to intersection + Extender tubos a la intersección + + + Extends pipes to intersection Extender tubos a la intersección + + Quetzal_FlangeQM + + + QM for flanges + QM para bridas + + Quetzal_Flat - + Fit one elbow Colocar un codo - + Place the elbow between two pipes or beams Colocar un codo entre 2 tuberías o vigas @@ -1432,12 +1596,12 @@ profile Quetzal_FrameBranchManager - + FrameBranch Manager Gestor de marcos ramificados - + Open FrameBranch Manager Abre gestor de marcos @@ -1445,38 +1609,38 @@ profile Quetzal_FrameIt - + Place one-beam over one-edge - Coloca una viga sobre una arista + Colocar una viga sobre una arista - + Place one beam after the other over the edges - Coloca una viga despues de las otras aristas + Coloca una viga después de las otras aristas - Quetzal_HackedL + Quetzal_HackedLine - - draw a DWire - Dibuja un Dwire + + Draw a Draft wire + Dibujar un alambre de Draft - + WP is re-positioned at each point. Possible to spin and offset it. Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. - Quetzal_InsertAnyz + Quetzal_InsertAnyShape - + Insert any shape Insertar cualquier forma - + Insert a STEP, IGES or BREP Insertar un solido STEP, IGES, BREP @@ -1484,12 +1648,12 @@ profile Quetzal_InsertBranch - + Insert a branch Insertar una ramificación - + Insert a PypeBranch Insertar una derivación de tubería @@ -1506,8 +1670,8 @@ profile Quetzal_InsertElbow - - + + Insert a curve Insertar una curva @@ -1515,8 +1679,8 @@ profile Quetzal_InsertFlange - - + + Insert a flange Insertar una brida @@ -1524,12 +1688,12 @@ profile Quetzal_InsertPath - - insert Path + + Insert path Insertar trayectoria - + Creates one path along selected edges Crea una trayectoria a lo largo de la arista seleccionada @@ -1537,8 +1701,8 @@ profile Quetzal_InsertPipe - - + + Insert a tube Insertar un tubo @@ -1546,12 +1710,12 @@ profile Quetzal_InsertPypeLine - + PypeLine Manager Gestor de línea de tubo - + Open PypeLine Manager Abre gestor de tubería de línea @@ -1559,8 +1723,8 @@ profile Quetzal_InsertReduct - - + + Insert a reduction Insertar una reducción @@ -1568,25 +1732,25 @@ profile Quetzal_InsertRoute - + Insert a pipe route Insertar una ruta de tubería - + Create a sketch attached to a circular edge - Crea un boceto adjunta a una aristar circular + Crea un boceto adjunta a una arista circular Quetzal_InsertSection - + Insert sections - Inserta secciónes + Insertar secciones - + Creates customized beam profiles 2D Crea un perfil de viga 2D personalizado @@ -1594,30 +1758,30 @@ profile Quetzal_InsertTank - + Insert a tank - Inserta un depósito + Insertar un depósito - + Create tank and nozzles - Crea un depósito y boquillas + Crear un depósito y boquillas Quetzal_InsertUbolt - - + + Insert a U-bolt - Insertar un tornillo U + Insertar un perno U Quetzal_InsertValve - - + + Insert a valve Insertar una válvula @@ -1625,12 +1789,12 @@ profile Quetzal_JoinPype - - Join pypes - Unir tubos + + Join pipes + Unir tuberías - + Select the part-pype and the port Selecciona la pieza de tubería y el puerto @@ -1638,12 +1802,12 @@ profile Quetzal_Laydown - + Lay-down the pipe - Empotra la tubería + Empotrar la tubería - + Lay-down the pipe on the support plane Empotra la tubería sobre el plano de soporte @@ -1651,12 +1815,12 @@ profile Quetzal_LevelBeam - + Flush the surfaces Empotrar las superficies - + Shift the beams to line-up the faces to the first selection (faces must be //) Desplaza la viga para alinearla a la cara de la primera selección (caras deben ser paralelas) @@ -1664,12 +1828,12 @@ profile Quetzal_MakeHeader - + Connect to header Conectar a la cabecera - + Connect branches to one header pipe Branches and header's axes must be ortho Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales @@ -1678,12 +1842,12 @@ Branches and header's axes must be ortho Quetzal_MateEdges - + Mate pipes edges Coincidir las aristas de las tuberías - + Mate two terminations through their edges Coincidir dos terminaciones a través de sus aristas @@ -1691,25 +1855,25 @@ Branches and header's axes must be ortho Quetzal_MoveHandle - + Move objects Mover objetos - + Move quickly objects inside viewport - Mover objetos rapidamente dentro de la vista + Mover objetos rápidamente dentro de la vista Quetzal_MoveWorkPlane - - align Workplane + + Align workplane Alinear plano de trabajo - + Moves and rotates the drafting workplane with points, edges and faces Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras @@ -1717,74 +1881,97 @@ Branches and header's axes must be ortho Quetzal_OffsetWorkPlane - + Offset Work Plane Desfase de plano de trabajo - + Offset: Desface: - - offset Workplane + + Offset workplane Desfasar plano de trabajo - + Shifts the WP along its normal. Desplaza el plano de trabajo a lo largo de su normal. + + Quetzal_PipeQM + + + QM for pipes + QM para tuberías + + Quetzal_PivotBeam - - pivotTheBeam - Pivotea la viga + + Pivot the beam + Pivotear viga - + Rotates the beam around an axis (edge or center-of-curvature) Rota la viga alrededor de un eje (arista o centro de curvatura) - Quetzal_Point2point + Quetzal_Point2Point - - draw a tube point-to-point - Dibuja un tubo de punto a punto + + Draw a tube point by point + Dibujar un tubo de punto a punto - - Click on subsequent points. - Da clic en puntos subsecuentes. + + A new body is created on each click on subsequent points + Un nuevo cuerpo es creado en cada punto creado de foma subsequente + + + + Quetzal_PressureLossCalculator + + + Pressure loss calculator + Calculadora de pérdida de presión + + + + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + Calcular pérdida de presión en tuberías utilizando bibliotecas de ChEDL. +Revisar __doc__ del módulo para mayor información. Quetzal_QueryModel - - query the model + + Query the model Consultar el modelo - + Click objects to print infos - Cliquear objetos para imprimir información + Dar clic en objetos para imprimir información Quetzal_Raiseup - + Raise-up the support - Eleva el soporte + Elevar el soporte - + Raise the support to the pipe Eleva el soporte hacia la tubería @@ -1792,25 +1979,25 @@ Branches and header's axes must be ortho Quetzal_ReverseBeam - + Reverse orientation Invertir orientación - + Reverse the orientation of selected objects Invertir orientación a los objetos seleccionados - Quetzal_RotJoin + Quetzal_RotateJoin - - rotJoinEdge - Rotar arista de unión + + Rotate join to edge + Rotar para unir en borde - + Rotates and align the beam according another edge Rota y alinea la viga acorde a otra arista @@ -1818,12 +2005,12 @@ Branches and header's axes must be ortho Quetzal_RotateWorkPlane - - rotate Workplane + + Rotate workplane Rotar plano de trabajo - + Spin the Draft working plane about one of its axes Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes @@ -1831,12 +2018,12 @@ Branches and header's axes must be ortho Quetzal_SelectSolids - + Select solids - Seleccionar solidos + Seleccionar sólidos - + Grab all solids or those partially selected to export in .step format Sujeta todos los solidos parcialmente seleccionados @@ -1846,42 +2033,278 @@ para exportar en formato step Quetzal_ShiftBeam - - shiftTheBeam - Desplaza la viga + + Shift the beam + Desplazar la viga - + Translate objects by vectors defined on existing geometry Traslada el objeto por vectores definidos sobre la geometría existente - Quetzal_SpinSect + Quetzal_SpinSection - + Spin beams by 45 deg. - Gira viga a 45 grados. + Girar viga 45 grados - + Rotates the section of the beam by 45 degrees - Rota la sección de la viga a 45 grados + Rota la sección de la viga 45 grados Quetzal_StretchBeam - - stretchTheBeam - Estira la viga + + Stretch the beam + Estirar viga - + Changes the length of the beam, either according a preselected edge or a direct input Cambia la longitud de la viga, ya sea acorde a la arista preseleccionada o una entrada directa + + Quetzal_ValveQM + + + QM for valves + QM para válvulas + + + + Transaction + + + Spin + Girar + + + + Reverse + Invertir + + + + Level The Beams + Nivelar las vigas + + + + Align Edge + Alinear Borde + + + + Rotate to Join on Edge + Rotar para unir en Borde + + + + Make Path + Crear Ruta + + + + Mate + Emparejar + + + + Extend pipes to intersection + Extender tubos a la intersección + + + + Extend pipe to intersection + Extender tubo a la intersección + + + + Lay-down the pipe + Empotra la tubería + + + + Raise-up the support + Elevar el soporte + + + + Attach to tube + Ligado al tubo + + + + Connect to header + Conectar a la cabecera + + + + Insert Single Structure + Insertar Estructura Única + + + + Insert Frame Branch + Insertar una ramificación de marco + + + + Trim Frame Branch + Recortar una ramificación de marco + + + + Update Frame Line + Actualizar línea de marco + + + + Fill frame + Llenar marco + + + + Extend beam + Extender viga + + + + Stretch beam + Estirar viga + + + + Translate + Trasladar + + + + Align Flange + Alinear brida + + + + Rotate The Beam Around + Rotar la viga alrededor + + + + Insert profile + Insertar perfil + + + + Modify profile + Modificar perfil + + + + Adjust angle + Ajustar ángulo + + + + Insert pipe + Insertar tubería + + + + Insert elbow + Insertar codo + + + + Insert flange + Insertar brida + + + + Insert cap + Insertar tapón + + + + Insert valve + Insertar válvula + + + + Place one curve + Colocar una curva + + + + Redraw pipe-lines + Redibujar líneas de tubería + + + + Trim pipes + Cortar tuberías + + + + Insert reduction + Insertar reducción + + + + Insert clamp in (0,0,0) + Insertar perno en U en (0,0,0) + + + + Insert clamp on tube + Insertar perno en U en tubo + + + + Insert pipe line + Insertar tubería + + + + Assign Base + Asignar base + + + + Insert pipe branch + Insertar una derivación de tubería + + + + Break pipes + Romper tuberías + + + + Point to Point + Punto a punto + + + + Add nozzles + Agregar boquillas + + + + Make pipe route + Crear trayectoria de tubería + + + + Join + Unión + + Workbench @@ -1892,145 +2315,127 @@ para exportar en formato step Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. - Quetzal es la bifurcacion del banco de trabajo Dodo para FreeCAD. Extendiendo soporte al banco de trabajo Dodo y agregando soporte de traduccion. - - - - pypetools - Herramientas de tubería + Quetzal es la bifurcación del banco de trabajo Dodo para FreeCAD. Extendiendo soporte al banco de trabajo Dodo y agregando soporte de traducción. - + Frame tools Herramientas para estructuras - - Pype tools - Herramientas para tuberías - - - - + + + Utils Utilidades - - QM Menus - Menus QM + + + + Pipe tools + Herramientas de tuberías + QM Menus + Menús QM + + + Frames - Marcos + Estructuras - - Pypes + + Pipes Tuberías breakForm - + Break the pipes Romper las tuberías - + Length longitud - + <reference> <referencia> - + PypeLine: Linea de tubo: - - + + <none> <ninguno> - + <new> <nuevo> - - capQM - - - QM for caps - QM para tapones - - dpCalcDialog - - + + *** CUSTOM FLUID *** *** FLUIDO PERSONALIZADO *** - + <custom fluid> <Fluido personalizado> - - + + No data found Datos no encontrados - + It seems the fluid has not a liquid state. Parece que el fluido no tiene un estado liquido. - + *** LIQUID *** *** LIQUIDO *** - + Flow (m3/h) Flujo (m3/h) - + It seems the fluid has not a gas state. Parece que el fluido no tiene un estado gaseoso. - + *** GAS/VAPOUR *** *** GAS/VAPOR *** - + Flow (kg/h) Flujo (kg/h) - - elbowQM - - - QM for elbows - QM para codos - - fObservers @@ -2039,98 +2444,84 @@ para exportar en formato step Seleccionar una viga y un borde - + First select the base beam, then the edges Primero seleccionar la base, luego los bordes - + First select the target plane, then the faces to align Primero seleccionar el plano objetivo, luego las caras a alinear - + levelTheBeam Transaction Nivelar la viga - + Select the target face, then the others Seleccionar la cara objetivo, luego las otras - + alignFlange Transaction Alinear brida - + Select two edges to join. Seleccionar dos bordes para unir. - + joinTheBeamsEdges Transaction Unir los bordes de las vigas - + Select the beam and input the length Selecciona la viga y la entrada de la longitud - + First Select the target shape, then the beams to extend. Primero selecciona la forma objetivo, luego la viga a extender. - + Select 2 edges Seleccionar 2 bordes - - Adjust angle - Transaction - Ajustar ángulo - - - + Select 2 edges =>[Ctrl]+select Seleccionar 2 bordes =>[Ctrl]+seleccionar - + rotJoin Transaction Rotar unión - - flangeQM - - - QM for flanges - QM para bridas - - insertBranchForm - + Insert a branch Insertar una ramificación - + <name> <nombre> - + <bend radius> <radio de doblez> @@ -2138,17 +2529,17 @@ para exportar en formato step insertCapForm - + Insert caps Insertar tapones - + Reverse Invertir - + Apply Aplicar @@ -2156,49 +2547,49 @@ para exportar en formato step insertElbowForm - + Insert elbows Insertar codos - + <bend angle> <ángulo de doblez> - + <bend radius> <radio de doblez> - + Trim/Extend Cortar/Extender - + Reverse Invertir - + Apply Aplicar - + 0 deg 0 grados - + Wrong selection Selección equivocada - + deg grados @@ -2206,17 +2597,17 @@ para exportar en formato step insertFlangeForm - + Insert flanges Insertar bridas - + Reverse Invertir - + Apply Aplicar @@ -2224,22 +2615,22 @@ para exportar en formato step insertPipeForm - + Insert pipes Insertar tubería - + <length> <Longitud> - + Reverse Invertir - + Apply Aplicar @@ -2247,48 +2638,48 @@ para exportar en formato step insertPypeLineForm - + PypeLine Manager Gestor de línea de tubo - + <name> <nombre> - + Redraw Redibujar - + Part list Lista de parte - + Color Color - + Get Path Obtener trayectoria - + Get Profile Obtener perfil - - - - - - - + + + + + + + <new> <nuevo> @@ -2296,22 +2687,22 @@ para exportar en formato step insertReductForm - + Insert reductions Insertar reducciones - + Reverse Invertir - + Apply Aplicar - + Eccentric Excéntrico @@ -2319,63 +2710,40 @@ para exportar en formato step insertRouteForm - + <select an edge> <seleccionar un borde> - - insertTankForm - - - doing combine - Haciendo combinado - - - - files read - leer archivos - - - - files not read - no leer archivos - - - - listNozzles: %s - Lista de boquillas: %s - - insertUboltForm - + Insert U-bolt - Insertar tornillo U + Insertar perno en U - + - no ref. face - Sin cara de referencia - + Ref. face Cara de referencia - + Head Cabecera - + Middle Medio - + Tail Cola @@ -2383,22 +2751,22 @@ para exportar en formato step insertValveForm - + Insert valves Insertar válvulas - + Reverse Invertir - + Apply Aplicar - + Insert in pipe Insertar en tubo @@ -2406,15 +2774,15 @@ para exportar en formato step makeframenbranch - - Travatura + + Structure Estructura mouseActionB1 - + ____TAIL ____COLA @@ -2422,33 +2790,25 @@ para exportar en formato step pForms - + Offset Work Plane Desface de plano de trabajo - + Offset: Desface: - - pipeQM - - - QM for pipes - QM para tuberías - - point2pointPipe - + Reset Reiniciar - + Move WP on click Mover plano de trabajo al clic @@ -2456,82 +2816,21 @@ para exportar en formato step profEdit - - Square - Profile name in the Tree View - Rectangular - - - - T-profile - Profile name in the Tree View - Perfil T - - - - U-profile - Profile name in the Tree View - Perfil U - - - - H-profile - Profile name in the Tree View - Perfil H - - - - L-profile - Profile name in the Tree View - Perfil L - - - - Z-profile - Profile name in the Tree View - Perfil Z - - - - Omega-profile - Profile name in the Tree View - Perfil Omega - - - - Circle-profile - Profile name in the Tree View - Perfil circular - - - - Insert profile - Transaction, used on undo/redo lists - Insertar perfil - - - - Modify profile - Transaction, used on undo/redo lists - Modificar perfil - - - + Shift profile - Transaction, used on undo/redo lists - Gira perfil + Girar perfil protoPypeForm - - + + Rating: Grado: - + Insert Insertar @@ -2539,17 +2838,17 @@ para exportar en formato step protoTypeDialog - + "%s" to select; "%s" to execute "%s" para seleccionar; "%s" para ejecutar - + No view available. Vista no disponible. - + Actions "%s" and "%s" removed Acciones "%s" y "%s" eliminado @@ -2557,12 +2856,12 @@ para exportar en formato step rotWPForm - + Angle: Ángulo: - + Rotate working plane Rotar plano de trabajo @@ -2570,18 +2869,18 @@ para exportar en formato step uCmd - + Quick move Transaction Movimiento rápido - + Offset Work Plane Desfasar plano de trabajo - + Offset: Desface: @@ -2629,42 +2928,34 @@ para exportar en formato step Eje de rotación: - + (Sub object property) (Propiedad de sub objeto) - + (Beam property) (Propiedad de viga) - + (Profile property) (Propiedad de perfil) - + QueryObject Consulta de objeto - + Exit Salir - + Rotate WP Rotar plano de trabajo - - valveQM - - - QM for valves - QM para válvulas - - diff --git a/translationz/Quetzal_pl.qm b/translationz/Quetzal_pl.qm new file mode 100644 index 0000000000000000000000000000000000000000..559a505eeef052e7fb7898bd99b0c0179a024b7a GIT binary patch literal 22480 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 literal 0 HcmV?d00001 diff --git a/translationz/Quetzal_pl.ts b/translationz/Quetzal_pl.ts new file mode 100644 index 0000000..1e1069d --- /dev/null +++ b/translationz/Quetzal_pl.ts @@ -0,0 +1,2981 @@ + + + + + App::Property + + + + The extension of the tail + Przedłużenie zakończenia + + + + + The extension of the head + Przedłużenie głowicy + + + + + The rotation of the section + Obrót sekcji + + + + + Type of frameFeature + Type of frameFeature + + + + Size of frame + Rozmiar ramy + + + + the edges + krawędzie + + + + the profile + kontur + + + + The beams names + Nazwy belek + + + + + The path. + Ścieżka. + + + + The profile + Kontur + + + + + + + + + + + + + + Type of section + Typ sekcji + + + + + + + + + + + Width of the beam + Szerokość belki + + + + + + + + + + + + + Height of the beam + Wysokość belki + + + + Thickness of the vertical sides + Grubość boków pionowych + + + + Thickness of the horizontal sides + Grubość boków poziomych + + + + Diameter of the beam + Średnica belki + + + + Thickness + Grubość + + + + + + + Thickness of the webs + Grubość wstęg + + + + + Radius of corner r1 + Promień narożnika r1 + + + + + Radius of corner r2 + Promień narożnika r2 + + + + + + Thickness of the web + Grubość wstęgi + + + + Thickness of the flanges + Grubość kołnierzy + + + + Width of the flanges + Szerokość kołnierzy + + + + + + Thickness 1 + Grubość 1 + + + + + + Thickness 2 + Grubość 2 + + + + + + Thickness 3 + Grubość 3 + + + + + Width of the bottom flange + Szerokość dolnego kołnierza + + + + + Width of the top flange + Szerokość górnego kołnierza + + + + Type of tubeFeature + Type of tubeFeature + + + + Rating of pipeFeature + Rating of pipeFeature + + + + Nominal diameter + Średnica nominalna + + + + + Ports position relative to the origin of Shape + Ports position relative to the origin of Shape + + + + Flow factor (m3/h/bar) + Flow factor (m3/h/bar) + + + + + + + + + Outside diameter + Średnica zewnętrzna + + + + + + + + + + Wall thickness + Grubość ścianki + + + + + + + Inside diameter + Średnica wewnętrzna + + + + + Length of tube + Długość rury + + + + + + + Section dim. + Przekrój + + + + Bend Angle + Kąt gięcia + + + + + Bend Radius + Promień gięcia + + + + Type of flange + Type of flange + + + + Flange diameter + Średnica kołnierza + + + + Bore diameter + Średnica otworu + + + + Bolts distance + Odległość między śrubami + + + + Bolts hole diameter + Bolts hole diameter + + + + Thickness of flange + Thickness of flange + + + + Nr. of bolts + Nr. of bolts + + + + Thickness of raised face + Thickness of raised face + + + + Diameter of raised face + Diameter of raised face + + + + Length of welding neck + Length of welding neck + + + + Diameter of welding neck + Diameter of welding neck + + + + Outside diameter of pipe + Outside diameter of pipe + + + + Flange fillet radius + Promień zaokrąglenia kołnierza + + + + Flange neck length + Flange neck length + + + + Socket diameter + Średnica gniazda + + + + Socket depth + Głębokość gniazda + + + + Major diameter + Średnica główna + + + + Minor diameter + Średnica mniejsza + + + + Make the length variable + Make the length variable + + + + Length of reduction + Length of reduction + + + + Concentric or Eccentric + Koncentryczny lub mimośrodowy + + + + the radius of bending + promień gięcia + + + + The group. + Grupa. + + + + Type of pipeFeature + Type of pipeFeature + + + + Type of clamp + Type of clamp + + + + Size of clamp + Rozmiar zacisku + + + + Arc diameter + Arc diameter + + + + Overall height + Overall height + + + + Rod diameter + Rod diameter + + + + Size of thread + Size of thread + + + + Tank's length + Długość zbiornika + + + + Tank's width + Szerokość zbiornika + + + + Tank's height + Wysokość zbiornika + + + + Thickness of tank's shell + Grubość płaszcza zbiornika + + + + Thickness of tank's top + Grubość góry zbiornika + + + + The tubes of the branch. + The tubes of the branch. + + + + The curves of the branch. + The curves of the branch. + + + + App::PropertyString + + + The group. + Grupa. + + + + DialogAlign + + + Align flanges + Wyrównaj kołnierze + + + + normY + normY + + + + YZ + YZ + + + + (S)elect face + Wybierz ścianę + + + + XZ + XZ + + + + hotkeys: "S" to select, "X" to execute + Klawisz: +"S" aby wybrać. +"X" aby wykonać + + + + XY + XY + + + + < select a target face > + < wybierz docelową ścianę > + + + + Set normal + Wektor normalny szkicu + + + + normX + normX + + + + normZ + normZ + + + + Invert normal + Odwróć normalne + + + + DialogBeamShift + + + Move + Przesuń + + + + Multiple: + Multiple: + + + + + 1 + 1 + + + + + + 0 + 0 + + + + Set dist. + Set dist. + + + + Z: + Z: + + + + Steps: + Kroki: + + + + Y: + Y: + + + + copy + kopiuj + + + + X: + X: + + + + hotkeys: "S" to select, "X" to execute + Klawisz: +"S" aby wybrać. +"X" aby wykonać + + + + DialogBeamStretch + + + Stretch + Stretch + + + + (S)et length + U(s)taw długość + + + + both + oba + + + + head + head + + + + tail + tail + + + + New length - mm: + Nowa długość [mm]: + + + + hotkeys: "S" to select, "X" to execute + Klawisz: +"S" aby wybrać. +"X" aby wykonać + + + + Stretched end: + Stretched end: + + + + DialogCutList + + + Create Cut List + Utwórz listę cięć + + + + Select Profile + Wybierz profile + + + + Cut List Options + Opcje listy cięć + + + + Group Parts by Size + Grupuj części według rozmiaru + + + + Nesting Options + Opcje zagnieżdżenia + + + + Maximum Stock Length + Maksymalna długość nadmiaru + + + + Cut Width + Szerokość cięcia + + + + Use Nesting + Użyj zagnieżdżenia + + + + DialogDisp + + + Dialog + Okno dialogowe + + + + Angle: + Kąt: + + + + SET + SET + + + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + + + + Displacement: + Przemieszczenie: + + + + 100 + 100 + + + + 90 + 90 + + + + DialogDp + + + Dp calculator + Dp calculator + + + + calculation + obliczenia + + + + Nr. of curves = 0 + Liczba łuków = 0 + + + + Roughness (um) + Chropowatość [µm] + + + + Flow-rate (m3/h) + Natężenie przepływu (m ³/h) + + + + Total length = 0 + Długość całkowita = 0 + + + + Scope + Zakres + + + + <on selection> + <o wyborze> + + + + Pipe material + Materiał rury + + + + fluid properties + właściwości płynu + + + + Density (kg/m3) + Gęstość [kg/m³] + + + + liquid + ciecz + + + + T (°C) + Temperatura [°C] + + + + Viscosity (cP) + Lepkość [cP] + + + + gas/vapour + gaz / para + + + + Name + Nazwa + + + + P abs. (bar) + P abs. (bar) + + + + results + wyniki + + + + Export + Eksportuj + + + + *** LIQUID *** + *** LIQUID *** + + + + --- + --- + + + + DialogExtend + + + Extend beams + Punkt w siatce + + + + < select a target > + < wybierz docelową ścianę > + + + + (S)elect target + Wybierz cel (S) + + + + hotkeys: "S" to select, "X" to execute + Klawisz: +"S" aby wybrać. +"X" aby wykonać + + + + DialogFBranch + + + FrameBranch Manager + FrameBranch Manager + + + + AddBeams + AddBeams + + + + Generate planes + Generate planes + + + + RemoveBeams + Usuń belki + + + + Cut Miters + Cut Miters + + + + offset head + offset head + + + + <no target selected> + <nie wybrano celu> + + + + <degrees> + <stopni> + + + + Add single + Dodaj pojedynczy + + + + <length> + <długość> + + + + hotkeys: "S" to select, "X" to trim + Klawisz: +"S" aby wybrać, +"X" aby przyciąć. + + + + Get targets + Pobierz cele + + + + offset tail + offset tail + + + + Redraw + Przerysuj + + + + Trim/Extend + Trim/Extend + + + + <no item selected> + <no item selected> + + + + ChangeProfile + ChangeProfile + + + + <name> + <nazwa> + + + + DialogFillFrame + + + Fill frame + Fill frame + + + + move + przesuń + + + + (S)elect + Zaznacz (S) + + + + < select a beam > + < select a beam > + + + + copy + copy + + + + hotkeys: "S" to select, "X" to execute + Klawisz: +"S" aby wybrać. +"X" aby wykonać + + + + DialogHackedLine + + + Dialog + Okno dialogowe + + + + (M)ove origin on click + (M)ove origin on click + + + + (R)otate WP + (R)otate WP + + + + (O)ffset WP + (O)ffset WP + + + + + + Align WP to principal plane + Align WP to principal plane + + + + DialogJoinPypes + + + Join pypes + Join pypes + + + + Reset + Reset + + + + hotkeys: "S" to select, "X" to execute + Klawisz: +"S" aby wybrać. +"X" aby wykonać + + + + DialogProtoPipeForm + + + Dialog + Okno dialogowe + + + + Rating: + Ocena: + + + + Insert + Wstaw + + + + DialogQM + + + Quick Insert + Quick Insert + + + + DialogRotAround + + + Rotate around axis + Obrót wokół osi + + + + Reverse + Odwróć + + + + <select one axis> + <select one axis> + + + + copy items + Kopiuj elementy + + + + hotkeys: "S" to select, "X" to execute + Klawisz: +"S" aby wybrać. +"X" aby wykonać + + + + (S)et axis + (S)et axis + + + + DialogRoute + + + Create pipe route + Create pipe route + + + + Y + Y + + + + X + X + + + + Z + Z + + + + global Z + global Z + + + + Normal to sketch: + Normal to sketch: + + + + Offset (mm): + Offset (mm): + + + + 0 + 0 + + + + <select an edge> + <select an edge> + + + + Get edge + Get edge + + + + (S)et normal + (S)et normal + + + + hotkeys: +"S" to select normal from geometry +"X" to execute + hotkeys: +"S" to select normal from geometry +"X" to execute + + + + DialogSection + + + Beams profile editor + Edytor profilu belki + + + + <name> + <nazwa> + + + + NW + Północny zachód + + + + N + Północ + + + + NE + Północny wschód + + + + W + Zachód + + + + C + C + + + + E + Wschód + + + + SW + Południowy zachód + + + + S + Południe + + + + SE + Południowy wschód + + + + + + + + + + + ... + ... + + + + Full section + Full section + + + + Apply +dimensions + Apply +dimensions + + + + Shift +profile + Shift +profile + + + + DialogShapes + + + Import shapes + Importuj kształty + + + + <shapes> + <shapes> + + + + DialogTank + + + Dialog + Okno dialogowe + + + + Tank + Zbiornik + + + + Length + Długość + + + + X + X + + + + Width: + Szerokość: + + + + Y + Y + + + + Height: + Wysokość: + + + + Z + Z + + + + Nozzles + Nozzles + + + + Pipe type: + Pipe type: + + + + + <select> + <select> + + + + Flange type: + Typ kołnierza: + + + + Add nozzle + Add nozzle + + + + DialogValves + + + Insert valves + Insert valves + + + + Apply + Zastosuj + + + + Reverse + Odwróć + + + + Type: + Typ: + + + + Objects + + + Rectangular hollow + Profile name in the Tree View + Prostokątne zagłębienie + + + + Rectangular solid + Profile name in the Tree View + Prostokątna bryła + + + + Circle-profile + Profile name in the Tree View + Profil okręgu + + + + L-profile + Profile name in the Tree View + Profil L + + + + U-profile + Profile name in the Tree View + Profil U + + + + T-profile + Profile name in the Tree View + Profil T + + + + Z-profile + Profile name in the Tree View + Profil Z + + + + Omega-profile + Profile name in the Tree View + Profil omega + + + + H-profile + Profile name in the Tree View + Profil H + + + + Tube + Rura + + + + Elbow + Kolanko + + + + Flange + Kołnierz + + + + Reduct + Redukcja + + + + U-Bolt + Śruba typu U + + + + Tank + Zbiornik + + + + Cap + Zaślepka + + + + Valve + Zawór + + + + Pipe route + Trasa rury + + + + Quetzal_AdjustFrameAngle + + + Adjust frame angle + Adjust frame angle + + + + Adjust the angle of frame by two edges + Dostosuj kąt ramy dwoma krawędziami + + + + Quetzal_AlignEdge + + + Mate the edges + Łączenie krawędzi + + + + Join two edges: select two or pre-select several + Łączenie dwóch krawędzi: wybierz dwie lub wstępnie wybierz kilka + + + + Quetzal_AlignFlange + + + Align flange + Align flange + + + + Rotates the section of the beam to make the faces parallel to another face + Obraca sekcję belki, aby ściany były równoległe do innej ściany. + + + + Quetzal_Attach2Tube + + + Attach to tube + Attach to tube + + + + Attach one pype to the nearest port of selected pipe + Podłącz jedną wtyczkę do najbliższego przyłącza wybranej rury + + + + Quetzal_BreakPipe + + + Break the pipe + Przerwij rurę + + + + Break one pipe at point and insert gap + Przerwij jedną rurę w punkcie i wstaw szczelinę + + + + Quetzal_CapQM + + + QM for caps + QM for caps + + + + Quetzal_CreateCutList + + + createCutList + Utwórz listę cięć + + + + Create a new Cut List from Quetzal Beams + Create a new Cut List from Quetzal Beams + + + + Quetzal_ElbowQM + + + QM for elbows + QM for elbows + + + + Quetzal_ExtendBeam + + + Extend the beam + Extend the beam + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + + + Quetzal_ExtendIntersection1 + + + Extend pipe to intersection + Extend pipe to intersection + + + + Extends pipe to intersection + Przedłuża rurę do przecięcia + + + + Quetzal_ExtendIntersection2 + + + Extend pipes to intersection + Extend pipes to intersection + + + + Extends pipes to intersection + Przedłuża rury do przecięcia + + + + Quetzal_FlangeQM + + + QM for flanges + QM for flanges + + + + Quetzal_Flat + + + Fit one elbow + Fit one elbow + + + + Place the elbow between two pipes or beams + Place the elbow between two pipes or beams + + + + Quetzal_FrameBranchManager + + + FrameBranch Manager + FrameBranch Manager + + + + Open FrameBranch Manager + Open FrameBranch Manager + + + + Quetzal_FrameIt + + + Place one-beam over one-edge + Place one-beam over one-edge + + + + Place one beam after the other over the edges + Umieść kolejno belki na krawędziach + + + + Quetzal_HackedLine + + + Draw a Draft wire + Draw a Draft wire + + + + WP is re-positioned at each point. Possible to spin and offset it. + WP is re-positioned at each point. Possible to spin and offset it. + + + + Quetzal_InsertAnyShape + + + Insert any shape + Insert any shape + + + + Insert a STEP, IGES or BREP + Wstaw plik STEP, IGES lub BREP + + + + Quetzal_InsertBranch + + + Insert a branch + Wstaw gałąź + + + + Insert a PypeBranch + Insert a PypeBranch + + + + Quetzal_InsertCap + + + + Insert a cap + Wstaw zaślepkę + + + + Quetzal_InsertElbow + + + + Insert a curve + Wstaw kolanko + + + + Quetzal_InsertFlange + + + + Insert a flange + Wstaw kołnierz + + + + Quetzal_InsertPath + + + Insert path + Insert path + + + + Creates one path along selected edges + Creates one path along selected edges + + + + Quetzal_InsertPipe + + + + Insert a tube + Wstaw rurę + + + + Quetzal_InsertPypeLine + + + PypeLine Manager + PypeLine Manager + + + + Open PypeLine Manager + Open PypeLine Manager + + + + Quetzal_InsertReduct + + + + Insert a reduction + Wstaw redukcję + + + + Quetzal_InsertRoute + + + Insert a pipe route + Wstaw trasę rury + + + + Create a sketch attached to a circular edge + Create a sketch attached to a circular edge + + + + Quetzal_InsertSection + + + Insert sections + Wstaw sekcje + + + + Creates customized beam profiles 2D + Tworzy niestandardowe profile wiązki 2D + + + + Quetzal_InsertTank + + + Insert a tank + Wstaw zbiornik + + + + Create tank and nozzles + Create tank and nozzles + + + + Quetzal_InsertUbolt + + + + Insert a U-bolt + Insert a U-bolt + + + + Quetzal_InsertValve + + + + Insert a valve + Wstaw zawór + + + + Quetzal_JoinPype + + + Join pipes + Połącz rury + + + + Select the part-pype and the port + Select the part-pype and the port + + + + Quetzal_Laydown + + + Lay-down the pipe + Lay-down the pipe + + + + Lay-down the pipe on the support plane + Lay-down the pipe on the support plane + + + + Quetzal_LevelBeam + + + Flush the surfaces + Flush the surfaces + + + + Shift the beams to line-up the faces to the first selection (faces must be //) + Shift the beams to line-up the faces to the first selection (faces must be //) + + + + Quetzal_MakeHeader + + + Connect to header + Connect to header + + + + Connect branches to one header pipe +Branches and header's axes must be ortho + Connect branches to one header pipe +Branches and header's axes must be ortho + + + + Quetzal_MateEdges + + + Mate pipes edges + Mate pipes edges + + + + Mate two terminations through their edges + Mate two terminations through their edges + + + + Quetzal_MoveHandle + + + Move objects + Move objects + + + + Move quickly objects inside viewport + Move quickly objects inside viewport + + + + Quetzal_MoveWorkPlane + + + Align workplane + Align workplane + + + + Moves and rotates the drafting workplane with points, edges and faces + Moves and rotates the drafting workplane with points, edges and faces + + + + Quetzal_OffsetWorkPlane + + + Offset Work Plane + Odsunięcie płaszczyzny roboczej + + + + Offset: + Odsunięcie: + + + + Offset workplane + Offset workplane + + + + Shifts the WP along its normal. + Shifts the WP along its normal. + + + + Quetzal_PipeQM + + + QM for pipes + QM for pipes + + + + Quetzal_PivotBeam + + + Pivot the beam + Pivot the beam + + + + Rotates the beam around an axis (edge or center-of-curvature) + Rotates the beam around an axis (edge or center-of-curvature) + + + + Quetzal_Point2Point + + + Draw a tube point by point + Draw a tube point by point + + + + A new body is created on each click on subsequent points + A new body is created on each click on subsequent points + + + + Quetzal_PressureLossCalculator + + + Pressure loss calculator + Pressure loss calculator + + + + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + + + + Quetzal_QueryModel + + + Query the model + Query the model + + + + Click objects to print infos + Kliknij obiekty, aby wydrukować informacje + + + + Quetzal_Raiseup + + + Raise-up the support + Raise-up the support + + + + Raise the support to the pipe + Raise the support to the pipe + + + + Quetzal_ReverseBeam + + + Reverse orientation + Odwrócona orientacja + + + + Reverse the orientation of selected objects + Odwrócenie orientacji dla wybranych obiektów + + + + Quetzal_RotateJoin + + + Rotate join to edge + Rotate join to edge + + + + Rotates and align the beam according another edge + Rotates and align the beam according another edge + + + + Quetzal_RotateWorkPlane + + + Rotate workplane + Rotate workplane + + + + Spin the Draft working plane about one of its axes + Spin the Draft working plane about one of its axes + + + + Quetzal_SelectSolids + + + Select solids + Wybór ciał stałych + + + + Grab all solids or those partially selected + to export in .step format + Grab all solids or those partially selected + to export in .step format + + + + Quetzal_ShiftBeam + + + Shift the beam + Shift the beam + + + + Translate objects by vectors defined on existing geometry + Translate objects by vectors defined on existing geometry + + + + Quetzal_SpinSection + + + Spin beams by 45 deg. + Obróć belki o 45 °. + + + + Rotates the section of the beam by 45 degrees + Obraca sekcję belki o 45° + + + + Quetzal_StretchBeam + + + Stretch the beam + Stretch the beam + + + + Changes the length of the beam, either according a preselected edge or a direct input + Zmienia długość belki, zgodnie ze wstępnie wybraną krawędzią lub bezpośrednim wejściem. + + + + Quetzal_ValveQM + + + QM for valves + QM dla zaworów + + + + Transaction + + + Spin + Spin + + + + Reverse + Odwróć + + + + Level The Beams + Level The Beams + + + + Align Edge + Align Edge + + + + Rotate to Join on Edge + Rotate to Join on Edge + + + + Make Path + Make Path + + + + Mate + Mate + + + + Extend pipes to intersection + Extend pipes to intersection + + + + Extend pipe to intersection + Extend pipe to intersection + + + + Lay-down the pipe + Lay-down the pipe + + + + Raise-up the support + Raise-up the support + + + + Attach to tube + Attach to tube + + + + Connect to header + Connect to header + + + + Insert Single Structure + Insert Single Structure + + + + Insert Frame Branch + Insert Frame Branch + + + + Trim Frame Branch + Trim Frame Branch + + + + Update Frame Line + Update Frame Line + + + + Fill frame + Fill frame + + + + Extend beam + Extend beam + + + + Stretch beam + Stretch beam + + + + Translate + Translate + + + + Align Flange + Align Flange + + + + Rotate The Beam Around + Rotate The Beam Around + + + + Insert profile + Wstaw profil + + + + Modify profile + Modify profile + + + + Adjust angle + Adjust angle + + + + Insert pipe + Insert pipe + + + + Insert elbow + Insert elbow + + + + Insert flange + Insert flange + + + + Insert cap + Insert cap + + + + Insert valve + Insert valve + + + + Place one curve + Place one curve + + + + Redraw pipe-lines + Redraw pipe-lines + + + + Trim pipes + Trim pipes + + + + Insert reduction + Insert reduction + + + + Insert clamp in (0,0,0) + Insert clamp in (0,0,0) + + + + Insert clamp on tube + Insert clamp on tube + + + + Insert pipe line + Insert pipe line + + + + Assign Base + Assign Base + + + + Insert pipe branch + Insert pipe branch + + + + Break pipes + Break pipes + + + + Point to Point + Point to Point + + + + Add nozzles + Add nozzles + + + + Make pipe route + Make pipe route + + + + Join + Połącz + + + + Workbench + + + Quetzal + Quetzal + + + + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + + + + Frame tools + Narzędzia ramy + + + + + + Utils + Przybory + + + + + + Pipe tools + + + + + QM Menus + QM Menus + + + + Frames + Frames + + + + Pipes + + + + + breakForm + + + Break the pipes + Break the pipes + + + + Length + Długość + + + + <reference> + <reference> + + + + PypeLine: + PypeLine: + + + + + <none> + <none> + + + + <new> + <new> + + + + dpCalcDialog + + + + *** CUSTOM FLUID *** + *** CUSTOM FLUID *** + + + + <custom fluid> + <custom fluid> + + + + + No data found + No data found + + + + It seems the fluid has not a liquid state. + It seems the fluid has not a liquid state. + + + + *** LIQUID *** + *** LIQUID *** + + + + Flow (m3/h) + Flow (m3/h) + + + + It seems the fluid has not a gas state. + It seems the fluid has not a gas state. + + + + *** GAS/VAPOUR *** + *** GAS/VAPOUR *** + + + + Flow (kg/h) + Flow (kg/h) + + + + fObservers + + + Select one beam and one edge + Wybierz jedną belkę i jedną krawędź + + + + First select the base beam, then the edges + First select the base beam, then the edges + + + + First select the target plane, then the faces to align + First select the target plane, then the faces to align + + + + levelTheBeam + Transaction + levelTheBeam + + + + Select the target face, then the others + Select the target face, then the others + + + + alignFlange + Transaction + wyrównaj kołnierz + + + + Select two edges to join. + Select two edges to join. + + + + joinTheBeamsEdges + Transaction + joinTheBeamsEdges + + + + Select the beam and input the length + Select the beam and input the length + + + + First Select the target shape, then the beams to extend. + First Select the target shape, then the beams to extend. + + + + Select 2 edges + Select 2 edges + + + + Select 2 edges =>[Ctrl]+select + Select 2 edges =>[Ctrl]+select + + + + rotJoin + Transaction + rotJoin + + + + insertBranchForm + + + Insert a branch + Wstaw gałąź + + + + <name> + <nazwa> + + + + <bend radius> + <bend radius> + + + + insertCapForm + + + Insert caps + Insert caps + + + + Reverse + Odwróć + + + + Apply + Zastosuj + + + + insertElbowForm + + + Insert elbows + Insert elbows + + + + <bend angle> + <bend angle> + + + + <bend radius> + <bend radius> + + + + Trim/Extend + Trim/Extend + + + + Reverse + Odwróć + + + + Apply + Zastosuj + + + + 0 deg + 0 deg + + + + Wrong selection + + Wrong selection + + + + + deg + deg + + + + insertFlangeForm + + + Insert flanges + Insert flanges + + + + Reverse + Odwróć + + + + Apply + Zastosuj + + + + insertPipeForm + + + Insert pipes + Insert pipes + + + + <length> + <długość> + + + + Reverse + Odwróć + + + + Apply + Zastosuj + + + + insertPypeLineForm + + + PypeLine Manager + PypeLine Manager + + + + <name> + <nazwa> + + + + Redraw + Przerysuj + + + + Part list + Part list + + + + Color + Kolor + + + + Get Path + Get Path + + + + Get Profile + Get Profile + + + + + + + + + + <new> + <new> + + + + insertReductForm + + + Insert reductions + Insert reductions + + + + Reverse + Odwróć + + + + Apply + Zastosuj + + + + Eccentric + Eccentric + + + + insertRouteForm + + + <select an edge> + <select an edge> + + + + insertUboltForm + + + Insert U-bolt + Insert U-bolt + + + + - no ref. face - + - no ref. face - + + + + Ref. face + Ref. face + + + + Head + Head + + + + Middle + Middle + + + + Tail + Tail + + + + insertValveForm + + + Insert valves + Insert valves + + + + Reverse + Odwróć + + + + Apply + Zastosuj + + + + Insert in pipe + Insert in pipe + + + + makeframenbranch + + + Structure + Konstrukcja + + + + mouseActionB1 + + + ____TAIL + ____TAIL + + + + pForms + + + Offset Work Plane + Odsunięcie płaszczyzny roboczej + + + + Offset: + Odsunięcie: + + + + point2pointPipe + + + Reset + Reset + + + + Move WP on click + Move WP on click + + + + profEdit + + + Shift profile + Przesuń profil + + + + protoPypeForm + + + + Rating: + Ocena: + + + + Insert + Wstaw + + + + protoTypeDialog + + + "%s" to select; "%s" to execute + "%s" to select; "%s" to execute + + + + No view available. + No view available. + + + + Actions "%s" and "%s" removed + Actions "%s" and "%s" removed + + + + rotWPForm + + + Angle: + Kąt: + + + + Rotate working plane + Obróć płaszczyznę roboczą + + + + uCmd + + + Quick move + Transaction + Przesuń szybko + + + + Offset Work Plane + Odsunięcie płaszczyzny roboczej + + + + Offset: + Odsunięcie: + + + + uForms + + + QueryTool + Narzędzie zapytania + + + + (Select a object) + (Wybierz obiekt) + + + + (base) + (baza) + + + + Base: + Baza: + + + + (angle) + (kąt) + + + + Rotation angle: + Kąt obrotu: + + + + v = (x,y,z) + v = (x,y,z) + + + + Rotation axis: + Oś obrotu: + + + + (Sub object property) + (Właściwości obiektu podrzędnego) + + + + (Beam property) + (właściwość belki) + + + + (Profile property) + (Właściwości profilu) + + + + QueryObject + Obiekt zapytania + + + + Exit + Wyjdź + + + + Rotate WP + Obróć płaszczyznę roboczą + + + diff --git a/translationz/Quetzal_sv-SE.qm b/translationz/Quetzal_sv-SE.qm new file mode 100644 index 0000000000000000000000000000000000000000..766ce7dc6e8b06537486fe3edec4c8c8324c1ef1 GIT binary patch literal 4196 zcmbVOTZ|J`82;OBXWDMNTNXuQh^ZP9N!(=@@PQ2vEU@b?thny3uuF_MZD-q|vopiY zw6a7@j2ewb6K_137>QgGO*B3!iGgrQgeX3csCWr#@C6c(czKfGcg`87({8&L)3je_ z=Kuclo&R=b{ipdm&s~4#?XT`xe*DSzKL6+IEm{Y1;&2??!@&ifr%DyP7pf-u4k{M6xC;7-f z@ROu1xhzrg8JakI8uvdIn6l_`>1CqCA^K+jDWcYu;bmK1hvr+rH;6(TfNuhy4e!5! z_2GG9?=k4RH}d?i;6+{)n7S1C=(!!ZJ|R$=@$jm^*oDZ~mA9b(j%f59pu9q0>VxP5 z+pv%LT7j*V=%r)uAAe0cf1bsrEdBiZA?UjxT|4;%mftEc+$(p#@+Y2uD3`vy5Bg5Z z@BZ}%>{bX&UXd?e$93!l`TEMoz-X$=xM_}vw9$plf zOnW%!;U@x9>)MWA>V?io`@vX=)pln>%vG8m0<8=O7F-$B<9!!sE0X=)--akrip_zcC8@XE`n|Y6`ve;5jr(rP@C;OjZ8I(I-|}P^#!JT zX-%n&xwd8$c)>(4lO}z&;fYDM!`983qML<2T`L&A)y{y`&L&oq6tJ3XY!#+%-&3fY zIcgWnZB&)%v7$ER@+HH88VK>sH#AGq0P1Z9k#_@8k34Kvc%?Svv>{t2!mjabRdW@| znbu5GK{3jrEAzosvZh;P_DcdAaBbDi75NqtR75LQ@Xh->jucfTKPSflgVmB#<+zHb z&%u#!zH|qo+S1d_IktQ}6MPpS{CH3#MOxvAJiqSSU zHK{thBHO%iS?fJb1sFQC3Q0BCe_u_apg5~4ie;AV+5VHr&Sl7PSjYPmN!Rw2HJ;b{ zRcyr3K?&%rK*{wfvaLF0-Q{DUmb1|E9ME)qfSmqJp%tT_-(v{Kmra z?9GsI#VBz?f(Getyg}pxBS#)owL;Mi&YXb#Fi&V9kWy(_H40)P*SnA59fJ+klD~@x zbH&8hnZxf%e%#fQf5~{y~}Xmh!sUJ+oHY(>Mia@e*F4JW-5@#UO2?N zS};4jBQh05uhe8`JHO#&XTFZ`G8*8p2+p8BswYBp9Bs`bGTWL}Q&26_TBF&|L!0Q} zj3N~CPJXnky89G;mw3cQaNTzW4}17y4Y3<>C1d`n!y@F zP%oq6t0#AKlc}5h?CbFCk!Uvk7q4(s&6jho&-?#H>;;O~g6}R#^KG~xZGq>PWom}I sn*XwZd7TreYrlr2A^#Lg;e{P17Xs$1T)-Pu9Hbp1obeJyQaBX)7b&Povj6}9 literal 0 HcmV?d00001 diff --git a/translationz/Quetzal_sv-SE.ts b/translationz/Quetzal_sv-SE.ts new file mode 100644 index 0000000..d410177 --- /dev/null +++ b/translationz/Quetzal_sv-SE.ts @@ -0,0 +1,2965 @@ + + + + + App::Property + + + + The extension of the tail + The extension of the tail + + + + + The extension of the head + The extension of the head + + + + + The rotation of the section + The rotation of the section + + + + + Type of frameFeature + Type of frameFeature + + + + Size of frame + Storlek på ram + + + + the edges + kanterna + + + + the profile + profilen + + + + The beams names + The beams names + + + + + The path. + The path. + + + + The profile + Profilen + + + + + + + + + + + + + + Type of section + Type of section + + + + + + + + + + + Width of the beam + Width of the beam + + + + + + + + + + + + + Height of the beam + Height of the beam + + + + Thickness of the vertical sides + Thickness of the vertical sides + + + + Thickness of the horizontal sides + Thickness of the horizontal sides + + + + Diameter of the beam + Diameter of the beam + + + + Thickness + Tjocklek + + + + + + + Thickness of the webs + Thickness of the webs + + + + + Radius of corner r1 + Radius of corner r1 + + + + + Radius of corner r2 + Radius of corner r2 + + + + + + Thickness of the web + Thickness of the web + + + + Thickness of the flanges + Thickness of the flanges + + + + Width of the flanges + Width of the flanges + + + + + + Thickness 1 + Tjocklek 1 + + + + + + Thickness 2 + Tjocklek 2 + + + + + + Thickness 3 + Tjocklek 3 + + + + + Width of the bottom flange + Width of the bottom flange + + + + + Width of the top flange + Width of the top flange + + + + Type of tubeFeature + Type of tubeFeature + + + + Rating of pipeFeature + Rating of pipeFeature + + + + Nominal diameter + Nominal diameter + + + + + Ports position relative to the origin of Shape + Ports position relative to the origin of Shape + + + + Flow factor (m3/h/bar) + Flow factor (m3/h/bar) + + + + + + + + + Outside diameter + Outside diameter + + + + + + + + + + Wall thickness + Wall thickness + + + + + + + Inside diameter + Inside diameter + + + + + Length of tube + Length of tube + + + + + + + Section dim. + Section dim. + + + + Bend Angle + Bend Angle + + + + + Bend Radius + Bend Radius + + + + Type of flange + Type of flange + + + + Flange diameter + Flange diameter + + + + Bore diameter + Bore diameter + + + + Bolts distance + Bolts distance + + + + Bolts hole diameter + Bolts hole diameter + + + + Thickness of flange + Thickness of flange + + + + Nr. of bolts + Nr. of bolts + + + + Thickness of raised face + Thickness of raised face + + + + Diameter of raised face + Diameter of raised face + + + + Length of welding neck + Length of welding neck + + + + Diameter of welding neck + Diameter of welding neck + + + + Outside diameter of pipe + Outside diameter of pipe + + + + Flange fillet radius + Flange fillet radius + + + + Flange neck length + + + + + Socket diameter + Socket diameter + + + + Socket depth + Socket depth + + + + Major diameter + Major diameter + + + + Minor diameter + Minor diameter + + + + Make the length variable + Make the length variable + + + + Length of reduction + Length of reduction + + + + Concentric or Eccentric + Concentric or Eccentric + + + + the radius of bending + the radius of bending + + + + The group. + Gruppen. + + + + Type of pipeFeature + Type of pipeFeature + + + + Type of clamp + Type of clamp + + + + Size of clamp + Size of clamp + + + + Arc diameter + Arc diameter + + + + Overall height + Overall height + + + + Rod diameter + Rod diameter + + + + Size of thread + Size of thread + + + + Tank's length + Tank's length + + + + Tank's width + Tank's width + + + + Tank's height + Tank's height + + + + Thickness of tank's shell + Thickness of tank's shell + + + + Thickness of tank's top + Thickness of tank's top + + + + The tubes of the branch. + The tubes of the branch. + + + + The curves of the branch. + The curves of the branch. + + + + App::PropertyString + + + The group. + Gruppen. + + + + DialogAlign + + + Align flanges + Align flanges + + + + normY + normY + + + + YZ + YZ + + + + (S)elect face + (S)elect face + + + + XZ + XZ + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + XY + XY + + + + < select a target face > + < select a target face > + + + + Set normal + Set normal + + + + normX + normX + + + + normZ + normZ + + + + Invert normal + Invert normal + + + + DialogBeamShift + + + Move + Flytta + + + + Multiple: + Multiple: + + + + + 1 + 1 + + + + + + 0 + 0 + + + + Set dist. + Set dist. + + + + Z: + Z: + + + + Steps: + Steps: + + + + Y: + Y: + + + + copy + kopiera + + + + X: + X: + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + DialogBeamStretch + + + Stretch + Stretch + + + + (S)et length + (S)et length + + + + both + båda + + + + head + huvud + + + + tail + svans + + + + New length - mm: + New length - mm: + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + Stretched end: + Stretched end: + + + + DialogCutList + + + Create Cut List + Create Cut List + + + + Select Profile + Select Profile + + + + Cut List Options + Cut List Options + + + + Group Parts by Size + Group Parts by Size + + + + Nesting Options + Nesting Options + + + + Maximum Stock Length + Maximum Stock Length + + + + Cut Width + Cut Width + + + + Use Nesting + Use Nesting + + + + DialogDisp + + + Dialog + Dialog + + + + Angle: + Vinkel: + + + + SET + SET + + + + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + * Click on arrow to move + * Ctrl+Click to go back + * Ctrl+Alt+Click to rotate + + + + Displacement: + Displacement: + + + + 100 + 100 + + + + 90 + 90 + + + + DialogDp + + + Dp calculator + Dp calculator + + + + calculation + calculation + + + + Nr. of curves = 0 + Nr. of curves = 0 + + + + Roughness (um) + Roughness (um) + + + + Flow-rate (m3/h) + Flow-rate (m3/h) + + + + Total length = 0 + Total length = 0 + + + + Scope + Scope + + + + <on selection> + <on selection> + + + + Pipe material + Pipe material + + + + fluid properties + fluid properties + + + + Density (kg/m3) + Density (kg/m3) + + + + liquid + vätska + + + + T (°C) + T (°C) + + + + Viscosity (cP) + Viscosity (cP) + + + + gas/vapour + gas/ånga + + + + Name + Namn + + + + P abs. (bar) + P abs. (bar) + + + + results + resultat + + + + Export + Exportera + + + + *** LIQUID *** + *** LIQUID *** + + + + --- + --- + + + + DialogExtend + + + Extend beams + Extend beams + + + + < select a target > + < select a target > + + + + (S)elect target + (S)elect target + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + DialogFBranch + + + FrameBranch Manager + FrameBranch Manager + + + + AddBeams + AddBeams + + + + Generate planes + Generate planes + + + + RemoveBeams + RemoveBeams + + + + Cut Miters + Cut Miters + + + + offset head + offset head + + + + <no target selected> + <no target selected> + + + + <degrees> + <degrees> + + + + Add single + Add single + + + + <length> + <length> + + + + hotkeys: "S" to select, "X" to trim + hotkeys: "S" to select, "X" to trim + + + + Get targets + Get targets + + + + offset tail + offset tail + + + + Redraw + Redraw + + + + Trim/Extend + Trim/Extend + + + + <no item selected> + <no item selected> + + + + ChangeProfile + ChangeProfile + + + + <name> + <name> + + + + DialogFillFrame + + + Fill frame + Fill frame + + + + move + flytta + + + + (S)elect + (S)elect + + + + < select a beam > + < select a beam > + + + + copy + kopiera + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + DialogHackedLine + + + Dialog + Dialog + + + + (M)ove origin on click + (M)ove origin on click + + + + (R)otate WP + (R)otate WP + + + + (O)ffset WP + (O)ffset WP + + + + + + Align WP to principal plane + Align WP to principal plane + + + + DialogJoinPypes + + + Join pypes + Join pypes + + + + Reset + Återställ + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + DialogProtoPipeForm + + + Dialog + Dialog + + + + Rating: + Rating: + + + + Insert + Infoga + + + + DialogQM + + + Quick Insert + Quick Insert + + + + DialogRotAround + + + Rotate around axis + Rotate around axis + + + + Reverse + Omvänd + + + + <select one axis> + <select one axis> + + + + copy items + copy items + + + + hotkeys: "S" to select, "X" to execute + hotkeys: "S" to select, "X" to execute + + + + (S)et axis + (S)et axis + + + + DialogRoute + + + Create pipe route + Create pipe route + + + + Y + Y + + + + X + X + + + + Z + Z + + + + global Z + global Z + + + + Normal to sketch: + Normal to sketch: + + + + Offset (mm): + Offset (mm): + + + + 0 + 0 + + + + <select an edge> + <select an edge> + + + + Get edge + Get edge + + + + (S)et normal + (S)et normal + + + + hotkeys: +"S" to select normal from geometry +"X" to execute + hotkeys: +"S" to select normal from geometry +"X" to execute + + + + DialogSection + + + Beams profile editor + Beams profile editor + + + + <name> + <name> + + + + NW + NW + + + + N + N + + + + NE + NE + + + + W + W + + + + C + C + + + + E + E + + + + SW + SW + + + + S + S + + + + SE + SE + + + + + + + + + + + ... + ... + + + + Full section + Full section + + + + Apply +dimensions + Apply +dimensions + + + + Shift +profile + Shift +profile + + + + DialogShapes + + + Import shapes + Importera former + + + + <shapes> + <shapes> + + + + DialogTank + + + Dialog + Dialog + + + + Tank + Tank + + + + Length + Längd + + + + X + X + + + + Width: + Bredd: + + + + Y + Y + + + + Height: + Höjd: + + + + Z + Z + + + + Nozzles + Nozzles + + + + Pipe type: + Pipe type: + + + + + <select> + <select> + + + + Flange type: + Flange type: + + + + Add nozzle + Add nozzle + + + + DialogValves + + + Insert valves + Infoga ventiler + + + + Apply + Apply + + + + Reverse + Omvänd + + + + Type: + Typ: + + + + Objects + + + Rectangular hollow + Profile name in the Tree View + + + + + Rectangular solid + Profile name in the Tree View + + + + + Circle-profile + Profile name in the Tree View + Circle-profile + + + + L-profile + Profile name in the Tree View + L-profile + + + + U-profile + Profile name in the Tree View + U-profile + + + + T-profile + Profile name in the Tree View + T-profile + + + + Z-profile + Profile name in the Tree View + Z-profile + + + + Omega-profile + Profile name in the Tree View + Omega-profile + + + + H-profile + Profile name in the Tree View + H-profile + + + + Tube + + + + + Elbow + + + + + Flange + + + + + Reduct + + + + + U-Bolt + + + + + Tank + Tank + + + + Cap + + + + + Valve + + + + + Pipe route + + + + + Quetzal_AdjustFrameAngle + + + Adjust frame angle + + + + + Adjust the angle of frame by two edges + Adjust the angle of frame by two edges + + + + Quetzal_AlignEdge + + + Mate the edges + Mate the edges + + + + Join two edges: select two or pre-select several + Join two edges: select two or pre-select several + + + + Quetzal_AlignFlange + + + Align flange + + + + + Rotates the section of the beam to make the faces parallel to another face + Rotates the section of the beam to make the faces parallel to another face + + + + Quetzal_Attach2Tube + + + Attach to tube + + + + + Attach one pype to the nearest port of selected pipe + Attach one pype to the nearest port of selected pipe + + + + Quetzal_BreakPipe + + + Break the pipe + Break the pipe + + + + Break one pipe at point and insert gap + Break one pipe at point and insert gap + + + + Quetzal_CapQM + + + QM for caps + QM for caps + + + + Quetzal_CreateCutList + + + createCutList + createCutList + + + + Create a new Cut List from Quetzal Beams + Create a new Cut List from Quetzal Beams + + + + Quetzal_ElbowQM + + + QM for elbows + QM for elbows + + + + Quetzal_ExtendBeam + + + Extend the beam + + + + + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + Extend the beam either to a face, a vertex or the c.o.m. of the selected object + + + + Quetzal_ExtendIntersection1 + + + Extend pipe to intersection + + + + + Extends pipe to intersection + Extends pipe to intersection + + + + Quetzal_ExtendIntersection2 + + + Extend pipes to intersection + + + + + Extends pipes to intersection + Extends pipes to intersection + + + + Quetzal_FlangeQM + + + QM for flanges + QM for flanges + + + + Quetzal_Flat + + + Fit one elbow + Fit one elbow + + + + Place the elbow between two pipes or beams + Place the elbow between two pipes or beams + + + + Quetzal_FrameBranchManager + + + FrameBranch Manager + FrameBranch Manager + + + + Open FrameBranch Manager + Open FrameBranch Manager + + + + Quetzal_FrameIt + + + Place one-beam over one-edge + Place one-beam over one-edge + + + + Place one beam after the other over the edges + Place one beam after the other over the edges + + + + Quetzal_HackedLine + + + Draw a Draft wire + + + + + WP is re-positioned at each point. Possible to spin and offset it. + WP is re-positioned at each point. Possible to spin and offset it. + + + + Quetzal_InsertAnyShape + + + Insert any shape + Insert any shape + + + + Insert a STEP, IGES or BREP + Insert a STEP, IGES or BREP + + + + Quetzal_InsertBranch + + + Insert a branch + Insert a branch + + + + Insert a PypeBranch + Insert a PypeBranch + + + + Quetzal_InsertCap + + + + Insert a cap + Insert a cap + + + + Quetzal_InsertElbow + + + + Insert a curve + Insert a curve + + + + Quetzal_InsertFlange + + + + Insert a flange + Insert a flange + + + + Quetzal_InsertPath + + + Insert path + + + + + Creates one path along selected edges + Creates one path along selected edges + + + + Quetzal_InsertPipe + + + + Insert a tube + Insert a tube + + + + Quetzal_InsertPypeLine + + + PypeLine Manager + PypeLine Manager + + + + Open PypeLine Manager + Open PypeLine Manager + + + + Quetzal_InsertReduct + + + + Insert a reduction + Insert a reduction + + + + Quetzal_InsertRoute + + + Insert a pipe route + Insert a pipe route + + + + Create a sketch attached to a circular edge + Create a sketch attached to a circular edge + + + + Quetzal_InsertSection + + + Insert sections + Insert sections + + + + Creates customized beam profiles 2D + Creates customized beam profiles 2D + + + + Quetzal_InsertTank + + + Insert a tank + Insert a tank + + + + Create tank and nozzles + Create tank and nozzles + + + + Quetzal_InsertUbolt + + + + Insert a U-bolt + Insert a U-bolt + + + + Quetzal_InsertValve + + + + Insert a valve + Infoga en ventil + + + + Quetzal_JoinPype + + + Join pipes + + + + + Select the part-pype and the port + Select the part-pype and the port + + + + Quetzal_Laydown + + + Lay-down the pipe + Lay-down the pipe + + + + Lay-down the pipe on the support plane + Lay-down the pipe on the support plane + + + + Quetzal_LevelBeam + + + Flush the surfaces + Flush the surfaces + + + + Shift the beams to line-up the faces to the first selection (faces must be //) + Shift the beams to line-up the faces to the first selection (faces must be //) + + + + Quetzal_MakeHeader + + + Connect to header + Connect to header + + + + Connect branches to one header pipe +Branches and header's axes must be ortho + Connect branches to one header pipe +Branches and header's axes must be ortho + + + + Quetzal_MateEdges + + + Mate pipes edges + Mate pipes edges + + + + Mate two terminations through their edges + Mate two terminations through their edges + + + + Quetzal_MoveHandle + + + Move objects + Flytta objekt + + + + Move quickly objects inside viewport + Move quickly objects inside viewport + + + + Quetzal_MoveWorkPlane + + + Align workplane + + + + + Moves and rotates the drafting workplane with points, edges and faces + Moves and rotates the drafting workplane with points, edges and faces + + + + Quetzal_OffsetWorkPlane + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + Offset workplane + + + + + Shifts the WP along its normal. + Shifts the WP along its normal. + + + + Quetzal_PipeQM + + + QM for pipes + QM for pipes + + + + Quetzal_PivotBeam + + + Pivot the beam + + + + + Rotates the beam around an axis (edge or center-of-curvature) + Rotates the beam around an axis (edge or center-of-curvature) + + + + Quetzal_Point2Point + + + Draw a tube point by point + + + + + A new body is created on each click on subsequent points + + + + + Quetzal_PressureLossCalculator + + + Pressure loss calculator + Pressure loss calculator + + + + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + Calculate pressure loss in 'pypes' using ChEDL libraries. +See __doc__ of the module for further information. + + + + Quetzal_QueryModel + + + Query the model + + + + + Click objects to print infos + Click objects to print infos + + + + Quetzal_Raiseup + + + Raise-up the support + Raise-up the support + + + + Raise the support to the pipe + Raise the support to the pipe + + + + Quetzal_ReverseBeam + + + Reverse orientation + Reverse orientation + + + + Reverse the orientation of selected objects + Reverse the orientation of selected objects + + + + Quetzal_RotateJoin + + + Rotate join to edge + + + + + Rotates and align the beam according another edge + Rotates and align the beam according another edge + + + + Quetzal_RotateWorkPlane + + + Rotate workplane + + + + + Spin the Draft working plane about one of its axes + Spin the Draft working plane about one of its axes + + + + Quetzal_SelectSolids + + + Select solids + Select solids + + + + Grab all solids or those partially selected + to export in .step format + Grab all solids or those partially selected + to export in .step format + + + + Quetzal_ShiftBeam + + + Shift the beam + + + + + Translate objects by vectors defined on existing geometry + Translate objects by vectors defined on existing geometry + + + + Quetzal_SpinSection + + + Spin beams by 45 deg. + Spin beams by 45 deg. + + + + Rotates the section of the beam by 45 degrees + Rotates the section of the beam by 45 degrees + + + + Quetzal_StretchBeam + + + Stretch the beam + + + + + Changes the length of the beam, either according a preselected edge or a direct input + Changes the length of the beam, either according a preselected edge or a direct input + + + + Quetzal_ValveQM + + + QM for valves + QM for valves + + + + Transaction + + + Spin + + + + + Reverse + Omvänd + + + + Level The Beams + + + + + Align Edge + + + + + Rotate to Join on Edge + + + + + Make Path + + + + + Mate + + + + + Extend pipes to intersection + + + + + Extend pipe to intersection + + + + + Lay-down the pipe + Lay-down the pipe + + + + Raise-up the support + Raise-up the support + + + + Attach to tube + + + + + Connect to header + Connect to header + + + + Insert Single Structure + + + + + Insert Frame Branch + + + + + Trim Frame Branch + + + + + Update Frame Line + + + + + Fill frame + Fill frame + + + + Extend beam + + + + + Stretch beam + + + + + Translate + + + + + Align Flange + + + + + Rotate The Beam Around + + + + + Insert profile + Insert profile + + + + Modify profile + Modify profile + + + + Adjust angle + Adjust angle + + + + Insert pipe + + + + + Insert elbow + + + + + Insert flange + + + + + Insert cap + + + + + Insert valve + + + + + Place one curve + + + + + Redraw pipe-lines + + + + + Trim pipes + + + + + Insert reduction + + + + + Insert clamp in (0,0,0) + + + + + Insert clamp on tube + + + + + Insert pipe line + + + + + Assign Base + + + + + Insert pipe branch + + + + + Break pipes + + + + + Point to Point + + + + + Add nozzles + + + + + Make pipe route + + + + + Join + + + + + Workbench + + + Quetzal + Quetzal + + + + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support and adding translation support. + + + + Frame tools + Frame tools + + + + + + Utils + Utils + + + + + + Pipe tools + + + + + QM Menus + QM Menus + + + + Frames + Frames + + + + Pipes + + + + + breakForm + + + Break the pipes + Break the pipes + + + + Length + Längd + + + + <reference> + <reference> + + + + PypeLine: + PypeLine: + + + + + <none> + <none> + + + + <new> + <new> + + + + dpCalcDialog + + + + *** CUSTOM FLUID *** + *** CUSTOM FLUID *** + + + + <custom fluid> + <custom fluid> + + + + + No data found + No data found + + + + It seems the fluid has not a liquid state. + It seems the fluid has not a liquid state. + + + + *** LIQUID *** + *** LIQUID *** + + + + Flow (m3/h) + Flow (m3/h) + + + + It seems the fluid has not a gas state. + It seems the fluid has not a gas state. + + + + *** GAS/VAPOUR *** + *** GAS/VAPOUR *** + + + + Flow (kg/h) + Flow (kg/h) + + + + fObservers + + + Select one beam and one edge + Select one beam and one edge + + + + First select the base beam, then the edges + First select the base beam, then the edges + + + + First select the target plane, then the faces to align + First select the target plane, then the faces to align + + + + levelTheBeam + Transaction + levelTheBeam + + + + Select the target face, then the others + Select the target face, then the others + + + + alignFlange + Transaction + alignFlange + + + + Select two edges to join. + Select two edges to join. + + + + joinTheBeamsEdges + Transaction + joinTheBeamsEdges + + + + Select the beam and input the length + Select the beam and input the length + + + + First Select the target shape, then the beams to extend. + First Select the target shape, then the beams to extend. + + + + Select 2 edges + Select 2 edges + + + + Select 2 edges =>[Ctrl]+select + Select 2 edges =>[Ctrl]+select + + + + rotJoin + Transaction + rotJoin + + + + insertBranchForm + + + Insert a branch + Insert a branch + + + + <name> + <name> + + + + <bend radius> + <bend radius> + + + + insertCapForm + + + Insert caps + Insert caps + + + + Reverse + Omvänd + + + + Apply + Apply + + + + insertElbowForm + + + Insert elbows + Insert elbows + + + + <bend angle> + <bend angle> + + + + <bend radius> + <bend radius> + + + + Trim/Extend + Trim/Extend + + + + Reverse + Omvänd + + + + Apply + Apply + + + + 0 deg + 0 deg + + + + Wrong selection + + Wrong selection + + + + + deg + deg + + + + insertFlangeForm + + + Insert flanges + Insert flanges + + + + Reverse + Omvänd + + + + Apply + Apply + + + + insertPipeForm + + + Insert pipes + Insert pipes + + + + <length> + <length> + + + + Reverse + Omvänd + + + + Apply + Apply + + + + insertPypeLineForm + + + PypeLine Manager + PypeLine Manager + + + + <name> + <name> + + + + Redraw + Redraw + + + + Part list + Part list + + + + Color + Färg + + + + Get Path + Get Path + + + + Get Profile + Get Profile + + + + + + + + + + <new> + <new> + + + + insertReductForm + + + Insert reductions + Insert reductions + + + + Reverse + Omvänd + + + + Apply + Apply + + + + Eccentric + Eccentric + + + + insertRouteForm + + + <select an edge> + <select an edge> + + + + insertUboltForm + + + Insert U-bolt + Insert U-bolt + + + + - no ref. face - + - no ref. face - + + + + Ref. face + Ref. face + + + + Head + Head + + + + Middle + Middle + + + + Tail + Tail + + + + insertValveForm + + + Insert valves + Infoga ventiler + + + + Reverse + Omvänd + + + + Apply + Apply + + + + Insert in pipe + Insert in pipe + + + + makeframenbranch + + + Structure + + + + + mouseActionB1 + + + ____TAIL + ____TAIL + + + + pForms + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + point2pointPipe + + + Reset + Återställ + + + + Move WP on click + Move WP on click + + + + profEdit + + + Shift profile + Shift profile + + + + protoPypeForm + + + + Rating: + Rating: + + + + Insert + Infoga + + + + protoTypeDialog + + + "%s" to select; "%s" to execute + "%s" to select; "%s" to execute + + + + No view available. + No view available. + + + + Actions "%s" and "%s" removed + Actions "%s" and "%s" removed + + + + rotWPForm + + + Angle: + Vinkel: + + + + Rotate working plane + Rotate working plane + + + + uCmd + + + Quick move + Transaction + Quick move + + + + Offset Work Plane + Offset Work Plane + + + + Offset: + Offset: + + + + uForms + + + QueryTool + QueryTool + + + + (Select a object) + (Select a object) + + + + (base) + (base) + + + + Base: + Base: + + + + (angle) + (angle) + + + + Rotation angle: + Rotation angle: + + + + v = (x,y,z) + v = (x,y,z) + + + + Rotation axis: + Rotation axis: + + + + (Sub object property) + (Sub object property) + + + + (Beam property) + (Beam property) + + + + (Profile property) + (Profile property) + + + + QueryObject + QueryObject + + + + Exit + Exit + + + + Rotate WP + Rotate WP + + + diff --git a/translationz/dodo.ts b/translationz/dodo.ts deleted file mode 100644 index 6faa927..0000000 --- a/translationz/dodo.ts +++ /dev/null @@ -1,3174 +0,0 @@ - - - - - App::Property - - - - - - - Outside diameter - - - - - - - - - - Wall thickness - - - - - - - - Inside diameter - - - - - - Length of tube - - - - - - - - Section dim. - - - - - Bend Angle - - - - - - Bend Radius - - - - - Type of flange - - - - - Flange diameter - - - - - Bore diameter - - - - - Bolts distance - - - - - Bolts hole diameter - - - - - Thickness of flange - - - - - Nr. of bolts - - - - - Thickness of raised face - - - - - Diameter of raised face - - - - - Length of welding neck - - - - - Diameter of welding neck - - - - - Outside diameter of pipe - - - - - Major diameter - - - - - Minor diameter - - - - - Make the lenght variable - - - - - Length of reduction - - - - - Concentric or Eccentric - - - - - the radius of bending - - - - - The group. - - - - - Type of pipeFeature - - - - - Type of clamp - - - - - Size of clamp - - - - - Arc diameter - - - - - Overall height - - - - - Rod diameter - - - - - Size of thread - - - - - Ports position relative to the origin of Shape - - - - - Tank's length - - - - - Tank's width - - - - - Tank's height - - - - - Thikness of tank's shell - - - - - Thikness of tank's top - - - - - The tubes of the branch. - - - - - The curves of the branch. - - - - - The path. - - - - - App::PropertyFloat - - - - The extension of the tail - - - - - - The extension of the head - - - - - - The rotation of the section - - - - - Flow factor (m3/h/bar) - - - - - App::PropertyLength - - - - - - Width of the beam - - - - - - - - - - - Height of the beam - - - - - Thickness of the vertical sides - - - - - Thickness of the horizontal sides - - - - - Diameter of the beam - - - - - Thickness - - - - - - W of the beam - - - - - - Thickness of the webs - - - - - H of the beam - - - - - - - Thickness of the web - - - - - Thickness of the flanges - - - - - Width of the flanges - - - - - - - Thickness 1 - - - - - - - Thickness 2 - - - - - - - Thickness 3 - - - - - - Width of the bottom flange - - - - - - Width of the top flange - - - - - Outside diameter - - - - - Wall thickness - - - - - App::PropertyLink - - - the edges - - - - - the profile - - - - - The path. - - - - - The profile - - - - - App::PropertyString - - - - Type of frameFeature - - - - - Size of frame - - - - - The group. - - - - - - - - - - - - - Type of section - - - - - Type of tubeFeature - - - - - Rating of pipeFeature - - - - - Nominal diameter - - - - - App::PropertyStringList - - - The beams names - - - - - App::PropertyVectorList - - - Ports position relative to the origin of Shape - - - - - DialogQM - - - Quick Insert - - - - - FrameBranchManager - - - FrameBranch Manager - - - - - Open FrameBranch Manager - - - - - Part::Feature - - - Simple curve - - - - - Part::FeaturePython - - - Tube - - - - - Elbow - - - - - Flange - - - - - Reduction - - - - - U-Bolt - - - - - Tank - - - - - Cap - - - - - Valve - - - - - Sketcher::SketchObject - - - pipeRoute - - - - - adjustFrameAngle - - - adjustFrameAngle - - - - - Adjust the angle of frame by two edges - - - - - alignEdge - - - Mate the edges - - - - - Join two edges: select two or pre-select several - - - - - alignFlange - - - alignFlange - - - - - Rotates the section of the beam to make the faces parallel to another face - - - - - attach2tube - - - Attach to tube - - - - - Attach one pype to the nearest port of selected pipe - - - - - breakForm - - - Break the pipes - - - - - Length - - - - - <reference> - - - - - PypeLine: - - - - - <none> - - - - - breakPipe - - - Break the pipe - - - - - Break one pipe at point and insert gap - - - - - capQM - - - QM for caps - - - - - dodo - - - - Utils - - - - - frametools - - - - - pypetools - - - - - Frame tools - - - - - Pype tools - - - - - QkMenus - - - - - dpCalc - - - Pressure loss calculator - - - - - Calculate pressure loss in "pypes" using ChEDL libraries. - See __doc__ of the module for futher information. - - - - - dpCalcDialog - - - - *** CUSTOM FLUID *** - - - - - <custom fluid> - - - - - - No data found - - - - - It seems the fluid has not a liquid state. - - - - - It seems the fluid has not -a liquid state. - - - - - *** LIQUID *** - - - - - Flow (m3/h) - - - - - It seems the fluid has not a gas state. - - - - - It seems the fluid has not -a gas state. - - - - - *** GAS/VAPOUR *** - - - - - Flow (kg/h) - - - - - elbowQM - - - QM for elbows - - - - - extend - - - extendTheBeam - - - - - Extend the beam either to a face, a vertex or the c.o.m. of the selected object - - - - - extend1intersection - - - - Extends pipe to intersection - - - - - extend2intersection - - - - Extends pipes to intersection - - - - - fObservers - - - Select one beam and one edge - - - - - First select the base beam, then the edges - - - - - First select the target plane, then the faces to align - - - - - levelTheBeam - Transaction - - - - - Select the target face, then the others - - - - - alignFlange - Transaction - - - - - Select two edges to join. - - - - - joinTheBeamsEdges - Transaction - - - - - Select the beam and input the length - - - - - First Select the target shape, then the beams to extend. - - - - - Select 2 edges - - - - - Adjust angle - Transaction - - - - - Select 2 edges =>[Ctrl]+select - - - - - rotJoin - Transaction - - - - - flangeQM - - - QM for flanges - - - - - flat - - - Fit one elbow - - - - - Place the elbow between two pipes or beams - - - - - frameIt - - - Place one-beam over one-edge - - - - - Place one beam after the other over the edges - - - - - hackedL - - - draw a DWire - - - - - WP is re-positioned at each point. Possible to spin and offset it. - - - - - insertAnyz - - - Insert any shape - - - - - Insert a STEP, IGES or BREP - - - - - insertBranch - - - Insert a branch - - - - - Insert a PypeBranch - - - - - insertBranchForm - - - Insert a branch - - - - - <name> - - - - - <bend radius> - - - - - insertCap - - - - Insert a cap - - - - - insertCapForm - - - Insert caps - - - - - Reverse - - - - - Apply - - - - - insertElbow - - - - Insert a curve - - - - - insertElbowForm - - - Insert elbows - - - - - <bend angle> - - - - - <bend radius> - - - - - Trim/Extend - - - - - Reverse - - - - - Apply - - - - - 0 deg - - - - - Wrong selection - - - - - - deg - - - - - insertFlange - - - - Insert a flange - - - - - insertFlangeForm - - - Insert flanges - - - - - Reverse - - - - - Apply - - - - - insertPath - - - insert Path - - - - - Creates one path along selected edges - - - - - insertPipe - - - - Insert a tube - - - - - insertPipeForm - - - Insert pipes - - - - - <length> - - - - - Reverse - - - - - Apply - - - - - insertPypeLine - - - PypeLine Manager - - - - - Open PypeLine Manager - - - - - insertPypeLineForm - - - PypeLine Manager - - - - - <name> - - - - - Redraw - - - - - Part list - - - - - Color - - - - - Get Path - - - - - Get Profile - - - - - <new> - - - - - insertReduct - - - - Insert a reduction - - - - - insertReductForm - - - Insert reductions - - - - - Reverse - - - - - Apply - - - - - Eccentric - - - - - insertRoute - - - Insert a pipe route - - - - - Create a sketch attached to a circular edge - - - - - insertRouteForm - - - <select an edge> - - - - - insertSection - - - Insert sections - - - - - Creates customized beam profiles 2D - - - - - insertTank - - - Insert a tank - - - - - Create tank and nozzles - - - - - insertTankForm - - - doing combine - - - - - files read - - - - - files not read - - - - - listNozzles: %s - - - - - insertUbolt - - - - Insert a U-bolt - - - - - insertUboltForm - - - Insert U-bolt - - - - - - no ref. face - - - - - - Ref. face - - - - - Head - - - - - Middle - - - - - Tail - - - - - insertValve - - - - Insert a valve - - - - - insertValveForm - - - Insert valves - - - - - Reverse - - - - - Apply - - - - - Insert in pipe - - - - - joinPype - - - Join pypes - - - - - Select the part-pype and the port - - - - - laydown - - - Lay-down the pipe - - - - - Lay-down the pipe on the support plane - - - - - levelBeam - - - Flush the surfaces - - - - - Shift the beams to line-up the faces to the first selection (faces must be //) - - - - - makeHeader - - - Connect to header - - - - - Connect branches to one header pipe -Branches and header's axes must be ortho - - - - - mateEdges - - - Mate pipes edges - - - - - Mate two terminations through their edges - - - - - moveHandle - - - Move objects - - - - - Move quickly objects inside viewport - - - - - moveWorkPlane - - - align Workplane - - - - - Moves and rotates the drafting workplane with points, edges and faces - - - - - offsetWorkPlane - - - Offset Work Plane - - - - - Offset: - - - - - offset Workplane - - - - - Shifts the WP alongg its normal. - - - - - pForms - - - Offset Work Plane - - - - - Offset: - - - - - pipeQM - - - QM for pipes - - - - - pivotBeam - - - pivotTheBeam - - - - - Rotates the beam around an axis (edge or center-of-curvature) - - - - - point2point - - - draw a tube point-to-point - - - - - Click on subsequent points. - - - - - point2pointPipe - - - Reset - - - - - Move WP on click - - - - - profEdit - - - Square - Profile name in the Tree View - - - - - T-profile - Profile name in the Tree View - - - - - U-profile - Profile name in the Tree View - - - - - H-profile - Profile name in the Tree View - - - - - L-profile - Profile name in the Tree View - - - - - Z-profile - Profile name in the Tree View - - - - - Omega-profile - Profile name in the Tree View - - - - - Circle-profile - Profile name in the Tree View - - - - - Insert profile - Transaction, used on undo/redo lists - - - - - Modify profile - Transaction, used on undo/redo lists - - - - - Shift profile - Transaction, used on undo/redo lists - - - - - protoPypeForm - - - - Rating: - - - - - Insert - - - - - protoTypeDialog - - - "%s" to select; "%s" to execute - - - - - "%s" to select; "%s" to execute - - - - - - No view available. - - - - - No view available. - - - - - - Actions "%s" and "%s" removed - - - - - Actions "%s" and "%s" removed - - - - - - queryModel - - - query the model - - - - - Click objects to print infos - - - - - raiseup - - - Raise-up the support - - - - - Raise the support to the pipe - - - - - reverseBeam - - - Reverse orientation - - - - - Reverse the orientation of selected objects - - - - - rotJoin - - - rotJoinEdge - - - - - Rotates and align the beam according another edge - - - - - rotWPForm - - - Angle: - - - - - Rotate working plane - - - - - rotateWorkPlane - - - rotate Workplane - - - - - Spin the Draft working plane about one of its axes - - - - - selectSolids - - - Select solids - - - - - Grab all solids or those partially selected - to export in .step format - - - - - shiftBeam - - - shiftTheBeam - - - - - Translate objects by vectors defined on existing geometry - - - - - spinSect - - - Spin beams by 45 deg. - - - - - Rotates the section of the beam by 45 degrees - - - - - stretchBeam - - - stretchTheBeam - - - - - Changes the length of the beam, either according a preselected edge or a direct input - - - - - uCmd - - - Quick move - Transaction - - - - - Offset Work Plane - - - - - Offset: - - - - - uForms - - - QueryTool - - - - - (Select a object) - - - - - (base) - - - - - Base: - - - - - (angle) - - - - - Rotation angle: - - - - - v = (x,y,z) - - - - - Rotation axis: - - - - - (Sub object property) - - - - - (Beam property) - - - - - (Profile property) - - - - - QueryObject - - - - - Exit - - - - - Angle: - - - - - Rotate WP - - - - - valveQM - - - QM for valves - - - - - Dialog - - - Dp calculator - - - - - calculation - - - - - Nr. of curves = 0 - - - - - Roughness (um) - - - - - Flow-rate (m3/h) - - - - - Total length = 0 - - - - - Scope - - - - - <on selection> - - - - - Pipe material - - - - - fluid properties - - - - - Density (kg/m3) - - - - - liquid - - - - - T (°C) - - - - - Viscosity (cP) - - - - - gas/vapour - - - - - Name - - - - - P abs. (bar) - - - - - results - - - - - Export - - - - - *** LIQUID *** - - - - - --- - - - - - - Dialog - - - - - (M)ove origin on click - - - - - (R)otate WP - - - - - (O)ffset WP - - - - - - - Align WP to principal plane - - - - - Rotate around axis - - - - - Reverse - - - - - <select one axis> - - - - - copy items - - - - - hotkeys: "S" to select, "X" to execute - - - - - (S)et axis - - - - - Beams profile editor - - - - - t1 - - - - - t2 - - - - - t3 - - - - - <name> - - - - - NW - - - - - N - - - - - NE - - - - - W - - - - - C - - - - - E - - - - - SW - - - - - S - - - - - SE - - - - - - - - - - - - ... - - - - - Full section - - - - - Apply -dimensions - - - - - Shift -profile - - - - - Import shapes - - - - - <shapes> - - - - - Tank - - - - - Length - - - - - X - - - - - Width: - - - - - Y - - - - - Height: - - - - - Z - - - - - Nozzles - - - - - Pipe type: - - - - - - <select> - - - - - Flange type: - - - - - Add nozzle - - - - - DialogAlign - - - Align flanges - - - - - normY - - - - - YZ - - - - - (S)elect face - - - - - XZ - - - - - hotkeys: "S" to select, "X" to execute - - - - - XY - - - - - < select a target face > - - - - - Set normal - - - - - Set notmal - - - - - normX - - - - - normZ - - - - - Invert normal - - - - - DialogBeamShift - - - Move - - - - - Multiple: - - - - - - 1 - - - - - - - 0 - - - - - Set dist. - - - - - Z: - - - - - Z: - - - - - Steps: - - - - - Steps: - - - - - Y: - - - - - Y: - - - - - copy - - - - - X: - - - - - X: - - - - - hotkeys: "S" to select, "X" to execute - - - - - DialogBeamStretch - - - Stretch - - - - - (S)et length - - - - - both - - - - - head - - - - - tail - - - - - New length - mm: - - - - - hotkeys: "S" to select, "X" to execute - - - - - Stretched end: - - - - - DialogDisp - - - Dialog - - - - - Angle: - - - - - SET - - - - - * Click on arrow to move - * Ctrl+Click to go back - * Ctrl+Alt+Click to rotate - - - - - Displacement: - - - - - 100 - - - - - 90 - - - - - DialogExtend - - - Extend beams - - - - - < select a target > - - - - - (S)elect target - - - - - hotkeys: "S" to select, "X" to execute - - - - - DialogFBranch - - - FrameBranch Manager - - - - - <no target selected> - - - - - <degrees> - - - - - offset tail - - - - - Trim/Extend - - - - - AddBeams - - - - - Add single beam - - - - - Add single - - - - - ChangeProfile - - - - - <name> - - - - - <no item selected> - - - - - Redraw - - - - - offset head - - - - - RemoveBeams - - - - - Get targets - - - - - <length> - - - - - hotkeys: "S" to select, "X" to trim - - - - - DialogFillFrame - - - Fill frame - - - - - move - - - - - (S)elect - - - - - < select a beam > - - - - - copy - - - - - hotkeys: "S" to select, "X" to execute - - - - - DialogJoinPypes - - - Join pypes - - - - - Reset - - - - - hotkeys: "S" to select, "X" to execute - - - - - DialogProtoPipeForm - - - Dialog - - - - - Rating: - - - - - Insert - - - - - DialogRoute - - - Create pipe route - - - - - Y - - - - - X - - - - - Z - - - - - global Z - - - - - Normal to sketch: - - - - - Offset (mm): - - - - - 0 - - - - - <select an edge> - - - - - Get edge - - - - - (S)et normal - - - - - hotkeys: -"S" to select normal from geometry -"X" to execute - - - - - DialogValves - - - Insert valves - - - - - Apply - - - - - Reverse - - - - - Type: - - - - - DialogDp - - - Dp calculator - - - - - calculation - - - - - Nr. of curves = 0 - - - - - Roughness (um) - - - - - 100 - - - - - - 20 - - - - - Flow-rate (m3/h) - - - - - Total length = 0 - - - - - Scope - - - - - <on selection> - - - - - Pipe material - - - - - fluid properties - - - - - Density (kg/m3) - - - - - liquid - - - - - T (°C) - - - - - Viscosity (cP) - - - - - - 0 - - - - - gas/vapour - - - - - 1 - - - - - Name - - - - - P abs. (bar) - - - - - results - - - - - Export - - - - - *** LIQUID *** - - - - - --- - - - - - DialogHackedLine - - - Dialog - - - - - (M)ove origin on click - - - - - (R)otate WP - - - - - (O)ffset WP - - - - - - - Align WP to principal plane - - - - - XY - - - - - XZ - - - - - YZ - - - - - DialogRotAround - - - Rotate around axis - - - - - Z - - - - - 90 - - - - - Y - - - - - Reverse - - - - - X - - - - - <select one axis> - - - - - copy items - - - - - hotkeys: "S" to select, "X" to execute - - - - - (S)et axis - - - - - DialogSections - - - Beams profile editor - - - - - - 45 - - - - - D - - - - - 80 - - - - - H - - - - - B - - - - - t1 - - - - - - - 5 - - - - - t2 - - - - - t3 - - - - - <name> - - - - - NW - - - - - N - - - - - NE - - - - - W - - - - - C - - - - - E - - - - - SW - - - - - S - - - - - SE - - - - - - - - - - - - ... - - - - - Full section - - - - - Apply -dimensions - - - - - Shift -profile - - - - - DialogShapes - - - Import shapes - - - - - <shapes> - - - - - - - - - - - DialogTank - - - Dialog - - - - - Tank - - - - - Length - - - - - X - - - - - Width: - - - - - Y - - - - - Height: - - - - - Z - - - - - Nozzles - - - - - Pipe type: - - - - - - <select> - - - - - Flange type: - - - - - 200 - - - - - Add nozzle - - - - diff --git a/translationz/dodo_es-ES.qm b/translationz/dodo_es-ES.qm deleted file mode 100644 index 87892a9447d086e09b9159afa98bbb8f1f265e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50817 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 * +# * Copyright (c) 2021 Benjamin Nauck * +# * Copyright (c) 2021 Mattias Pierre * +# * * +# * This file is part of FreeCAD. * +# * * +# * FreeCAD is free software: you can redistribute it and/or modify it * +# * under the terms of the GNU Lesser General Public License as * +# * published by the Free Software Foundation, either version 2.1 of the * +# * License, or (at your option) any later version. * +# * * +# * FreeCAD is distributed in the hope that it will be useful, but * +# * WITHOUT ANY WARRANTY; without even the implied warranty of * +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * +# * Lesser General Public License for more details. * +# * * +# * You should have received a copy of the GNU Lesser General Public * +# * License along with FreeCAD. If not, see * +# * . * +# * * +# *************************************************************************** + +""" +This utility offers several commands to interact with the FreeCAD project on +crowdin. For it to work, you need a ~/.crowdin-freecad-token file in your +user's folder, that contains the API access token that gives access to the +crowdin FreeCAD project. The API token can also be specified in the +CROWDIN_TOKEN environment variable. + +The CROWDIN_PROJECT_ID environment variable can be used to use this script +in other projects. + +Usage: + + updatecrowdin.py [] + +Available commands: + + gather: update all ts files found in the source code + (runs updatets.py) + status: prints a status of the translations + update-source: updates on CrowdIn the current version of .ts file + found in the source code + update-translation [locale]: updates on CrowdIn the current version of locale .ts files + passed to the command + build: builds a new downloadable package on CrowdIn with all + translated strings + build-status: shows the status of the current builds available on + CrowdIn + download [build_id]: downloads build specified by 'build_id' or latest if + build_id is left blank + apply / install: applies downloaded translations to source code + (runs updatefromcrowdin.py) + +Example: + + ./updatecrowdin.py update + +Setting the project name adhoc: + + CROWDIN_PROJECT_ID=some_project ./updatecrowdin.py update +""" + +# NOTE: See CrowdIn API docs at: https://support.crowdin.com/developer/api/v2/ + +import concurrent.futures +import json +import os +import shutil +import subprocess +import sys +import tempfile +import zipfile +from collections import namedtuple +from functools import lru_cache +from urllib.parse import quote_plus +from urllib.request import Request, urlopen, urlretrieve + +TsFile = namedtuple("TsFile", ["filename", "src_path"]) +translation_source = [TsFile("Quetzal.ts", "Quetzal.ts")] + +# NOTE: location tuple contains: +# - module name +# - relative path to translation folder +WBLocation = namedtuple("WBLocation", ["module_name", "translations_path"]) +wb_location = WBLocation("Quetzal", ".") + +supported_locales = { + "af": "af-ZA", + "ar": "ar-SA", + "eu": "eu-ES", + "be": "be-BY", + "bg": "bg-BG", + "ca": "ca-ES", + "zh-CN": "zh-CN", + "zh-TW": "zh-TW", + "hr": "hr-HR", + "cs": "cs-CZ", + "da": "da-DK", + "nl": "nl-NL", + "fil": "fil-PH", + "fi": "fi-FI", + "fr": "fr-FR", + "gl": "gl-ES", + "ka": "ka-GE", + "de": "de-DE", + "el": "el-GR", + "hu": "hu-HU", + "id": "id-ID", + "it": "it-IT", + "ja": "ja-JP", + "kab": "kab-KAB", + "ko": "ko-KR", + "lt": "lt-LT", + "no": "no-NO", + "pl": "pl-PL", + "pt-PT": "pt-PT", + "pt-BR": "pt-BR", + "ro": "ro-RO", + "ru": "ru-RU", + "sr": "sr-SP", + "sr-CS": "sr-CS", + "sk": "sk-SK", + "sl": "sl-SI", + "es-ES": "es-ES", + "es-AR": "es-AR", + "sv-SE": "sv-SE", + "tr": "tr-TR", + "uk": "uk-UA", + "val-ES": "val-ES", + "vi": "vi-VN", +} + +GREEN = "\033[;32m" if os.name == "posix" else "" +NC = "\033[0m" if os.name == "posix" else "" # no color + +THRESHOLD = 20 # percent for all WB on CrowdIn, useless for each WB +DEBUG_URL = True + + +class CrowdinUpdater: + BASE_URL = "https://api.crowdin.com/api/v2" + + def __init__(self, token, project_identifier, multithread=True): + self.token = token + self.project_identifier = project_identifier + self.multithread = multithread + + @lru_cache() + def _get_project_id(self) -> int: + url = f"{self.BASE_URL}/projects/" + response = self._make_api_req(url) + + for project in [p["data"] for p in response]: + if project["identifier"] == project_identifier: + return project["id"] + + raise Exception("No project identifier found!") + + def _make_api_req(self, url: str, extra_headers: dict = {}, method: str = "GET", data=None): + headers = {"Authorization": "Bearer " + load_token(), **extra_headers} + + if type(data) is dict: + headers["Content-Type"] = "application/json" + data = json.dumps(data).encode("utf-8") + + request = Request(url, headers=headers, method=method, data=data) + return json.loads(urlopen(request).read())["data"] + + def _make_project_api_req(self, project_path: str, *args, **kwargs): + url = f"{self.BASE_URL}/projects/{self._get_project_id()}{project_path}" + if DEBUG_URL: + print(url) + return self._make_api_req(url=url, *args, **kwargs) + + def _get_source_files_info(self) -> dict: + files = self._make_project_api_req("/files?limit=250") + return {f["data"]["path"].strip("/"): str(f["data"]["id"]) for f in files} + + def _add_storage(self, filename: str, fp): + response = self._make_api_req( + f"{self.BASE_URL}/storages", + data=fp, + method="POST", + extra_headers={ + "Crowdin-API-FileName": filename, + "Content-Type": "application/octet-stream", + }, + ) + return response["id"] + + def _update_source_file(self, ts_file: TsFile, files_info: dict): + filename = quote_plus(ts_file.filename) + + with open(ts_file.src_path, "rb") as fp: + storage_id = self._add_storage(filename, fp) + + # only uploads the file if already exists + if filename in files_info: + file_id = files_info[filename] + self._make_project_api_req( + f"/files/{file_id}", + method="PUT", + data={ + "storageId": storage_id, + "updateOption": "keep_translations_and_approvals", + }, + ) + print(f"{filename} updated") + else: + self._make_project_api_req("/files", data={"storageId": storage_id, "name": filename}) + print(f"{filename} was not updated because is not on the list") + + def _upload_translation_file(self, ts_file: TsFile, files_info: dict): + translation_filename = quote_plus(ts_file.filename) + + with open(ts_file.src_path, "rb") as fp: + storage_id = self._add_storage(translation_filename, fp) + + locale = translation_filename.split("_")[1].split(".")[0] # Extracts 'es-ES' + + src_filename = translation_source[0].filename + + if src_filename in files_info: + file_id = files_info[src_filename] + r = self._make_project_api_req( + f"/translations/{supported_locales[locale]}", + method="POST", + data={ + "storageId": storage_id, + "fileId": file_id, + "importEqSuggestions": "true", + "autoApproveImported": "false", + "translateHidden": "false", + "addToTm": "false", + }, + ) + print_response(r) + else: + print(f"{translation_filename} was not updated because is not on the list") + + def status(self): + response = self._make_project_api_req("/languages/progress?limit=100") + return [item["data"] for item in response] + + def download(self, build_id: str): + filename = f"{self.project_identifier}.zip" + response = self._make_project_api_req(f"/translations/builds/{build_id}/download") + urlretrieve(response["url"], filename) + print("download of " + filename + " complete") + + def build(self): + self._make_project_api_req("/translations/builds", data={}, method="POST") + + def build_status(self): + response = self._make_project_api_req("/translations/builds") + return [item["data"] for item in response] + + def update_source(self, ts_files: list): + files_info = self._get_source_files_info() + futures = [] + + with concurrent.futures.ThreadPoolExecutor() as executor: + for ts_file in ts_files: + if self.multithread: + future = executor.submit(self._update_source_file, ts_file, files_info) + futures.append(future) + else: + self._update_source_file(ts_file, files_info) + + # This blocks until all futures are complete and will also throw any exception + for future in futures: + future.result() + + def update_translation(self, ts_files: list): + files_info = self._get_source_files_info() + print(files_info) + futures = [] + + with concurrent.futures.ThreadPoolExecutor() as executor: + for ts_file in ts_files: + if self.multithread: + future = executor.submit(self._upload_translation_file, ts_file, files_info) + futures.append(future) + else: + self._upload_translation_file(ts_file, files_info) + + # This blocks until all futures are complete and will also throw any exception + for future in futures: + future.result() + + +def print_response(response: dict): + print(json.dumps(response, indent=2)) + + +def load_token() -> None | str: + """Loads API token stored in ~/.crowdin-freecad-token""" + config_file = os.path.expanduser("~") + os.sep + ".crowdin-freecad-token" + if not os.path.exists(config_file): + config_file = os.path.expanduser("~") + os.sep + ".crowdin-freecadaddons" + if os.path.exists(config_file): + with open(config_file) as file: + return file.read().strip() + return None + + +def applyTranslations(): + """Extracts files from ZIP file and copy TS files""" + global tempfolder + currentfolder = os.getcwd() + tempfolder = tempfile.mkdtemp() + print(f"Creating temp folder {tempfolder}") + src = os.path.join(currentfolder, "freecad-addons.zip") + dst = os.path.join(tempfolder, "freecad-addons.zip") + if not os.path.exists(src): + print( + "freecad-addons.zip file not found! Aborting.\nRun 'download' command before this one." + ) + sys.exit() + shutil.copyfile(src, dst) + os.chdir(tempfolder) + zfile = zipfile.ZipFile("freecad-addons.zip") + print("Extracting freecad-addons.zip...") + zfile.extractall() + os.chdir(currentfolder) + if not os.path.exists(os.path.join(tempfolder, wb_location.module_name)): + print(f"ERROR: Workbench path for {wb_location.module_name} not found!") + else: + print(f"Updating files for {GREEN}{wb_location.module_name}{NC}...") + # Iterate over all locales + for short_locale, full_locale in supported_locales.items(): + # Copy the translation files to the project directory + oldname = wb_location.module_name + "_" + full_locale + ".ts" + newname = wb_location.module_name + "_" + short_locale + ".ts" + old_file = os.path.join(tempfolder, wb_location.module_name, oldname) + new_file = os.path.join(wb_location.translations_path, newname) + shutil.copyfile(old_file, new_file) + print("Update of translations files has been completed.") + + +if __name__ == "__main__": + command = None + + args = sys.argv[1:] + if args: + command = args[0] + + token = os.environ.get("CROWDIN_TOKEN", load_token()) + if command and not token: + print("Token not found") + sys.exit() + + project_identifier = "freecad-addons" + + updater = CrowdinUpdater(token, project_identifier) + + if command == "status": + status = updater.status() + status = sorted(status, key=lambda item: item["translationProgress"], reverse=True) + # NOTE: this check progress for all WB on CrowdIn, not only the current one + print( + len([item for item in status if item["translationProgress"] > THRESHOLD]), + f"languages with status > {str(THRESHOLD)}%:\n", + ) + sep = False + for item in status: + if item["translationProgress"] > 0: + if (item["translationProgress"] < THRESHOLD) and (not sep): + print("\nOther languages:\n") + sep = True + print( + f"{GREEN}{item['languageId']}{NC} {str(item['translationProgress'])}% " + f"({str(item['approvalProgress'])}% approved)" + ) + + elif command == "build-status": + for item in updater.build_status(): + print(f" id: {item['id']} progress: {item['progress']}% status: {item['status']}") + + elif command == "build": + updater.build() + + elif command == "download": + if len(args) == 2: + updater.download(args[1]) + else: + stat = updater.build_status() + if not stat: + print("no builds found") + elif len(stat) == 1: + updater.download(stat[0]["id"]) + else: + print("available builds:") + for item in stat: + print( + f" id: {item['id']} progress: {item['progress']}% status: {item['status']}" + ) + print("please specify a build id") + + elif command in ["apply", "install"]: + applyTranslations() + subprocess.run(["./update_translation.sh", "-U"]) # update ts files + subprocess.run(["./update_translation.sh", "-R"]) # release qm files + subprocess.run(["./update_translation.sh", "-A"]) # git add and commit above threshold + + elif command == "gather": + # Update agnostic file + subprocess.run(["./update_translation.sh", "-u"]) + + elif command == "update-source": + # Execute after "gather"" command + print("ts file being uploaded to CrowdIn: ", translation_source) + updater.update_source(translation_source) + + elif command == "update-translation": + print("Still does not work") + exit(69) + locale_source = [] + for arg in args[1:]: + locale_source.append(TsFile(f"Quetzal_{arg}.ts", f"Quetzal_{arg}.ts")) + updater.update_translation(locale_source) + + print(locale_source) + + else: + print(__doc__) diff --git a/translationz/update_translation.sh b/translationz/update_translation.sh index 6dce07e..540e0fc 100755 --- a/translationz/update_translation.sh +++ b/translationz/update_translation.sh @@ -74,8 +74,26 @@ update_locale() { if [ "$u" == "" ]; then eval $LUPDATE "$FILES" -ts "${WB}.ts" # locale-agnostic file else - eval $LUPDATE "$FILES" -source-language en -target-language "${locale//-/_}" \ - -ts "${WB}_${locale}.ts" + eval $LUPDATE "$FILES" -source-language en_US -target-language "${locale//-/_}" \ + -ts "${WB}_${locale}.ts" -no-obsolete + fi +} + +git_add_above_threshold() { + local ts_file=$1 + + csv_output=$(pocount --csv "$ts_file" | tail -n 1) + translated_messages=$(echo "$csv_output" | cut -d',' -f2) + total_messages=$(echo "$csv_output" | cut -d',' -f9) + + progress_percentage=$((translated_messages * 100 / total_messages)) + + echo "Translation progress for $ts_file: $progress_percentage%" + + if [ "$progress_percentage" -ge 20 ]; then + git add "${ts_file::-2}"* # to add ts and qm files + else + rm "${ts_file::-2}"* # remove files with no progress fi } @@ -85,8 +103,9 @@ help() { echo -e "\nUsage:" echo -e "\t./update_translation.sh [-R] [-U] [-r ] [-u ]" echo -e "\nFlags:" - echo -e " -R\n\tRelease all locales" - echo -e " -U\n\tUpdate main translation file (locale agnostic)" + echo -e " -A\n\tAdd files above threshold to commit them" + echo -e " -R\n\tRelease all translations (qm files)" + echo -e " -U\n\tUpdate all translations (ts files)" echo -e " -r \n\tRelease the specified locale" echo -e " -u \n\tUpdate strings for the specified locale" } @@ -99,19 +118,28 @@ LRELEASE=/usr/lib/qt6/bin/lrelease # from Qt6 # LRELEASE=lrelease # from Qt5 WB="Quetzal" -# Enforce underscore on locales -sed -i '3s/-/_/' ${WB}*.ts +sed -i '3s/-/_/' ${WB}*.ts # Enforce underscore on locales +sed -i '3s/\"en\"/\"en_US\"/g' ${WB}*.ts # Use en_US if [ $# -eq 1 ]; then - if [ "$1" == "-R" ]; then + if [ "$1" == "-A" ]; then + find . -type f -name '*_*.ts' | while IFS= read -r file; do + git_add_above_threshold "$file" + done + git status + git commit -m "Update translations from CrowdIn" + elif [ "$1" == "-R" ]; then find . -type f -name '*_*.ts' | while IFS= read -r file; do # Release all locales - $LRELEASE "$file" + $LRELEASE -nounfinished "$file" echo done elif [ "$1" == "-U" ]; then - # Update main file (agnostic) - update_locale + for locale in "${supported_locales[@]}"; do + update_locale "$locale" + done + elif [ "$1" == "-u" ]; then + update_locale # Update main file (agnostic) else help fi @@ -120,7 +148,7 @@ elif [ $# -eq 2 ]; then if is_locale_supported "$LOCALE"; then if [ "$1" == "-r" ]; then # Release locale (creation of *.qm file from *.ts file) - $LRELEASE "${WB}_${LOCALE}.ts" + $LRELEASE -nounfinished "${WB}_${LOCALE}.ts" elif [ "$1" == "-u" ]; then # Update main & locale files update_locale From 58318d33260a6eb30790b4bdcde0187eefeff3ef Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 12 Jan 2025 18:28:05 -0600 Subject: [PATCH 086/135] Add `.editorconfig` file for shell script --- .editorconfig | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..21f0366 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,7 @@ +[*.sh] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true From a0997a2ac2c8a5dc731b8847dbe48cb08206cf3e Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 12 Jan 2025 18:34:21 -0600 Subject: [PATCH 087/135] Update `package.xml` file Fix #1 --- package.xml | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/package.xml b/package.xml index 0912c67..fe238ae 100644 --- a/package.xml +++ b/package.xml @@ -3,23 +3,25 @@ Quetzal - A set of commands and objects that help to speed-up the drawing of frames and pipelines. Py3/Qt5 port of flamingo. + A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.0.1 + 1.1.0 - 2024-10-20 + 2025-01-15 Edgar J Robles LGPL-3.0-or-later - https://github.com/EdgarJRobles/dodo + 3.7.0 - https://github.com/EdgarJRobles/dodo/issues + https://github.com/EdgarJRobles/quetzal - https://github.com/EdgarJRobles/dodo/blob/master/README.md + https://github.com/EdgarJRobles/quetzal/issues - https://wiki.freecad.org/Dodo_Workbench + https://github.com/EdgarJRobles/quetzal/blob/master/README.md + + https://wiki.freecad.org/Quetzal_Workbench https://forum.freecad.org/viewtopic.php?t=22711 @@ -29,6 +31,13 @@ + Arch + Draft + beams + frames + pipe + pipelines + iconz/quetzal.svg QuetzalWorkbench ./ From 44f0e8977e716fa84e59828d6e7d5d16428869f2 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 12 Jan 2025 19:23:19 -0600 Subject: [PATCH 088/135] More black formatting to missing files with ruff hook To have same style on the WB --- CFrame.py | 28 +- CPipe.py | 15 +- CUtils.py | 5 +- ShpstData.py | 4 +- anyShapez.py | 4 +- cut_list/cut_list_creation.py | 15 +- cut_list/cut_list_ui.py | 3 +- cut_list/resultSpreadsheet.py | 5 - dodoDialogs.py | 1 - fCmd.py | 3 +- fFeatures.py | 687 ++++++++++++++++++---------------- pCmd.py | 26 +- pFeatures.py | 124 +++--- pForms.py | 36 +- pObservers.py | 4 +- uCmd.py | 15 +- uForms.py | 4 +- 17 files changed, 530 insertions(+), 449 deletions(-) diff --git a/CFrame.py b/CFrame.py index 433472f..fe20258 100644 --- a/CFrame.py +++ b/CFrame.py @@ -30,7 +30,8 @@ class frameIt: """ def Activated(self): - import FreeCAD, FreeCADGui, fObservers, fCmd + import FreeCADGui + import fObservers s = fObservers.frameItObserver() FreeCADGui.Selection.addObserver(s) @@ -54,8 +55,9 @@ class spinSect: """ def Activated(self): - import FreeCAD, FreeCADGui, fCmd, pCmd - from math import pi + import FreeCAD + import FreeCADGui + import pCmd FreeCAD.activeDocument().openTransaction("Spin") for beam in FreeCADGui.Selection.getSelection(): @@ -84,7 +86,9 @@ class reverseBeam: """ def Activated(self): - import FreeCAD, FreeCADGui, pCmd + import FreeCAD + import FreeCADGui + import pCmd FreeCAD.activeDocument().openTransaction("Reverse") for objEx in FreeCADGui.Selection.getSelectionEx(): @@ -195,7 +199,10 @@ class levelBeam: """ def Activated(self): - import FreeCAD, FreeCADGui, fCmd, fObservers + import FreeCAD + import FreeCADGui + import fCmd + import fObservers selex = Gui.Selection.getSelectionEx() faces = fCmd.faces(selex) @@ -240,7 +247,10 @@ class alignEdge: """ def Activated(self): - import FreeCAD, FreeCADGui, fCmd, fObservers + import FreeCAD + import FreeCADGui + import fCmd + import fObservers edges = fCmd.edges() if len(edges) >= 2 and len(FreeCADGui.Selection.getSelection()) >= 2: @@ -361,7 +371,8 @@ class adjustFrameAngle: """ def Activated(self): - import FreeCADGui, fObservers + import FreeCADGui + import fObservers FreeCADGui.Selection.clearSelection() s = fObservers.adjustAngleObserver() @@ -385,7 +396,8 @@ class rotJoin: """ def Activated(self): - import FreeCAD, fCmd + import FreeCAD + import fCmd if len(fCmd.beams()) > 1: FreeCAD.activeDocument().openTransaction("rotJoin") diff --git a/CPipe.py b/CPipe.py index 591177e..cdaeaea 100644 --- a/CPipe.py +++ b/CPipe.py @@ -297,7 +297,8 @@ def GetResources(self): class laydown: def Activated(self): - import pCmd, fCmd + import pCmd + import fCmd from Part import Plane refFace = [f for f in fCmd.faces() if type(f.Surface) == Plane][0] @@ -320,7 +321,8 @@ def GetResources(self): class raiseup: def Activated(self): - import pCmd, fCmd + import pCmd + import fCmd from Part import Plane selex = FreeCADGui.Selection.getSelectionEx() @@ -349,7 +351,8 @@ class joinPype: """ """ def Activated(self): - import FreeCAD, FreeCADGui, pForms # pObservers + import FreeCADGui + import pForms # pObservers # s=pObservers.joinObserver() FreeCADGui.Control.showDialog(pForms.joinForm()) # .Selection.addObserver(s) @@ -437,7 +440,8 @@ def GetResources(self): class insertTank: def Activated(self): - import FreeCADGui, pForms + import FreeCADGui + import pForms FreeCADGui.Control.showDialog(pForms.insertTankForm()) @@ -451,7 +455,8 @@ def GetResources(self): class insertRoute: def Activated(self): - import FreeCADGui, pForms + import FreeCADGui + import pForms FreeCADGui.Control.showDialog(pForms.insertRouteForm()) diff --git a/CUtils.py b/CUtils.py index 9eb9f7f..e14b9f3 100644 --- a/CUtils.py +++ b/CUtils.py @@ -19,7 +19,8 @@ class queryModel: def Activated(self): - import FreeCAD, FreeCADGui, uForms + import FreeCADGui + import uForms form = uForms.QueryForm(FreeCADGui.Selection) @@ -65,7 +66,7 @@ def GetResources(self): class rotateWorkPlane: def Activated(self): - import FreeCAD, FreeCADGui, uForms + import uForms form = uForms.rotWPForm() diff --git a/ShpstData.py b/ShpstData.py index 4a3db5b..ad7fac1 100644 --- a/ShpstData.py +++ b/ShpstData.py @@ -226,7 +226,7 @@ #ステンレスL形鋼,,,,,,,,,,,,,,,,, #シリーズ,寸法(mm),,,,,断面積,質量,重心(cm),,断面2次モーメント(cm4),,,断面2次半径,,,断面係数(cm3), -#, A, B, t, r1, r2, (cm2),(kg/m),Cx, Cy, Ix, Iy, 最小Iv,ix, iy, 最小iv,Zx, Zy, +#, A, B, t, r1, r2, (cm2),(kg/m),Cx, Cy, Ix, Iy, 最小Iv,ix, iy, 最小iv,Zx, Zy, angle_sus_equal={ '20x20x3':(20, 20, 3, 4.0,2.0,1.127, 0.88, 0.60,0.60,0.39,0.39,0.16, 0.59,0.59,0.38,0.28,0.28), '25x25x3':(25,25,3,4.0,2.0,1.427,1.12,0.72,0.72,0.80,0.80,0.33,0.75,0.75,0.48,0.45,0.45), @@ -1229,4 +1229,4 @@ '400x400x6':(400,400,6), '400x400x9':(400,400,9), '400x400x12':(400,400,12), -} \ No newline at end of file +} diff --git a/anyShapez.py b/anyShapez.py index 61bc60a..7c905a0 100644 --- a/anyShapez.py +++ b/anyShapez.py @@ -1,4 +1,6 @@ -import FreeCAD, FreeCADGui, Part +import FreeCAD +import FreeCADGui +import Part import fCmd from os.path import * from os import listdir diff --git a/cut_list/cut_list_creation.py b/cut_list/cut_list_creation.py index 3dca7a3..750419c 100644 --- a/cut_list/cut_list_creation.py +++ b/cut_list/cut_list_creation.py @@ -1,7 +1,6 @@ import FreeCAD -import FreeCADGui -from dataclasses import dataclass, asdict +from dataclasses import dataclass from typing import List from . import resultSpreadsheet @@ -99,9 +98,7 @@ def nestCuts(profiles: list, beamLength, cutwidth): sortedStructures = sorted(allStructures, key=lambda x: x.ComputedLength, reverse=True) allCuts = [] - beams = ( - [] - ) # List of Lists to reference what is together in one beam [beamLength,[Cut1,Cut2...]] + beams = [] # List of Lists to reference what is together in one beam [beamLength,[Cut1,Cut2...]] beam = Beam(1, beamLength, beamLength, []) beams.append(beam) @@ -154,9 +151,9 @@ def createSpreadSheetReport(beams, name="Result_Nest_Profile"): # Print the Used Length if a maximum Stock Value is given beamLength = round(beam.length, 2) if beamLength.getValueAs("mm") <= 0.1: - result.printHeader(f"Used {round(beam.lengthUsed(),2)}") + result.printHeader(f"Used {round(beam.lengthUsed(), 2)}") else: - result.printHeader(f"Used {round(beam.lengthUsed(),2)} of {beamLength}") + result.printHeader(f"Used {round(beam.lengthUsed(), 2)} of {beamLength}") result.printColumnLabels() result.printRows(beam.getCutsAsDict()) @@ -181,9 +178,9 @@ def createSpreadSheetReportGrouped(beams, name="Result_Nest_Profile"): # Print the Used Length if a maximum Stock Value is given beamLength = round(beam.length, 2) if beamLength.getValueAs("mm") <= 0.1: - result.printHeader(f"Used {round(beam.lengthUsed(),2)}") + result.printHeader(f"Used {round(beam.lengthUsed(), 2)}") else: - result.printHeader(f"Used {round(beam.lengthUsed(),2)} of {beamLength}") + result.printHeader(f"Used {round(beam.lengthUsed(), 2)} of {beamLength}") result.printColumnLabels() diff --git a/cut_list/cut_list_ui.py b/cut_list/cut_list_ui.py index c937437..da3e10e 100644 --- a/cut_list/cut_list_ui.py +++ b/cut_list/cut_list_ui.py @@ -1,4 +1,5 @@ -import FreeCAD, FreeCADGui, Part +import FreeCAD +import FreeCADGui import os from FreeCAD import Units diff --git a/cut_list/resultSpreadsheet.py b/cut_list/resultSpreadsheet.py index facbe6d..4fb5e5f 100644 --- a/cut_list/resultSpreadsheet.py +++ b/cut_list/resultSpreadsheet.py @@ -2,7 +2,6 @@ # https://github.com/furti/FreeCAD-Reporting/blob/master/report.py import FreeCAD -import FreeCADGui import string @@ -34,9 +33,7 @@ def nextColumnName(actualColumnName): class ResultSpreadsheet(object): - def __init__(self, spreadsheet, columnLabels): - self.spreadsheet = spreadsheet self.lineNumber = 1 self.maxColumn = None @@ -160,7 +157,6 @@ def clearUnusedCells(self, column, line): self.clearColumn(COLUMN_NAMES[columnIndexToDelete], line) def clearLine(self, lineNumberToDelete): - column = None while column is None or column != self.maxColumn: @@ -170,7 +166,6 @@ def clearLine(self, lineNumberToDelete): self.spreadsheet.clear(cellName) def clearColumn(self, columnToDelete, maxLineNumber): - for lineNumber in range(1, maxLineNumber): cellName = f"{columnToDelete}{lineNumber + 1}" diff --git a/dodoDialogs.py b/dodoDialogs.py index f741f70..497792c 100644 --- a/dodoDialogs.py +++ b/dodoDialogs.py @@ -1,7 +1,6 @@ import csv from os import listdir from os.path import abspath, dirname, join -from sys import platform import FreeCAD import FreeCADGui diff --git a/fCmd.py b/fCmd.py index d69d54e..65bbb23 100644 --- a/fCmd.py +++ b/fCmd.py @@ -5,7 +5,8 @@ __url__ = "github.com/oddtopus/dodo" __license__ = "LGPL 3" -import FreeCAD, FreeCADGui +import FreeCAD +import FreeCADGui import DraftGeomUtils as dgu from DraftVecUtils import rounded diff --git a/fFeatures.py b/fFeatures.py index d295772..0f72563 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -6,7 +6,7 @@ __license__ = "LGPL 3" import csv -from math import degrees, frexp, sqrt, cos, radians, sin, tan +from math import degrees, sqrt, cos, radians, sin, tan from os import listdir from os.path import abspath, dirname, join @@ -49,10 +49,32 @@ def newProfile(prop): if prop["stype"] == "C": profile = makeCircle(float(prop["H"])) else: - if int(FreeCAD.Version()[0]) >=1: - profile=makeProfile([0,"SECTION",prop["SSize"] + "-000",prop["stype"],float(prop["W"]),float(prop["H"]),float(prop["ta"]),float(prop["tf"]),]) + if int(FreeCAD.Version()[0]) >= 1: + profile = makeProfile( + [ + 0, + "SECTION", + prop["SSize"] + "-000", + prop["stype"], + float(prop["W"]), + float(prop["H"]), + float(prop["ta"]), + float(prop["tf"]), + ] + ) else: - profile=ArchProfile.makeProfile([0,"SECTION",prop["SSize"] + "-000",prop["stype"],float(prop["W"]),float(prop["H"]),float(prop["ta"]),float(prop["tf"]),]) + profile = ArchProfile.makeProfile( + [ + 0, + "SECTION", + prop["SSize"] + "-000", + prop["stype"], + float(prop["W"]), + float(prop["H"]), + float(prop["ta"]), + float(prop["tf"]), + ] + ) return profile @@ -67,10 +89,10 @@ def indexEdge(edge, listedges): def findFB(beamName=None, baseName=None): - ''' + """ Search FrameBranch object inside the Active document if beam name or base object name parameters are given, it will return the frameBranch related to beam or base object (skectch, wire ,etc) - ''' + """ Branches = [ o.Name for o in FreeCAD.ActiveDocument.Objects @@ -204,16 +226,10 @@ def __init__(self, winTitle="FrameLine Manager", icon="frameline.svg"): def setCurrentFL(self, FLName=None): if self.combo.currentText() not in ["", ""]: FreeCAD.__activeFrameLine__ = self.combo.currentText() - self.current = FreeCAD.ActiveDocument.getObjectsByLabel( - self.combo.currentText() - )[0] - FreeCAD.Console.PrintMessage( - "current FrameLine = " + self.current.Label + "\n" - ) + self.current = FreeCAD.ActiveDocument.getObjectsByLabel(self.combo.currentText())[0] + FreeCAD.Console.PrintMessage("current FrameLine = " + self.current.Label + "\n") if self.current.Profile: - FreeCAD.Console.PrintMessage( - "Profile: %s\n" % self.current.Profile.Label - ) + FreeCAD.Console.PrintMessage("Profile: %s\n" % self.current.Profile.Label) else: FreeCAD.Console.PrintMessage("Profile not defined\n") if self.current.Base: @@ -227,9 +243,7 @@ def setCurrentFL(self, FLName=None): def updateSections(self): self.sectList.clear() - result = FreeCAD.ActiveDocument.findObjects( - "App::DocumentObjectGroup", "Profiles_set" - ) + result = FreeCAD.ActiveDocument.findObjects("App::DocumentObjectGroup", "Profiles_set") if result: self.sectList.addItems( [ @@ -238,10 +252,7 @@ def updateSections(self): if hasattr(o, "Shape") and ( (type(o.Shape) == Part.Wire and o.Shape.isClosed()) - or ( - type(o.Shape) == Part.Face - and type(o.Shape.Surface) == Part.Plane - ) + or (type(o.Shape) == Part.Face and type(o.Shape.Surface) == Part.Plane) ) ] ) @@ -255,9 +266,7 @@ def updateSections(self): def setCurrent(self, flname): if flname != "": self.current = FreeCAD.ActiveDocument.getObjectsByLabel(flname)[0] - FreeCAD.Console.PrintMessage( - "current FrameLine = " + self.current.Label + "\n" - ) + FreeCAD.Console.PrintMessage("current FrameLine = " + self.current.Label + "\n") else: self.current = None FreeCAD.Console.PrintMessage("current FrameLine = None\n") @@ -315,18 +324,13 @@ def getPath(self): ]: self.current.Base = base FreeCAD.Console.PrintWarning( - self.current.Label - + " base set to " - + base.TypeId.split("::")[1] - + ".\n" + self.current.Label + " base set to " + base.TypeId.split("::")[1] + ".\n" ) else: FreeCAD.Console.PrintError("Not a Wire nor Sketch\n") else: self.current.Base = None - FreeCAD.Console.PrintWarning( - self.current.Label + " base set to None.\n" - ) + FreeCAD.Console.PrintWarning(self.current.Label + " base set to None.\n") def getProfile(self): if self.current: @@ -337,9 +341,7 @@ def getProfile(self): self.sectList.selectedItems()[0].text() )[0] if prof.Shape.ShapeType == "Wire" and self.cb2.isChecked(): - prof.Placement.move( - FreeCAD.Vector(0, 0, 0) - prof.Shape.CenterOfMass - ) + prof.Placement.move(FreeCAD.Vector(0, 0, 0) - prof.Shape.CenterOfMass) prof.Placement.Rotation = FreeCAD.Base.Rotation() self.current.Profile = prof @@ -383,9 +385,7 @@ def __init__(self, winTitle="Insert section", icon="dodo.svg"): self.fileList = listdir(join(dirname(abspath(__file__)), "tablez")) self.fillSizes() self.PRatingsList = [ - s.lstrip("Section_").rstrip(".csv") - for s in self.fileList - if s.startswith("Section") + s.lstrip("Section_").rstrip(".csv") for s in self.fileList if s.startswith("Section") ] self.secondCol = QWidget() self.secondCol.setLayout(QVBoxLayout()) @@ -422,15 +422,11 @@ def changeRating(self, item): self.fillSizes() def insert(self): # insert the section - result = FreeCAD.ActiveDocument.findObjects( - "App::DocumentObjectGroup", "Profiles_set" - ) + result = FreeCAD.ActiveDocument.findObjects("App::DocumentObjectGroup", "Profiles_set") if result: group = result[0] else: - group = FreeCAD.activeDocument().addObject( - "App::DocumentObjectGroup", "Profiles_set" - ) + group = FreeCAD.activeDocument().addObject("App::DocumentObjectGroup", "Profiles_set") if self.sizeList.selectedItems(): prop = self.sectDictList[self.sizeList.currentRow()] if prop["stype"] == "C": @@ -460,7 +456,9 @@ class frameBranchForm(dodoDialogs.protoTypeDialog): def __init__(self): super(frameBranchForm, self).__init__("fbranch.ui") - self.sectDictList = [] # list (sizes) of properties (dictionaries) of the current type of section + self.sectDictList = ( + [] + ) # list (sizes) of properties (dictionaries) of the current type of section self.form.editAngle.setValidator(QDoubleValidator()) self.form.editAngle.editingFinished.connect(self.changeAngle) self.form.editHead.setValidator(QDoubleValidator()) @@ -472,6 +470,7 @@ def __init__(self): files = [name for name in tablez if name.startswith("Section")] # RatingsList = [s.lstrip("Section_").rstrip(".csv") for s in files] import ArchProfile + buffer = list() self.ArchList = ArchProfile.readPresets() for rating in self.ArchList: @@ -500,9 +499,9 @@ def __init__(self): self.actionX.triggered.connect(self.trim) # reconnect to trim() def getPropsfromlistSizes(self): - ''' + """ Check profileslist and return full properties selected on the widget list - ''' + """ for value in self.ArchList: if self.form.listSizes.currentItem().text() in value[2]: return value @@ -514,7 +513,7 @@ def makeSingle(self): self.form.listSizes.currentItem().text() )[0] else: - prop=self.getPropsfromlistSizes() + prop = self.getPropsfromlistSizes() # prop = self.sectDictList[self.form.listSizes.currentRow()] FreeCAD.Console.PrintMessage(prop) profile = makeProfile(prop) @@ -557,81 +556,104 @@ def makeSingle(self): def cutMiters(self): import ArchCutPlane + volumes = list() - totalvertexes=0 - sel=FreeCADGui.Selection.getSelection() - seldoc=FreeCAD.ActiveDocument - miterplanesfaces=self.getMiterPlanesFaces(seldoc) - framebeams=self.getBeamsFromStructureNames(sel) + totalvertexes = 0 + sel = FreeCADGui.Selection.getSelection() + seldoc = FreeCAD.ActiveDocument + miterplanesfaces = self.getMiterPlanesFaces(seldoc) + framebeams = self.getBeamsFromStructureNames(sel) for beam in framebeams: for miterplaneface in miterplanesfaces: - matchpoints=False - sketcher=beam.AttachmentSupport[0][0] - edgename=beam.AttachmentSupport[0][1][0] - index=int(edgename[4:])-1 - if self.roundVectors(miterplaneface.CenterOfMass,4) == self.roundVectors(sketcher.Shape.Edges[index].Vertexes[0].Point,4): - matchpoints=True - totalvertexes=totalvertexes+1 - elif self.roundVectors(miterplaneface.CenterOfMass,4) == self.roundVectors(sketcher.Shape.Edges[index].Vertexes[1].Point,4): - matchpoints=True - totalvertexes=totalvertexes+1 + matchpoints = False + sketcher = beam.AttachmentSupport[0][0] + edgename = beam.AttachmentSupport[0][1][0] + index = int(edgename[4:]) - 1 + if self.roundVectors(miterplaneface.CenterOfMass, 4) == self.roundVectors( + sketcher.Shape.Edges[index].Vertexes[0].Point, 4 + ): + matchpoints = True + totalvertexes = totalvertexes + 1 + elif self.roundVectors(miterplaneface.CenterOfMass, 4) == self.roundVectors( + sketcher.Shape.Edges[index].Vertexes[1].Point, 4 + ): + matchpoints = True + totalvertexes = totalvertexes + 1 if matchpoints: # FreeCAD.Console.PrintMessage('Plano: '+str()+'\r') - ArchCutPlane.cutComponentwithPlane(beam,miterplaneface, side=0) + ArchCutPlane.cutComponentwithPlane(beam, miterplaneface, side=0) FreeCAD.ActiveDocument.recompute() volumes.append(beam.Shape.Volume) self.removeCutVolume(beam) - ArchCutPlane.cutComponentwithPlane(beam,miterplaneface, side=1) + ArchCutPlane.cutComponentwithPlane(beam, miterplaneface, side=1) FreeCAD.ActiveDocument.recompute() volumes.append(beam.Shape.Volume) # volumes.sort() - if volumes[0]< volumes[1]: - FreeCAD.Console.PrintMessage(str(beam.Name)+' volume1: '+str(volumes[0])+'< volume2: '+str(volumes[1])+'\r') + if volumes[0] < volumes[1]: + FreeCAD.Console.PrintMessage( + str(beam.Name) + + " volume1: " + + str(volumes[0]) + + "< volume2: " + + str(volumes[1]) + + "\r" + ) FreeCAD.ActiveDocument.recompute() - elif volumes[0]> volumes[1]: + elif volumes[0] > volumes[1]: self.removeCutVolume(beam) - ArchCutPlane.cutComponentwithPlane(beam,miterplaneface, side=0) - FreeCAD.Console.PrintMessage(str(beam.Name)+' volume1: '+str(volumes[0])+'> volume2: '+str(volumes[1])+'\r') + ArchCutPlane.cutComponentwithPlane(beam, miterplaneface, side=0) + FreeCAD.Console.PrintMessage( + str(beam.Name) + + " volume1: " + + str(volumes[0]) + + "> volume2: " + + str(volumes[1]) + + "\r" + ) FreeCAD.ActiveDocument.recompute() volumes.clear() - FreeCAD.Console.PrintMessage('totalvertexes: '+str(totalvertexes)) + FreeCAD.Console.PrintMessage("totalvertexes: " + str(totalvertexes)) - def removeCutVolume(self,beam): - cutvolumeitems= list() + def removeCutVolume(self, beam): + cutvolumeitems = list() cutvolumeid = list() for obj in beam.OutList: - if obj.TypeId=='Part::Feature' and obj.Label.startswith('CutVolume'): + if obj.TypeId == "Part::Feature" and obj.Label.startswith("CutVolume"): cutvolumeid.append(obj.ID) cutvolumeitems.append(obj) cutvolumeid.sort(reverse=True) - lastobj=cutvolumeid[0] + lastobj = cutvolumeid[0] for obj in beam.OutList: - if obj.TypeId=='Part::Feature' and obj.Label.startswith('CutVolume') and obj.ID == lastobj: + if ( + obj.TypeId == "Part::Feature" + and obj.Label.startswith("CutVolume") + and obj.ID == lastobj + ): FreeCAD.ActiveDocument.removeObject(obj.Label) FreeCAD.ActiveDocument.recompute() - def getBeamsFromStructureNames(self,sel): - ''' + def getBeamsFromStructureNames(self, sel): + """ Return a list with beam Structures on a frameBranch object type - ''' + """ framebeams = list() - if hasattr(sel[0],"FType"): + if hasattr(sel[0], "FType"): for beamname in sel[0].Beams: - beam=FreeCAD.ActiveDocument.getObject(beamname) + beam = FreeCAD.ActiveDocument.getObject(beamname) framebeams.append(beam) return framebeams - def getMiterPlanesFaces(self,seldoc): - ''' + def getMiterPlanesFaces(self, seldoc): + """ Return a list with plane named 'cutplane' from the whole seldoc - ''' + """ miterplanes = list() for object in seldoc.Objects: - if object.Name.startswith('cutplane'): + if object.Name.startswith("cutplane"): miterplanes.append(object.Shape.Faces[0]) return miterplanes - def roundVectors(self,vxlist, num): + def roundVectors(self, vxlist, num): l = [v for v in vxlist] return FreeCAD.Vector(round(l[0], num), round(l[1], num), round(l[2], num)) @@ -639,106 +661,143 @@ def generateBisectPlanes(self): """Get intersection between lines, generate a plane between lines & do a boolean diferente""" sel = FreeCADGui.Selection.getSelection() from DraftGeomUtils import findIntersection + # FreeCAD.Console.PrintMessage('posicion de boceto:'+ str(sel[0].Placement.Rotation)+'\r\n') - i=0 - rep=0 + i = 0 + rep = 0 reachedlines = [] interVertex = [] - if sel[0].FType == 'FrameBranch': - for element in sel[0].Base.Geometry: - # FreeCAD.Console.PrintMessage('Segmento '+str(element)+'\r\n') - for subelement in sel[0].Base.Geometry: - # Avoid process the geometric element that match StartPoint and EndPoint and also just have process elements with a common point - if (element.EndPoint != subelement.EndPoint or - element.StartPoint != subelement.StartPoint or - (element.EndPoint != subelement.EndPoint and - element.StartPoint != subelement.StartPoint) and - (element.EndPoint != subelement.StartPoint and - element.StartPoint != subelement.EndPoint)): - #WARN:intersectionCLines method forces to detect infinite intersections that is not required - # interVertex=fCmd.intersectionCLines(element.toShape().Edges[0],subelement.toShape().Edges[0]) - interVertex=findIntersection(element.toShape().Edges[0],subelement.toShape().Edges[0],infinite1=False, infinite2=False) - if interVertex: - roundelementStart=self.roundVectors(element.StartPoint,2) - roundelementEnd=self.roundVectors(element.EndPoint,2) - roundsubelementStart=self.roundVectors(subelement.StartPoint,2) - roundsubelementEnd=self.roundVectors(subelement.EndPoint,2) - roundinterVertex=self.roundVectors(interVertex[0],2) - if [element.Tag,subelement.Tag] not in reachedlines: - content=True - reachedlines.append([element.Tag,subelement.Tag]) - else: - content=False - if [subelement.Tag,element.Tag] not in reachedlines: - contentsub=True - reachedlines.append([subelement.Tag,element.Tag]) - else: - contentsub=False - if (content) or (contentsub): - # FreeCAD.Console.PrintMessage('Punto de interseccion: '+str(interVertex[0])+'\r\n') - # Store edge pair that intersect - FreeCAD.Console.PrintMessage('Reachedlines: {0} and {1}'.format(reachedlines[rep][0],reachedlines[rep][1])+'\r\n') - rep=rep+1 - # FIXME: intersectCC method does not return line intersection; findIntersection method does it right - # interpoint=element.intersectCC(subelement)[0] - - # FreeCAD.Console.PrintMessage('Segmento '+str(element)+' intersecta con segmento '+str(subelement)+' aqui:'+ str(interpoint)+'\r\n') - # FreeCAD.Console.PrintMessage(str(type(interpoint))) - # INFO:Section aided to get bisect vector on each intersection - if roundelementStart== roundinterVertex: - resultv1 = FreeCAD.Vector(element.EndPoint-element.StartPoint) - elif roundelementEnd == roundinterVertex: - resultv1 = FreeCAD.Vector(element.StartPoint-element.EndPoint) - if roundsubelementStart == roundinterVertex: - resultv2 = FreeCAD.Vector(subelement.EndPoint-subelement.StartPoint) - elif roundsubelementEnd == roundinterVertex: - resultv2 = FreeCAD.Vector(subelement.StartPoint-subelement.EndPoint) - bisectvector=fCmd.bisect(resultv1,resultv2) - plane=FreeCAD.activeDocument().addObject("Part::Plane","cutplane") - import numpy - from math import pi - plane.AttachmentSupport = sel[0].Base.AttachmentSupport - plane.MapMode = 'FlatFace' - self.rotvector =(interVertex[0])-(FreeCAD.Vector(0,plane.Length/2,-plane.Length/2)) - # INFO: Section aided to apply random color to each plane - randomcolorarray=numpy.random.choice(range(256),size=3) - plane.ViewObject.ShapeAppearance = FreeCAD.Material(DiffuseColor= tuple(map(int,randomcolorarray))) - plane.recompute() - # self.CenterOfMass = plane.Shape.CenterOfMass - # INFO:Section aided to get the correct plane orientation on each intersection - self.placementrotplan = FreeCAD.Placement(self.rotvector,FreeCAD.Rotation(FreeCAD.Vector(0,1,0),90)) - plane.AttachmentOffset = self.placementrotplan - # FreeCAD.Console.PrintMessage('Antes Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') - # crossvector=resultv1.cross(resultv2).normalize() - # FreeCAD.Console.PrintMessage('Vector cruz: '+str(crossvector)+'\r\n') - # FreeCAD.Console.PrintMessage('Vector normal de plano: '+str(self.roundVectors(plane.Shape.normalAt(0,0),2))+'\r\n') - self.placementrelative = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(plane.Shape.normalAt(0,0),bisectvector),interVertex[0]).multiply(self.placementrotplan) - # plane.AttachmentOffset = self.placementrelative - # FreeCAD.Console.PrintMessage('Despues Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') - if self.roundVectors(plane.Shape.normalAt(0,0),0) == FreeCAD.Vector(1.0, 0.0, 0.0): - rotateplane=90 - else: - rotateplane=0 - self.placementfinal = FreeCAD.Placement(FreeCAD.Vector(0,0,0),FreeCAD.Rotation(FreeCAD.Vector(0,0,1),rotateplane),interVertex[0]).multiply(self.placementrelative) - plane.AttachmentOffset = self.placementfinal - # FreeCAD.Console.PrintMessage(str(plane.Name)) - # sel[0].cutplanes.append(plane.Name) - # TODO::Made method definition to change plane dots colors - # if i==0: - # FreeCADGui.ActiveDocument.myplane.PointSize = 10 - # FreeCADGui.ActiveDocument.myplane.PointColor = 100,50,20 - # elif i>=1: - # obj=FreeCADGui.ActiveDocument.getObject('myplane00'+str(i)) - # obj.PointSize = 10 - # obj.PointColor = 100,50,20 - i=i+1 + if sel[0].FType == "FrameBranch": + for element in sel[0].Base.Geometry: + # FreeCAD.Console.PrintMessage('Segmento '+str(element)+'\r\n') + for subelement in sel[0].Base.Geometry: + # Avoid process the geometric element that match StartPoint and EndPoint and also just have process elements with a common point + if ( + element.EndPoint != subelement.EndPoint + or element.StartPoint != subelement.StartPoint + or ( + element.EndPoint != subelement.EndPoint + and element.StartPoint != subelement.StartPoint + ) + and ( + element.EndPoint != subelement.StartPoint + and element.StartPoint != subelement.EndPoint + ) + ): + # WARN:intersectionCLines method forces to detect infinite intersections that is not required + # interVertex=fCmd.intersectionCLines(element.toShape().Edges[0],subelement.toShape().Edges[0]) + interVertex = findIntersection( + element.toShape().Edges[0], + subelement.toShape().Edges[0], + infinite1=False, + infinite2=False, + ) + if interVertex: + roundelementStart = self.roundVectors(element.StartPoint, 2) + roundelementEnd = self.roundVectors(element.EndPoint, 2) + roundsubelementStart = self.roundVectors(subelement.StartPoint, 2) + roundsubelementEnd = self.roundVectors(subelement.EndPoint, 2) + roundinterVertex = self.roundVectors(interVertex[0], 2) + if [element.Tag, subelement.Tag] not in reachedlines: + content = True + reachedlines.append([element.Tag, subelement.Tag]) + else: + content = False + if [subelement.Tag, element.Tag] not in reachedlines: + contentsub = True + reachedlines.append([subelement.Tag, element.Tag]) + else: + contentsub = False + if (content) or (contentsub): + # FreeCAD.Console.PrintMessage('Punto de interseccion: '+str(interVertex[0])+'\r\n') + # Store edge pair that intersect + FreeCAD.Console.PrintMessage( + "Reachedlines: {0} and {1}".format( + reachedlines[rep][0], reachedlines[rep][1] + ) + + "\r\n" + ) + rep = rep + 1 + # FIXME: intersectCC method does not return line intersection; findIntersection method does it right + # interpoint=element.intersectCC(subelement)[0] + + # FreeCAD.Console.PrintMessage('Segmento '+str(element)+' intersecta con segmento '+str(subelement)+' aqui:'+ str(interpoint)+'\r\n') + # FreeCAD.Console.PrintMessage(str(type(interpoint))) + # INFO:Section aided to get bisect vector on each intersection + if roundelementStart == roundinterVertex: + resultv1 = FreeCAD.Vector(element.EndPoint - element.StartPoint) + elif roundelementEnd == roundinterVertex: + resultv1 = FreeCAD.Vector(element.StartPoint - element.EndPoint) + if roundsubelementStart == roundinterVertex: + resultv2 = FreeCAD.Vector( + subelement.EndPoint - subelement.StartPoint + ) + elif roundsubelementEnd == roundinterVertex: + resultv2 = FreeCAD.Vector( + subelement.StartPoint - subelement.EndPoint + ) + bisectvector = fCmd.bisect(resultv1, resultv2) + plane = FreeCAD.activeDocument().addObject( + "Part::Plane", "cutplane" + ) + import numpy + + plane.AttachmentSupport = sel[0].Base.AttachmentSupport + plane.MapMode = "FlatFace" + self.rotvector = (interVertex[0]) - ( + FreeCAD.Vector(0, plane.Length / 2, -plane.Length / 2) + ) + # INFO: Section aided to apply random color to each plane + randomcolorarray = numpy.random.choice(range(256), size=3) + plane.ViewObject.ShapeAppearance = FreeCAD.Material( + DiffuseColor=tuple(map(int, randomcolorarray)) + ) + plane.recompute() + # self.CenterOfMass = plane.Shape.CenterOfMass + # INFO:Section aided to get the correct plane orientation on each intersection + self.placementrotplan = FreeCAD.Placement( + self.rotvector, FreeCAD.Rotation(FreeCAD.Vector(0, 1, 0), 90) + ) + plane.AttachmentOffset = self.placementrotplan + # FreeCAD.Console.PrintMessage('Antes Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') + # crossvector=resultv1.cross(resultv2).normalize() + # FreeCAD.Console.PrintMessage('Vector cruz: '+str(crossvector)+'\r\n') + # FreeCAD.Console.PrintMessage('Vector normal de plano: '+str(self.roundVectors(plane.Shape.normalAt(0,0),2))+'\r\n') + self.placementrelative = FreeCAD.Placement( + FreeCAD.Vector(0, 0, 0), + FreeCAD.Rotation(plane.Shape.normalAt(0, 0), bisectvector), + interVertex[0], + ).multiply(self.placementrotplan) + # plane.AttachmentOffset = self.placementrelative + # FreeCAD.Console.PrintMessage('Despues Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') + if self.roundVectors( + plane.Shape.normalAt(0, 0), 0 + ) == FreeCAD.Vector(1.0, 0.0, 0.0): + rotateplane = 90 + else: + rotateplane = 0 + self.placementfinal = FreeCAD.Placement( + FreeCAD.Vector(0, 0, 0), + FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), rotateplane), + interVertex[0], + ).multiply(self.placementrelative) + plane.AttachmentOffset = self.placementfinal + # FreeCAD.Console.PrintMessage(str(plane.Name)) + # sel[0].cutplanes.append(plane.Name) + # TODO::Made method definition to change plane dots colors + # if i==0: + # FreeCADGui.ActiveDocument.myplane.PointSize = 10 + # FreeCADGui.ActiveDocument.myplane.PointColor = 100,50,20 + # elif i>=1: + # obj=FreeCADGui.ActiveDocument.getObject('myplane00'+str(i)) + # obj.PointSize = 10 + # obj.PointColor = 100,50,20 + i = i + 1 def accept(self): if FreeCAD.ActiveDocument: # GET BASE - bases = [ - b for b in FreeCADGui.Selection.getSelection() if hasattr(b, "Shape") - ] + bases = [b for b in FreeCADGui.Selection.getSelection() if hasattr(b, "Shape")] if bases and self.form.listSizes.selectedItems(): FreeCAD.activeDocument().openTransaction("Insert FrameBranch") if self.SType == "": @@ -747,14 +806,14 @@ def accept(self): )[0] else: # prop = self.sectDictList[self.form.listSizes.currentRow()] - prop=self.getPropsfromlistSizes() + prop = self.getPropsfromlistSizes() profile = makeProfile(prop) # profile = newProfile(prop) # MAKE FRAMEBRANCH if self.form.editName.text(): name = self.form.editName.text() else: - name = translate("makeframenbranch","Structure") # Travatura is Structure? + name = translate("makeframenbranch", "Structure") # Travatura is Structure? a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", name) FrameBranch(a, bases[0], profile) ViewProviderFrameBranch(a.ViewObject) @@ -784,11 +843,7 @@ def mouseActionB1(self, CtrlAltShift): if i: labText = i["Object"] obj = FreeCAD.ActiveDocument.getObject(i["Object"]) - if ( - hasattr(obj, "tailOffset") - and hasattr(obj, "headOffset") - and hasattr(obj, "spin") - ): + if hasattr(obj, "tailOffset") and hasattr(obj, "headOffset") and hasattr(obj, "spin"): self.form.editTail.setText(str(obj.tailOffset)) self.form.editHead.setText(str(obj.headOffset)) self.form.editAngle.setText(str(obj.spin)) @@ -797,7 +852,9 @@ def mouseActionB1(self, CtrlAltShift): labText += ": part of " + fb.Label if self.labTail: self.labTail.removeLabel() - self.labTail = label3D(pl=obj.Placement, text=translate("mouseActionB1","____TAIL")) + self.labTail = label3D( + pl=obj.Placement, text=translate("mouseActionB1", "____TAIL") + ) else: if self.labTail: self.labTail.removeLabel() @@ -819,9 +876,9 @@ def mouseActionB1(self, CtrlAltShift): self.form.lab1.setText("") def fillSizes(self): - ''' - Fill standart beam sizes into a framebeams widget - ''' + """ + Fill standard beam sizes into a framebeams widget + """ self.SType = self.form.comboRatings.currentText() self.form.listSizes.clear() if self.SType == "": @@ -921,7 +978,7 @@ def changeProfile(self): self.form.listSizes.currentItem().text() )[0] else: - prop=self.getPropsfromlistSizes() + prop = self.getPropsfromlistSizes() # prop = self.sectDictList[self.form.listSizes.currentRow()] # profile = newProfile(prop) profile = makeProfile(prop) @@ -990,7 +1047,9 @@ def trim(self): for b in fCmd.beams(): if hasattr(b, "tailOffset") and hasattr(b, "headOffset"): if int(FreeCAD.Version()[0]) >= 1: - edge = b.AttachmentSupport[0][0].Shape.getElement(b.AttachmentSupport[0][1][0]) + edge = b.AttachmentSupport[0][0].Shape.getElement( + b.AttachmentSupport[0][1][0] + ) else: edge = b.Support[0][0].Shape.getElement(b.Support[0][1][0]) ax = edge.tangentAt(0).normalize() # fCmd.beamAx(b).normalize() @@ -1057,10 +1116,10 @@ def __init__(self, obj, section="IPE200", lab=None): "Group", "FrameLine", QT_TRANSLATE_NOOP("App::PropertyString", "The group."), - ).Group = obj.Label + "_pieces" - group = FreeCAD.activeDocument().addObject( - "App::DocumentObjectGroup", obj.Group + ).Group = ( + obj.Label + "_pieces" ) + group = FreeCAD.activeDocument().addObject("App::DocumentObjectGroup", obj.Group) group.addObject(obj) FreeCAD.Console.PrintWarning("Created group " + obj.Group + "\n") obj.addProperty( @@ -1081,9 +1140,7 @@ def onChanged(self, fp, prop): fp.InList[0].Label = fp.Label + "_pieces" fp.Group = fp.Label + "_pieces" if prop == "Base" and fp.Base: - FreeCAD.Console.PrintWarning( - fp.Label + " Base has changed to " + fp.Base.Label + "\n" - ) + FreeCAD.Console.PrintWarning(fp.Label + " Base has changed to " + fp.Base.Label + "\n") if prop == "Profile" and fp.Profile: fp.Profile.ViewObject.Visibility = False FreeCAD.Console.PrintWarning( @@ -1166,17 +1223,13 @@ def execute(self, obj): edge = obj.Base.Shape.Edges[i] beam = FreeCAD.ActiveDocument.getObject(obj.Beams[i]) beam.Height = ( - float(obj.Base.Shape.Edges[i].Length) - + beam.tailOffset - + beam.headOffset + float(obj.Base.Shape.Edges[i].Length) + beam.tailOffset + beam.headOffset ) offset = FreeCAD.Vector(0, 0, beam.tailOffset).negative() spin = FreeCAD.Rotation() beam.AttachmentOffset = FreeCAD.Placement(offset, spin) angle = degrees(fCmd.beamAx(beam, X).getAngle(n)) - beam.AttachmentOffset.Rotation = FreeCAD.Rotation( - Z, angle + beam.spin - ) + beam.AttachmentOffset.Rotation = FreeCAD.Rotation(Z, angle + beam.spin) def redraw(self, obj): # clear all @@ -1258,9 +1311,7 @@ def loads(self, state): return None def claimChildren(self): - children = [ - FreeCAD.ActiveDocument.getObject(name) for name in self.Object.Beams - ] + children = [FreeCAD.ActiveDocument.getObject(name) for name in self.Object.Beams] return children def onDelete(self, feature, subelements): # subelements is a tuple of strings @@ -1273,7 +1324,9 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings from FreeCAD import Vector -def doProfile(typeS="RH", label="Square", dims=[50, 100, 5]): # rearrange args in a better mnemonic way +def doProfile( + typeS="RH", label="Square", dims=[50, 100, 5] +): # rearrange args in a better mnemonic way "doProfile(typeS, label, dims)" if typeS in ["RH", "R", "H", "U", "L", "T", "Z", "omega", "circle"]: profile = [0, "SECTION", label, typeS] + dims # for py2.6 versions @@ -1285,14 +1338,14 @@ def doProfile(typeS="RH", label="Square", dims=[50, 100, 5]): # rearrange args _ProfileR(obj, profile) elif profile[3] == "U": # _ProfileU(obj, profile) - _ProfileChannel(obj,profile) + _ProfileChannel(obj, profile) elif profile[3] == "T": _ProfileT(obj, profile) elif profile[3] == "H": _ProfileH(obj, profile) elif profile[3] == "L": # _ProfileL(obj, profile) - _ProfileAngle(obj,profile) + _ProfileAngle(obj, profile) elif profile[3] == "Z": _ProfileZ(obj, profile) elif profile[3] == "omega": @@ -1347,67 +1400,67 @@ def pointsL(H, W, t1, t2): def pointsLWithRound(A, B, t, r1, r2): - x1=r2*(1-1/sqrt(2)) - x2=r2-x1 - y1=r1*(1-1/sqrt(2)) - y2=r1-y1 - y3=A-(r2+r1+t) - x=t-r2 - p1=Vector(0,0,0) - p2=Vector(0,0,A) - p3=Vector(x,0,A) - p4=Vector(t-x1,0,A-x1) - p5=Vector(t,0,A-r2) - p6=Vector(t,0,A-(r2+y3)) - p7=Vector(t+y1,0,t+y1) - p8=Vector(t+r1,0,t) - p9=Vector(B-r2,0,t) - p10=Vector(B-x1,0,t-x1) - p11=Vector(B,0,t-r2) - p12=Vector(B,0,0) + x1 = r2 * (1 - 1 / sqrt(2)) + x2 = r2 - x1 + y1 = r1 * (1 - 1 / sqrt(2)) + y2 = r1 - y1 + y3 = A - (r2 + r1 + t) + x = t - r2 + p1 = Vector(0, 0, 0) + p2 = Vector(0, 0, A) + p3 = Vector(x, 0, A) + p4 = Vector(t - x1, 0, A - x1) + p5 = Vector(t, 0, A - r2) + p6 = Vector(t, 0, A - (r2 + y3)) + p7 = Vector(t + y1, 0, t + y1) + p8 = Vector(t + r1, 0, t) + p9 = Vector(B - r2, 0, t) + p10 = Vector(B - x1, 0, t - x1) + p11 = Vector(B, 0, t - r2) + p12 = Vector(B, 0, 0) return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p1] def pointsChannelWithRound(H, B, t1, t2, r1, r2, Cy, s0): - s5=radians(s0) - s45=radians(45) - y1=r2*cos(s45) - y2=r2*cos(s5) - y3=r1*cos(s5) - x1=r2*(1-cos(s45)) - x2=r2*sin(s5) - x30=r2-x2 - x3=r1*sin(s5) - x4=r1*cos(s45) - x5=r1-x4 - x40=r1+x3 - x6=B-(x30+x40+t1) - y6=x6*tan(s5) - x7=Cy-(t1+x40) - x8=x6-x7 - y7=x8*tan(s5) - y8=t2-y7 - y4=y8-y2 - y10=y4+y2+y6 - y11=y4+y2+y6+x5 - y12=y4+y2+y6+x5+x4 - p1=Vector(0,0,0) - p2=Vector(0,0,H) - p3=Vector(B,0,H) - p4=Vector(B,0,H-y4) - p5=Vector(B-x1,0,H-(y4+y1)) - p6=Vector(B-x30,0,H-(y4+y2)) - p7=Vector(t1+x40,0,H-y10) - p8=Vector(t1+x5,0,H-y11) - p9=Vector(t1,0,H-y12) - p10=Vector(t1,0,y12) - p11=Vector(t1+x5,0,y11) - p12=Vector(t1+x40,0,y10) - p13=Vector(B-x30,0,y4+y2) - p14=Vector(B-x1,0,y4+y1) - p15=Vector(B,0,y4) - p16=Vector(B,0,0) - return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p1 ] + s5 = radians(s0) + s45 = radians(45) + y1 = r2 * cos(s45) + y2 = r2 * cos(s5) + y3 = r1 * cos(s5) + x1 = r2 * (1 - cos(s45)) + x2 = r2 * sin(s5) + x30 = r2 - x2 + x3 = r1 * sin(s5) + x4 = r1 * cos(s45) + x5 = r1 - x4 + x40 = r1 + x3 + x6 = B - (x30 + x40 + t1) + y6 = x6 * tan(s5) + x7 = Cy - (t1 + x40) + x8 = x6 - x7 + y7 = x8 * tan(s5) + y8 = t2 - y7 + y4 = y8 - y2 + y10 = y4 + y2 + y6 + y11 = y4 + y2 + y6 + x5 + y12 = y4 + y2 + y6 + x5 + x4 + p1 = Vector(0, 0, 0) + p2 = Vector(0, 0, H) + p3 = Vector(B, 0, H) + p4 = Vector(B, 0, H - y4) + p5 = Vector(B - x1, 0, H - (y4 + y1)) + p6 = Vector(B - x30, 0, H - (y4 + y2)) + p7 = Vector(t1 + x40, 0, H - y10) + p8 = Vector(t1 + x5, 0, H - y11) + p9 = Vector(t1, 0, H - y12) + p10 = Vector(t1, 0, y12) + p11 = Vector(t1 + x5, 0, y11) + p12 = Vector(t1 + x40, 0, y10) + p13 = Vector(B - x30, 0, y4 + y2) + p14 = Vector(B - x1, 0, y4 + y1) + p15 = Vector(B, 0, y4) + p16 = Vector(B, 0, 0) + return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p1] def pointsOmega(H, W, D, t1, t2, t3): @@ -1638,17 +1691,17 @@ def execute(self, obj): class _ProfileAngle(_Profile): def __init__(self, obj, profile): - self.label=obj.Name - self.size=FreeCAD.ActiveDocument.getObject(self.label).size - self.standard=FreeCAD.ActiveDocument.getObject(self.label).standard - self.Solid=FreeCAD.ActiveDocument.getObject(self.label).Solid - self.g0=FreeCAD.ActiveDocument.getObject(self.label).g0*1000 - if self.standard=='SS_Equal': - self.sa=ShpstData.angle_ss_equal[self.size] - elif self.standard=='SS_Unequal': - self.sa=ShpstData.angle_ss_unequal[self.size] - elif self.standard=='SUS_Equal': - self.sa=ShpstData.angle_sus_equal[self.size] + self.label = obj.Name + self.size = FreeCAD.ActiveDocument.getObject(self.label).size + self.standard = FreeCAD.ActiveDocument.getObject(self.label).standard + self.Solid = FreeCAD.ActiveDocument.getObject(self.label).Solid + self.g0 = FreeCAD.ActiveDocument.getObject(self.label).g0 * 1000 + if self.standard == "SS_Equal": + self.sa = ShpstData.angle_ss_equal[self.size] + elif self.standard == "SS_Unequal": + self.sa = ShpstData.angle_ss_unequal[self.size] + elif self.standard == "SUS_Equal": + self.sa = ShpstData.angle_sus_equal[self.size] obj.addProperty( "App::PropertyString", "FType", @@ -1689,35 +1742,35 @@ def __init__(self, obj, profile): return def execute(self, obj): - A=float(self.sa[0]) - B=float(self.sa[1]) - t=float(self.sa[2]) - r1=float(self.sa[3]) - r2=float(self.sa[4]) - cx=float(self.sa[7])*10 - cy=float(self.sa[8])*10 - L=FreeCAD.ActiveDocument.getObject(self.label).L - L=float(L) - obj.A=A - obj.B=B - obj.Shape=drawAndCenter(pointsLWithRound(A, B, t, r1, r2)) + A = float(self.sa[0]) + B = float(self.sa[1]) + t = float(self.sa[2]) + r1 = float(self.sa[3]) + r2 = float(self.sa[4]) + cx = float(self.sa[7]) * 10 + cy = float(self.sa[8]) * 10 + L = FreeCAD.ActiveDocument.getObject(self.label).L + L = float(L) + obj.A = A + obj.B = B + obj.Shape = drawAndCenter(pointsLWithRound(A, B, t, r1, r2)) class _ProfileChannel(_Profile): def __init__(self, obj, profile): - self.label=obj.Name - self.size=FreeCAD.ActiveDocument.getObject(self.label).size - self.standard=FreeCAD.ActiveDocument.getObject(self.label).standard - Solid=FreeCAD.ActiveDocument.getObject(self.label).Solid - g0=FreeCAD.ActiveDocument.getObject(self.label).g0*1000 - if self.standard=='SS': - self.sa=ShpstData.channel_ss[self.size] - self.s0=5 - self.t2=float(self.sa[3]) - elif self.standard=='SUS': - self.self.sa=ShpstData.channel_sus[self.size] - self.s0=0 - self.t2=float(self.sa[2]) + self.label = obj.Name + self.size = FreeCAD.ActiveDocument.getObject(self.label).size + self.standard = FreeCAD.ActiveDocument.getObject(self.label).standard + Solid = FreeCAD.ActiveDocument.getObject(self.label).Solid + g0 = FreeCAD.ActiveDocument.getObject(self.label).g0 * 1000 + if self.standard == "SS": + self.sa = ShpstData.channel_ss[self.size] + self.s0 = 5 + self.t2 = float(self.sa[3]) + elif self.standard == "SUS": + self.self.sa = ShpstData.channel_sus[self.size] + self.s0 = 0 + self.t2 = float(self.sa[2]) obj.addProperty( "App::PropertyString", "FType", @@ -1757,20 +1810,20 @@ def __init__(self, obj, profile): _Profile.__init__(self, obj, profile) return - def execute(self,obj): - H=float(self.sa[0]) - B=float(self.sa[1]) - t1=float(self.sa[2]) - #t2=float(self.sa[3]) - r1=float(self.sa[4]) - r2=float(self.sa[5]) - Cy=float(self.sa[8])*10 - L=FreeCAD.ActiveDocument.getObject(self.label).L - L=float(L) - Solid=FreeCAD.ActiveDocument.getObject(self.label).Solid - obj.H=H - obj.B=B - obj.Shape=drawAndCenter(pointsChannelWithRound(H, B, t1, self.t2, r1, r2, Cy ,self.s0)) + def execute(self, obj): + H = float(self.sa[0]) + B = float(self.sa[1]) + t1 = float(self.sa[2]) + # t2=float(self.sa[3]) + r1 = float(self.sa[4]) + r2 = float(self.sa[5]) + Cy = float(self.sa[8]) * 10 + L = FreeCAD.ActiveDocument.getObject(self.label).L + L = float(L) + Solid = FreeCAD.ActiveDocument.getObject(self.label).Solid + obj.H = H + obj.B = B + obj.Shape = drawAndCenter(pointsChannelWithRound(H, B, t1, self.t2, r1, r2, Cy, self.s0)) class _ProfileT(_Profile): diff --git a/pCmd.py b/pCmd.py index ed31218..57f44b3 100644 --- a/pCmd.py +++ b/pCmd.py @@ -454,20 +454,24 @@ def makeFlange(propList=[], pos=None, Z=None): a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) - if a.FlangeType=='WN': - zpos=-a.T1+a.trf - elif a.FlangeType=='SW': - zpos=-a.T1+a.Y+a.trf - elif a.FlangeType=='LJ': - zpos=0 + if a.FlangeType == "WN": + zpos = -a.T1 + a.trf + elif a.FlangeType == "SW": + zpos = -a.T1 + a.Y + a.trf + elif a.FlangeType == "LJ": + zpos = 0 else: - zpos=0 - a.Placement=a.Placement.multiply(FreeCAD.Placement(FreeCAD.Vector(0,0,zpos),FreeCAD.Rotation(1,0,0))) + zpos = 0 + a.Placement = a.Placement.multiply( + FreeCAD.Placement(FreeCAD.Vector(0, 0, zpos), FreeCAD.Rotation(1, 0, 0)) + ) FreeCAD.ActiveDocument.recompute() return a -def doFlanges(propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0,0,0], pypeline=None): +def doFlanges( + propList=["DN50", "SO", 160, 60.3, 132, 14, 15, 4, 0, 0, 0, 0, 0, 0, 0], pypeline=None +): """ propList = [ DN (string): nominal diameter @@ -1405,7 +1409,9 @@ def makeNozzle(DN="DN50", H=200, OD=60.3, thk=3, D=160, d=62, df=132, f=14, t=15 Z=e.tangentAt(0).cross(e.normalAt(0)), ) FreeCAD.ActiveDocument.recompute() - flange = makeFlange([DN, "S.O.", D, d, df, f, t, n],pos=portsPos(pipe)[1],Z=portsDir(pipe)[1]) + flange = makeFlange( + [DN, "S.O.", D, d, df, f, t, n], pos=portsPos(pipe)[1], Z=portsDir(pipe)[1] + ) pipe.MapReversed = False pipe.AttachmentSupport = [(s, fCmd.edgeName(s, e)[1])] pipe.MapMode = "Concentric" diff --git a/pFeatures.py b/pFeatures.py index 30d91ec..44c95cc 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -12,7 +12,6 @@ import FreeCAD import FreeCADGui import Part -import Sketcher import fCmd import pCmd @@ -143,9 +142,7 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, H=100): "ID", "Pipe", QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), - ).ID = ( - obj.OD - 2 * obj.thk - ) + ).ID = obj.OD - 2 * obj.thk obj.addProperty( "App::PropertyLength", "Height", @@ -157,9 +154,7 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, H=100): "Profile", "Pipe", QT_TRANSLATE_NOOP("App::Property", "Section dim."), - ).Profile = ( - str(obj.OD) + "x" + str(obj.thk) - ) + ).Profile = str(obj.OD) + "x" + str(obj.thk) def onChanged(self, fp, prop): if prop == "ID" and fp.ID < fp.OD: @@ -185,7 +180,7 @@ def execute(self, fp): L -= tang fp.AttachmentOffset.Base = FreeCAD.Vector(0, 0, tang) fp.Height = L - except Exception as e: + except Exception: # FreeCAD.Console.PrintWarning(str(e) + "\n") pass if fp.thk > fp.OD / 2: @@ -237,9 +232,7 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, BA=90, BR=45.225): "ID", "Elbow", QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), - ).ID = ( - obj.OD - 2 * obj.thk - ) + ).ID = obj.OD - 2 * obj.thk obj.addProperty( "App::PropertyAngle", "BendAngle", @@ -257,9 +250,7 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3, BA=90, BR=45.225): "Profile", "Elbow", QT_TRANSLATE_NOOP("App::Property", "Section dim."), - ).Profile = ( - str(obj.OD) + "x" + str(obj.thk) - ) + ).Profile = str(obj.OD) + "x" + str(obj.thk) # obj.Ports=[FreeCAD.Vector(1,0,0),FreeCAD.Vector(0,1,0)] self.execute(obj) @@ -275,7 +266,7 @@ def execute(self, fp): i = parent.Curves.index(fp.Name) v1, v2 = [e.tangentAt(0) for e in edges[i : i + 2]] pCmd.placeTheElbow(fp, v1, v2) - except Exception as e: + except Exception: # FreeCAD.Console.PrintWarning(str(e) + "\n") pass if fp.BendAngle < 180: @@ -364,8 +355,8 @@ def __init__( # initialize the parent class super(Flange, self).__init__(obj) # define common properties - self.Type='Flange' - obj.Proxy=self + self.Type = "Flange" + obj.Proxy = self obj.PType = "Flange" obj.PRating = "DIN-PN16" obj.PSize = DN @@ -452,7 +443,7 @@ def __init__( "App::PropertyLength", "T1", "Flange", - QT_TRANSLATE_NOOP("App::Property", "Flange neck lenght"), + QT_TRANSLATE_NOOP("App::Property", "Flange neck length"), ).T1 = T1 obj.addProperty( "App::PropertyLength", @@ -469,15 +460,15 @@ def __init__( def onChanged(self, fp, prop): # FreeCAD.Console.PrintMessage(prop) - if prop=="ODp": + if prop == "ODp": if fp.ODp > fp.D: - FreeCAD.Console.PrintError("Raised edge diameter must be smaller than flange diameter") + FreeCAD.Console.PrintError( + "Raised edge diameter must be smaller than flange diameter" + ) return None def execute(self, fp): - ''' - - ''' + """ """ base = Part.Face(Part.Wire(Part.makeCircle(fp.D / 2))) if fp.d > 0: base = base.cut(Part.Face(Part.Wire(Part.makeCircle(fp.d / 2)))) @@ -496,52 +487,60 @@ def execute(self, fp): for i in list(range(fp.n)): base = base.cut(hole) hole.rotate(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n) - #creates flange thickness - flange = base.extrude(FreeCAD.Vector(0, 0, fp.t-fp.trf)) + # creates flange thickness + flange = base.extrude(FreeCAD.Vector(0, 0, fp.t - fp.trf)) FreeCADGui.ActiveDocument.Flange.Deviation = 0.10 - if fp.FlangeType=='SW' or fp.FlangeType=='WN'or fp.FlangeType=='LJ' or fp.FlangeType=='SO': - #creates flange neck - nn=Part.makeCylinder(fp.ODp/2,fp.T1-fp.trf,vO,vZ).cut( - Part.makeCylinder(fp.d/2,fp.T1-fp.trf,vO,vZ)) - flange=flange.fuse(nn) + if ( + fp.FlangeType == "SW" + or fp.FlangeType == "WN" + or fp.FlangeType == "LJ" + or fp.FlangeType == "SO" + ): + # creates flange neck + nn = Part.makeCylinder(fp.ODp / 2, fp.T1 - fp.trf, vO, vZ).cut( + Part.makeCylinder(fp.d / 2, fp.T1 - fp.trf, vO, vZ) + ) + flange = flange.fuse(nn) if fp.trf > 0 and fp.drf < fp.D: rf = Part.makeCylinder(fp.drf / 2, fp.trf, vO, vZ * -1).cut( - Part.makeCylinder(fp.d / 2, fp.trf, vO, vZ * -1)) + Part.makeCylinder(fp.d / 2, fp.trf, vO, vZ * -1) + ) flange = flange.fuse(rf) - if fp.FlangeType=='WN': + if fp.FlangeType == "WN": try: # Flange2:welding-neck if fp.dwn > 0 and fp.twn > 0 and fp.ODp > 0: - wn = Part.makeCone(fp.dwn / 2, fp.ODp / 2, fp.twn, vZ * float(fp.t-fp.trf)).cut( - Part.makeCylinder(fp.d / 2, fp.twn, vZ * float(fp.t-fp.trf)) - ) + wn = Part.makeCone( + fp.dwn / 2, fp.ODp / 2, fp.twn, vZ * float(fp.t - fp.trf) + ).cut(Part.makeCylinder(fp.d / 2, fp.twn, vZ * float(fp.t - fp.trf))) flange = flange.fuse(wn) flange = flange.removeSplitter() - flange=flange.makeFillet(fp.R,[flange.Edges[2]]) - flange=flange.makeChamfer((fp.ODp-fp.d)/2*0.90,[flange.Edges[6]]) + flange = flange.makeFillet(fp.R, [flange.Edges[2]]) + flange = flange.makeChamfer((fp.ODp - fp.d) / 2 * 0.90, [flange.Edges[6]]) except: - pass - elif fp.FlangeType=='LJ': - edge=[] + pass + elif fp.FlangeType == "LJ": + edge = [] flange = flange.removeSplitter() if fp.n == 4: - edge=flange.Edges[19] + edge = flange.Edges[19] if fp.n == 8: - edge=flange.Edges[31] + edge = flange.Edges[31] if fp.n == 12: - edge=flange.Edges[43] + edge = flange.Edges[43] if fp.n == 16: - edge=flange.Edges[55] + edge = flange.Edges[55] if fp.n == 20: - edge=flange.Edges[67] - flange=flange.makeFillet(fp.R,edge) - elif fp.FlangeType=='SW': - #creates flange neck + edge = flange.Edges[67] + flange = flange.makeFillet(fp.R, edge) + elif fp.FlangeType == "SW": + # creates flange neck if fp.B2 > 0: - nn=flange.cut( - Part.makeCylinder(fp.B2/2,fp.Y,vZ*float(fp.T1-fp.trf),vZ*-1)) - flange=nn.removeSplitter() - fp.Shape=flange + nn = flange.cut( + Part.makeCylinder(fp.B2 / 2, fp.Y, vZ * float(fp.T1 - fp.trf), vZ * -1) + ) + flange = nn.removeSplitter() + fp.Shape = flange fp.Ports = [FreeCAD.Vector(), FreeCAD.Vector(0, 0, float(fp.t))] super(Flange, self).execute(fp) # perform common operations @@ -677,9 +676,7 @@ def __init__(self, obj, DN="DN50", OD=60.3, OD2=48.3, thk=3, thk2=None, H=None, "Profile", "Reduct", QT_TRANSLATE_NOOP("App::Property", "Section dim."), - ).Profile = ( - str(obj.OD) + "x" + str(obj.OD2) - ) + ).Profile = str(obj.OD) + "x" + str(obj.OD2) obj.addProperty( "App::PropertyBool", "conc", @@ -765,17 +762,13 @@ def __init__(self, obj, DN="DN50", OD=60.3, thk=3): "ID", "Cap", QT_TRANSLATE_NOOP("App::Property", "Inside diameter"), - ).ID = ( - obj.OD - 2 * obj.thk - ) + ).ID = obj.OD - 2 * obj.thk obj.addProperty( "App::PropertyString", "Profile", "Cap", QT_TRANSLATE_NOOP("App::Property", "Section dim."), - ).Profile = ( - str(obj.OD) + "x" + str(obj.thk) - ) + ).Profile = str(obj.OD) + "x" + str(obj.thk) def onChanged(self, fp, prop): return None @@ -861,9 +854,7 @@ def __init__(self, obj, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None, l "Group", "PypeLine2", QT_TRANSLATE_NOOP("App::Property", "The group."), - ).Group = ( - obj.Label + "_pieces" - ) + ).Group = obj.Label + "_pieces" group = FreeCAD.activeDocument().addObject("App::DocumentObjectGroup", obj.Group) group.addObject(obj) FreeCAD.Console.PrintWarning("Created group " + obj.Group + "\n") @@ -888,6 +879,7 @@ def purge(self, fp): def update(self, fp, edges=None): from DraftVecUtils import rounded from math import degrees + if not edges and hasattr(fp.Base, "Shape"): edges = fp.Base.Shape.Edges if not edges: @@ -931,8 +923,6 @@ def __init__(self, vobj): vobj.Proxy = self def getIcon(self): - from os.path import join, dirname, abspath - return join(dirname(abspath(__file__)), "iconz", "pypeline.svg") def attach(self, vobj): @@ -1114,8 +1104,6 @@ def __init__(self, vobj): # vobj.ExtensionProxy=self #20220703 def getIcon(self): - from os.path import join, dirname, abspath - return join(dirname(abspath(__file__)), "iconz", "branch.svg") def attach(self, vobj): diff --git a/pForms.py b/pForms.py index bfd99e0..7fb2584 100644 --- a/pForms.py +++ b/pForms.py @@ -338,8 +338,8 @@ def trim(self): if len(fCmd.beams()) == 1: pipe = fCmd.beams()[0] comPipeEdges = [e.CenterOfMass for e in pipe.Shape.Edges] - eds = [e for e in fCmd.edges() if not e.CenterOfMass in comPipeEdges] - FreeCAD.activeDocument().openTransaction("Trim pipes") + eds = [e for e in fCmd.edges() if e.CenterOfMass not in comPipeEdges] + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Trim pipes")) for edge in eds: fCmd.extendTheBeam(fCmd.beams()[0], edge) FreeCAD.activeDocument().commitTransaction() @@ -452,13 +452,13 @@ def insert(self): propList.append(float(d["trf"])) propList.append(float(d["drf"])) except: - for x in range(0,2,1): + for x in range(0, 2, 1): propList.append(0) try: # for welding-neck propList.append(float(d["twn"])) propList.append(float(d["dwn"])) except: - for x in range(0,2,1): + for x in range(0, 2, 1): propList.append(0) try: # for welding-neck propList.append(float(d["ODp"])) @@ -1438,7 +1438,10 @@ def apply(self): FreeCAD.activeDocument().recompute() -import DraftTools, Draft, uForms, uCmd +import DraftTools +import Draft +import uForms +import uCmd from PySide.QtGui import * @@ -1593,11 +1596,13 @@ def __init__(self): if s.startswith("Flange") and s.endswith(".csv") ] self.form.comboPipe.addItems(self.pipeRatings) - self.form.comboPipe.setToolTip('List available pipe thickness standarts') + self.form.comboPipe.setToolTip("List available pipe thickness standards") self.form.comboFlange.addItems(self.flangeRatings) - self.form.comboFlange.setToolTip('List available flange standarts') + self.form.comboFlange.setToolTip("List available flange standards") self.form.btn1.clicked.connect(self.addNozzle) - self.form.btn1.setToolTip('In order to make it Work, must select a circular edge direct from viewer then press this button') + self.form.btn1.setToolTip( + "In order to make it work, must select a circular edge direct from viewer then press this button" + ) self.form.editLength.setValidator(QDoubleValidator()) self.form.editX.setValidator(QDoubleValidator()) self.form.editY.setValidator(QDoubleValidator()) @@ -1650,7 +1655,20 @@ def combine(self): f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") reader = csv.DictReader(f, delimiter=";") flanges = dict( - [[line["PSize"],[float(line["D"]),float(line["d"]),float(line["df"]),float(line["f"]),float(line["t"]),int(line["n"]),],]for line in reader] + [ + [ + line["PSize"], + [ + float(line["D"]), + float(line["d"]), + float(line["df"]), + float(line["f"]), + float(line["t"]), + int(line["n"]), + ], + ] + for line in reader + ] ) f.close() # print(translate("insertTankForm", "files read")) diff --git a/pObservers.py b/pObservers.py index c44f2f7..c413842 100644 --- a/pObservers.py +++ b/pObservers.py @@ -6,7 +6,9 @@ __license__ = "LGPL 3" # import FreeCAD modules -import FreeCAD, FreeCADGui, pCmd +import FreeCAD +import FreeCADGui +import pCmd from fObservers import frameObserverPrototype from uCmd import arrow diff --git a/uCmd.py b/uCmd.py index 20700b4..b8a58b7 100644 --- a/uCmd.py +++ b/uCmd.py @@ -67,7 +67,8 @@ def setWP(): # TARGET [working]: deal with App::Parts def rotWP(ax=None, ang=45): - import FreeCAD, FreeCADGui + import FreeCAD + import FreeCADGui if not ax: ax = FreeCAD.Vector(0, 0, 1) @@ -81,7 +82,8 @@ def rotWP(ax=None, ang=45): def offsetWP(delta): - import FreeCAD, FreeCADGui + import FreeCAD + import FreeCADGui if hasattr(FreeCAD, "DraftWorkingPlane") and hasattr(FreeCADGui, "Snapper"): rot = FreeCAD.DraftWorkingPlane.getPlacement().Rotation @@ -303,7 +305,8 @@ class label3D(object): """ def __init__(self, pl=None, sizeFont=30, color=(1.0, 0.6, 0.0), text="TEXT"): - import FreeCAD, FreeCADGui + import FreeCAD + import FreeCADGui self.node = coin.SoSeparator() self.color = coin.SoBaseColor() @@ -327,14 +330,14 @@ def removeLabel(self): self.sg.removeChild(self.node) def moveto(self, pl): - import FreeCAD - self.Placement = pl self.transform.translation.setValue(tuple(self.Placement.Base)) self.transform.rotation.setValue(tuple(self.Placement.Rotation.Q)) -import DraftTools, Draft, uForms +import DraftTools +import Draft +import uForms from PySide.QtGui import * diff --git a/uForms.py b/uForms.py index 962a259..a61fd3a 100644 --- a/uForms.py +++ b/uForms.py @@ -71,7 +71,6 @@ def initUI(self): self.show() def onPushButton1(self): - from math import pi, degrees import fCmd try: @@ -141,7 +140,6 @@ def onCancel(self): from PySide.QtCore import * from PySide.QtGui import * -from os import listdir from os.path import join, dirname, abspath @@ -216,7 +214,7 @@ def accept(self): import csv from PySide.QtCore import * from PySide.QtGui import * -from math import pi, log, radians, sin, sqrt, atan, degrees +from math import pi, log, radians, sin, sqrt, atan class dpCalcDialog: From e0c7b342acb1f31d6bff51a0d868f1f78fd94735 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 12 Jan 2025 19:54:45 -0600 Subject: [PATCH 089/135] Mark `openTransaction()` strings for translation --- CFrame.py | 14 ++++++++------ CPipe.py | 18 +++++++++++------- fFeatures.py | 20 ++++++++++---------- fForms.py | 26 +++++++++++--------------- fObservers.py | 4 +--- pCmd.py | 12 ++++++------ pForms.py | 29 +++++++++++++++++------------ pObservers.py | 6 +++++- 8 files changed, 69 insertions(+), 60 deletions(-) diff --git a/CFrame.py b/CFrame.py index fe20258..effc0db 100644 --- a/CFrame.py +++ b/CFrame.py @@ -59,7 +59,7 @@ def Activated(self): import FreeCADGui import pCmd - FreeCAD.activeDocument().openTransaction("Spin") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Spin")) for beam in FreeCADGui.Selection.getSelection(): pCmd.rotateTheTubeAx(beam) FreeCAD.activeDocument().recompute() @@ -90,7 +90,7 @@ def Activated(self): import FreeCADGui import pCmd - FreeCAD.activeDocument().openTransaction("Reverse") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Reverse")) for objEx in FreeCADGui.Selection.getSelectionEx(): pCmd.reverseTheTube(objEx) FreeCAD.activeDocument().recompute() @@ -208,7 +208,7 @@ def Activated(self): faces = fCmd.faces(selex) beams = [sx.Object for sx in selex] if len(faces) == len(beams) > 1: - FreeCAD.activeDocument().openTransaction("LevelTheBeams") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Level The Beams")) beams.pop(0) fBase = faces.pop(0) for i in range(len(beams)): @@ -258,7 +258,7 @@ def Activated(self): beams = FreeCADGui.Selection.getSelection()[1:] if len(edges) == len(beams): pairs = [(beams[i], edges[i]) for i in range(len(beams))] - FreeCAD.activeDocument().openTransaction("AlignEdge") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Align Edge")) for p in pairs: fCmd.joinTheBeamsEdges(p[0], e1, p[1]) FreeCAD.activeDocument().commitTransaction() @@ -400,7 +400,9 @@ def Activated(self): import fCmd if len(fCmd.beams()) > 1: - FreeCAD.activeDocument().openTransaction("rotJoin") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Rotate to Join on Edge") + ) fCmd.rotjoinTheBeam() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -429,7 +431,7 @@ class insertPath: def Activated(self): import pCmd - FreeCAD.activeDocument().openTransaction("make Path") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Make Path")) pCmd.makeW() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() diff --git a/CPipe.py b/CPipe.py index cdaeaea..52787a9 100644 --- a/CPipe.py +++ b/CPipe.py @@ -221,7 +221,7 @@ class mateEdges: def Activated(self): import pCmd - FreeCAD.activeDocument().openTransaction("Mate") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Mate")) pCmd.alignTheTube() FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() @@ -257,7 +257,9 @@ class extend2intersection: def Activated(self): import pCmd - FreeCAD.activeDocument().openTransaction("Xtend2int") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Extend pipes to intersection") + ) pCmd.extendTheTubes2intersection() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -278,7 +280,9 @@ class extend1intersection: def Activated(self): import pCmd - FreeCAD.activeDocument().openTransaction("Xtend1int") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Extend pipe to intersection") + ) pCmd.extendTheTubes2intersection(both=False) FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -302,7 +306,7 @@ def Activated(self): from Part import Plane refFace = [f for f in fCmd.faces() if type(f.Surface) == Plane][0] - FreeCAD.activeDocument().openTransaction("Lay-down the pipe") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Lay-down the pipe")) for b in fCmd.beams(): if pCmd.isPipe(b): pCmd.laydownTheTube(b, refFace) @@ -331,7 +335,7 @@ def Activated(self): if len(sxFaces) > 0: refFace = sxFaces[0] support = sx.Object - FreeCAD.activeDocument().openTransaction("Raise-up the support") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Raise-up the support")) for b in fCmd.beams(): if pCmd.isPipe(b): pCmd.laydownTheTube(b, refFace, support) @@ -391,7 +395,7 @@ class attach2tube: def Activated(self): import pCmd - FreeCAD.activeDocument().openTransaction("Attach to tube") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Attach to tube")) pCmd.attachToTube() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -474,7 +478,7 @@ class makeHeader: def Activated(self): import pCmd - FreeCAD.activeDocument().openTransaction("Connect to header") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Connect to header")) pCmd.header() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() diff --git a/fFeatures.py b/fFeatures.py index 0f72563..fadd7c7 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -456,9 +456,7 @@ class frameBranchForm(dodoDialogs.protoTypeDialog): def __init__(self): super(frameBranchForm, self).__init__("fbranch.ui") - self.sectDictList = ( - [] - ) # list (sizes) of properties (dictionaries) of the current type of section + self.sectDictList = [] # list (sizes) of properties (dictionaries) of the current type of section self.form.editAngle.setValidator(QDoubleValidator()) self.form.editAngle.editingFinished.connect(self.changeAngle) self.form.editHead.setValidator(QDoubleValidator()) @@ -507,7 +505,9 @@ def getPropsfromlistSizes(self): return value def makeSingle(self): - FreeCAD.activeDocument().openTransaction("Insert Single Struct") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Insert Single Structure") + ) if self.SType == "": profile = FreeCAD.ActiveDocument.getObjectsByLabel( self.form.listSizes.currentItem().text() @@ -799,7 +799,9 @@ def accept(self): # GET BASE bases = [b for b in FreeCADGui.Selection.getSelection() if hasattr(b, "Shape")] if bases and self.form.listSizes.selectedItems(): - FreeCAD.activeDocument().openTransaction("Insert FrameBranch") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Insert Frame Branch") + ) if self.SType == "": profile = FreeCAD.ActiveDocument.getObjectsByLabel( self.form.listSizes.currentItem().text() @@ -1042,7 +1044,7 @@ def spinAngle(self): self.changeAngle() def trim(self): - FreeCAD.ActiveDocument.openTransaction("Trim FB") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Trim Frame Branch")) for target in self.targets: for b in fCmd.beams(): if hasattr(b, "tailOffset") and hasattr(b, "headOffset"): @@ -1116,9 +1118,7 @@ def __init__(self, obj, section="IPE200", lab=None): "Group", "FrameLine", QT_TRANSLATE_NOOP("App::PropertyString", "The group."), - ).Group = ( - obj.Label + "_pieces" - ) + ).Group = obj.Label + "_pieces" group = FreeCAD.activeDocument().addObject("App::DocumentObjectGroup", obj.Group) group.addObject(obj) FreeCAD.Console.PrintWarning("Created group " + obj.Group + "\n") @@ -1165,7 +1165,7 @@ def update(self, fp, copyProfile=True): return group = FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] if fp.Profile: - FreeCAD.activeDocument().openTransaction("Update frameLine") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Update Frame Line")) for e in edges: if copyProfile: p = FreeCAD.activeDocument().copyObject(fp.Profile, True) diff --git a/fForms.py b/fForms.py index 1c463a5..fd3add3 100644 --- a/fForms.py +++ b/fForms.py @@ -28,7 +28,7 @@ def __init__(self): def accept(self): if self.beam != None and len(fCmd.edges()) > 0: - FreeCAD.activeDocument().openTransaction("Fill frame") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Fill frame")) if self.form.radio1.isChecked(): fCmd.placeTheBeam(self.beam, fCmd.edges()[0]) else: @@ -69,7 +69,7 @@ def selectAction(self): def accept(self): # extend if self.target != None and len(fCmd.beams()) > 0: - FreeCAD.activeDocument().openTransaction("Extend beam") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Extend beam")) for beam in fCmd.beams(): fCmd.extendTheBeam(beam, self.target) FreeCAD.activeDocument().recompute() @@ -134,7 +134,7 @@ def accept(self): self.L = fCmd.getDistance() if self.form.edit1.text(): length = float(self.form.edit1.text()) - FreeCAD.activeDocument().openTransaction("Stretch beam") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Stretch beam")) for beam in fCmd.beams(): delta = float(beam.Height) - length fCmd.stretchTheBeam(beam, length) @@ -287,7 +287,7 @@ def accept(self): # translate float(self.form.edit2.text()) * self.form.cbY.isChecked(), float(self.form.edit3.text()) * self.form.cbZ.isChecked(), ).scale(scale, scale, scale) - FreeCAD.activeDocument().openTransaction("Translate") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Translate")) for o in set(FreeCADGui.Selection.getSelection()): if self.form.cbCopy.isChecked(): for i in range(self.form.spinBox.value()): @@ -357,7 +357,7 @@ def accept(self): faces = fCmd.faces() objs = FreeCADGui.Selection.getSelection() # beams=fCmd.beams() if len(faces) == len(objs) > 0 and self.faceRef: - FreeCAD.activeDocument().openTransaction("AlignFlange") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Align Flange")) if self.form.cbInvert.isChecked(): for i in range(len(objs)): fCmd.rotTheBeam(objs[i], self.faceRef, faces[i], True) @@ -400,7 +400,9 @@ def accept( self.deleteArrow() objects = FreeCADGui.Selection.getSelection() if objects and self.Axis: - FreeCAD.ActiveDocument.openTransaction("rotateTheBeamAround") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Rotate The Beam Around") + ) for o in objects: if self.form.copyCB.isChecked(): FreeCAD.activeDocument().copyObject(o, True) @@ -570,9 +572,7 @@ def accept(self): else: label = self.form.lineEdit.text() if FreeCAD.ActiveDocument: - FreeCAD.activeDocument().openTransaction( - translate("profEdit", "Insert profile", "Transaction, used on undo/redo lists") - ) + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert profile")) if self.type == "R": if not self.form.cbFull.isChecked() and t2 < H / 2 and t1 < B / 2: sect = fFeatures.doProfile("RH", label, [B, H, t1, t2]) @@ -614,9 +614,7 @@ def apply(self): if sel: obj = sel[0] if hasattr(obj, "Shape") and obj.Shape.ShapeType in ("Face", "Shell"): - FreeCAD.ActiveDocument.openTransaction( - translate("profEdit", "Modify profile", "Transaction, used on undo/redo lists") - ) + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Modify profile")) if self.form.lineEdit.text(): obj.Label = self.form.lineEdit.text() if hasattr(obj, "H"): @@ -704,9 +702,7 @@ def shiftProfile(self, sect=None): if sect: sect.Placement.move(sect.Shape.CenterOfMass.negative()) FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.openTransaction( - translate("profEdit", "Shift profile", "Transaction, used on undo/redo lists") - ) + FreeCAD.activeDocument().openTransaction(translate("profEdit", "Shift profile")) B = sect.Shape.BoundBox O = sect.Shape.CenterOfMass N = FreeCAD.Vector(0, O.y - B.YMin, 0) diff --git a/fObservers.py b/fObservers.py index e91a5dd..dcc6e80 100644 --- a/fObservers.py +++ b/fObservers.py @@ -219,9 +219,7 @@ def addSelection(self, doc, obj, sub, pnt): if len(self.edges) == len(self.beams) == 2: if fCmd.isOrtho(*self.edges): self.beams.reverse() - FreeCAD.ActiveDocument.openTransaction( - translate("fObservers", "Adjust angle", "Transaction") - ) + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Adjust angle")) for i in range(len(self.edges)): fCmd.extendTheBeam(self.beams[i], self.edges[i]) FreeCAD.ActiveDocument.commitTransaction() diff --git a/pCmd.py b/pCmd.py index 57f44b3..8d90348 100644 --- a/pCmd.py +++ b/pCmd.py @@ -196,7 +196,7 @@ def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): H (float): length of pipe ] pypeline = string """ - FreeCAD.activeDocument().openTransaction("Insert pipe") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert pipe")) plist = list() if len(fCmd.edges()) == 0: # ..no edges selected vs = [ @@ -346,7 +346,7 @@ def doElbow(propList=["DN50", 60.3, 3, 90, 45.225], pypeline=None): pypeline = string """ elist = [] - FreeCAD.activeDocument().openTransaction("Insert elbow") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert elbow")) selex = FreeCADGui.Selection.getSelectionEx() if len(selex) == 0: # no selection -> insert one elbow at origin elist.append(makeElbow(propList)) @@ -495,7 +495,7 @@ def doFlanges( """ flist = [] tubes = [t for t in fCmd.beams() if hasattr(t, "PSize")] - FreeCAD.activeDocument().openTransaction("Insert flange") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert flange")) if len(fCmd.edges()) == 0: vs = [ v @@ -654,7 +654,7 @@ def doCaps(propList=["DN50", 60.3, 3], pypeline=None): pypeline = string """ clist = [] - FreeCAD.activeDocument().openTransaction("Insert cap") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert cap")) if len(fCmd.edges()) == 0: vs = [ v @@ -1269,7 +1269,7 @@ def doValves(propList=["DN50", "ball", 72, 50, 40, 150], pypeline=None, pos=0): color = 0.05, 0.3, 0.75 vlist = [] # d=self.pipeDictList[self.sizeList.currentRow()] - FreeCAD.activeDocument().openTransaction("Insert valve") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert valve")) # propList=[d['PSize'],d['VType'],float(pq(d['OD'])),float(pq(d['ID'])),float(pq(d['H'])),float(pq(d['Kv']))] if 0 < pos < 100: # ..place the valve in the middle of pipe(s) pipes = [p for p in FreeCADGui.Selection.getSelection() if isPipe(p)] @@ -1476,7 +1476,7 @@ def flatten(p1=None, p2=None, c=None): com2 = p2.Shape.Solids[0].CenterOfMass v1 = P - com1 v2 = com2 - P - FreeCAD.ActiveDocument.openTransaction("Place one curve") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Place one curve")) placeoTherElbow(curves[0], v1, v2, P) FreeCAD.ActiveDocument.recompute() # recompute for the elbow port1, port2 = portsPos(curves[0]) diff --git a/pForms.py b/pForms.py index 7fb2584..2b94516 100644 --- a/pForms.py +++ b/pForms.py @@ -65,7 +65,7 @@ def __init__(self): self.show() def redraw(self): - FreeCAD.activeDocument().openTransaction("Redraw pype-lines") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Redraw pipe-lines")) i = 0 for cb in self.checkBoxes: if cb.isChecked(): @@ -657,7 +657,7 @@ def insert(self): if not H: # calculate length if it's not defined H = float(3 * (OD1 - OD2)) propList = [DN, OD1, OD2, thk1, thk2, H] - FreeCAD.activeDocument().openTransaction("Insert reduction") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert reduction")) if self.cb1.isChecked(): self.lastReduct = pCmd.makeReduct(propList, pos, Z, False) else: @@ -739,14 +739,18 @@ def insert(self): float(pq(d["H"])), float(pq(d["d"])), ] - FreeCAD.activeDocument().openTransaction("Insert clamp in (0,0,0)") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Insert clamp in (0,0,0)") + ) ub = pCmd.makeUbolt(propList) if self.combo.currentText() != "": pCmd.moveToPyLi(ub, self.combo.currentText()) FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() else: - FreeCAD.activeDocument().openTransaction("Insert clamp on tube") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Insert clamp on tube") + ) for objex in selex: if hasattr(objex.Object, "PType") and objex.Object.PType == "Pipe": d = [typ for typ in self.pipeDictList if typ["PSize"] == objex.Object.PSize] @@ -938,7 +942,7 @@ def apply(self): def insert(self): d = self.pipeDictList[self.sizeList.currentRow()] - FreeCAD.activeDocument().openTransaction("Insert pype-line") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert pipe line")) if self.combo.currentText() == translate("insertPypeLineForm", ""): plLabel = self.edit1.text() if not plLabel: @@ -976,7 +980,9 @@ def getBase(self): isWire = hasattr(base, "Shape") and base.Shape.Edges # type(base.Shape)==Part.Wire isSketch = hasattr(base, "TypeId") and base.TypeId == "Sketcher::SketchObject" if isWire or isSketch: - FreeCAD.activeDocument().openTransaction("Assign Base") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Assign Base") + ) pl.Base = base if isWire: pCmd.drawAsCenterLine(pl.Base) @@ -1119,7 +1125,7 @@ def summary(self, pl=None): # FreeCAD.Console.PrintError('Select a PypeLine to apply first\n') def insert(self): d = self.pipeDictList[self.sizeList.currentRow()] - FreeCAD.activeDocument().openTransaction("Insert pype-branch") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert pipe branch")) plLabel = self.edit1.text() if not plLabel: plLabel = "Traccia" @@ -1290,7 +1296,7 @@ def calcGapPercent(self): def breakPipe(self): p2nd = None - FreeCAD.activeDocument().openTransaction("Break pipes") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Break pipes")) if self.edit1.text()[-1] == "%": pipes = [p for p in fCmd.beams() if pCmd.isPipe(p)] for p in pipes: @@ -1511,7 +1517,7 @@ def action(self, arg): # re-defintition of the method of parent # mouse movement detection self.point, ctrlPoint, info = DraftTools.getPoint(self, arg) elif arg["Type"] == "SoMouseButtonEvent": - FreeCAD.activeDocument().openTransaction("point-to-point") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Point to Point")) # mouse button detection if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): if arg["Position"] == self.pos: @@ -1633,8 +1639,7 @@ def accept(self): def addNozzle(self): DN = self.form.listSizes.currentItem().text() args = self.nozzles[DN] - # FreeCAD.Console.PrintMessage(args) - FreeCAD.ActiveDocument.openTransaction("Add nozzles") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Add nozzles")) pCmd.makeNozzle(DN, float(self.form.editLength.text()), *args) FreeCAD.ActiveDocument.commitTransaction() @@ -1722,7 +1727,7 @@ def getPrincipalAx(self, ax): self.form.lab1.setText("global " + ax) def accept(self, ang=None): - FreeCAD.ActiveDocument.openTransaction("Make pipe route") + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Make pipe route")) if fCmd.edges(): e = fCmd.edges()[0] if e.curvatureAt(0): diff --git a/pObservers.py b/pObservers.py index c413842..7791170 100644 --- a/pObservers.py +++ b/pObservers.py @@ -19,6 +19,8 @@ pCmd.arrows1 = list() pCmd.arrows2 = list() +translate = FreeCAD.Qt.translate + class arrow_insert(arrow): def __init__(self, name, pype, portNr, scale=100): @@ -51,7 +53,9 @@ def pickAction(self, path=None, event=None, arg=None): # sample ) # move o2 if type(pCmd.port1) == int and type(pCmd.port2) == int: - FreeCAD.activeDocument().openTransaction("Join") + FreeCAD.activeDocument().openTransaction( + translate("Transaction", "Join") + ) pCmd.join(pCmd.o1, pCmd.port1, pCmd.o2, pCmd.port2) FreeCAD.activeDocument().commitTransaction() else: From 7e153115212e6b4ca46c699f70bde23ab3a1971d Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 12 Jan 2025 20:10:17 -0600 Subject: [PATCH 090/135] Replace black hook with compatible ruff hook --- .pre-commit-config.yaml | 10 +++++----- .ruff.toml | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 686e69c..24fa481 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,15 +7,15 @@ repos: rev: v5.0.0 hooks: - id: trailing-whitespace - - id: end-of-file-fixer + exclude: '^(.*\.st.*p)$' + # - id: end-of-file-fixer # XXX: really needed? - id: check-yaml - id: check-added-large-files - id: mixed-line-ending - - repo: https://github.com/psf/black - rev: 24.10.0 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.9.1 hooks: - - id: black - args: ["--line-length", "100"] + - id: ruff-format - repo: https://github.com/codespell-project/codespell rev: v2.3.0 hooks: diff --git a/.ruff.toml b/.ruff.toml index f4bcdfa..823378b 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -7,7 +7,7 @@ indent-width = 4 # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or # McCabe complexity (`C901`) by default. select = ["E4", "E7", "E9", "F"] -ignore = [] +ignore = ["E402"] # Allow fix for all enabled rules (when `--fix`) is provided. fixable = ["ALL"] @@ -17,7 +17,7 @@ unfixable = [] dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" [format] -exclude = ["*.pyi"] +exclude = ["*.pyi", "ShpstData.py"] # Like Black, use double quotes for strings. quote-style = "double" From da59a7136e18e6f73d555936680270e50ed6deb5 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Sun, 12 Jan 2025 20:36:27 -0600 Subject: [PATCH 091/135] Use `isinstance()` instead of `==` --- CPipe.py | 4 ++-- pObservers.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CPipe.py b/CPipe.py index 52787a9..bc018b0 100644 --- a/CPipe.py +++ b/CPipe.py @@ -305,7 +305,7 @@ def Activated(self): import fCmd from Part import Plane - refFace = [f for f in fCmd.faces() if type(f.Surface) == Plane][0] + refFace = [f for f in fCmd.faces() if isinstance(f.Surface, Plane)][0] FreeCAD.activeDocument().openTransaction(translate("Transaction", "Lay-down the pipe")) for b in fCmd.beams(): if pCmd.isPipe(b): @@ -331,7 +331,7 @@ def Activated(self): selex = FreeCADGui.Selection.getSelectionEx() for sx in selex: - sxFaces = [f for f in fCmd.faces([sx]) if type(f.Surface) == Plane] + sxFaces = [f for f in fCmd.faces([sx]) if isinstance(f.Surface, Plane)] if len(sxFaces) > 0: refFace = sxFaces[0] support = sx.Object diff --git a/pObservers.py b/pObservers.py index 7791170..3012087 100644 --- a/pObservers.py +++ b/pObservers.py @@ -52,7 +52,7 @@ def pickAction(self, path=None, event=None, arg=None): # sample % (pCmd.o2.PType, pCmd.o2.Label, pCmd.port2, pCmd.o1.Label) ) # move o2 - if type(pCmd.port1) == int and type(pCmd.port2) == int: + if isinstance(pCmd.port1, int) and isinstance(pCmd.port2, int): FreeCAD.activeDocument().openTransaction( translate("Transaction", "Join") ) From 7c7f04dc31ff627fc5abe1ab5e1405caf881869e Mon Sep 17 00:00:00 2001 From: hasecilu Date: Mon, 13 Jan 2025 09:28:09 -0600 Subject: [PATCH 092/135] Remove extra imports and duplicated keys --- CFrame.py | 12 +----------- CUtils.py | 1 - ShpstData.py | 8 -------- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/CFrame.py b/CFrame.py index effc0db..e079d76 100644 --- a/CFrame.py +++ b/CFrame.py @@ -30,7 +30,6 @@ class frameIt: """ def Activated(self): - import FreeCADGui import fObservers s = fObservers.frameItObserver() @@ -55,8 +54,6 @@ class spinSect: """ def Activated(self): - import FreeCAD - import FreeCADGui import pCmd FreeCAD.activeDocument().openTransaction(translate("Transaction", "Spin")) @@ -86,8 +83,6 @@ class reverseBeam: """ def Activated(self): - import FreeCAD - import FreeCADGui import pCmd FreeCAD.activeDocument().openTransaction(translate("Transaction", "Reverse")) @@ -199,12 +194,10 @@ class levelBeam: """ def Activated(self): - import FreeCAD - import FreeCADGui import fCmd import fObservers - selex = Gui.Selection.getSelectionEx() + selex = FreeCADGui.Selection.getSelectionEx() faces = fCmd.faces(selex) beams = [sx.Object for sx in selex] if len(faces) == len(beams) > 1: @@ -247,8 +240,6 @@ class alignEdge: """ def Activated(self): - import FreeCAD - import FreeCADGui import fCmd import fObservers @@ -371,7 +362,6 @@ class adjustFrameAngle: """ def Activated(self): - import FreeCADGui import fObservers FreeCADGui.Selection.clearSelection() diff --git a/CUtils.py b/CUtils.py index e14b9f3..8fff148 100644 --- a/CUtils.py +++ b/CUtils.py @@ -19,7 +19,6 @@ class queryModel: def Activated(self): - import FreeCADGui import uForms form = uForms.QueryForm(FreeCADGui.Selection) diff --git a/ShpstData.py b/ShpstData.py index ad7fac1..5aeb0c2 100644 --- a/ShpstData.py +++ b/ShpstData.py @@ -883,12 +883,6 @@ '19x100':(19,100,4000), '19x125':(19,125,4000), '19x150':(19,150,4000), -'19x65':(19,65,4000), -'19x75':(19,75,4000), -'19x90':(19,90,4000), -'19x100':(19,100,4000), -'19x125':(19,125,4000), -'19x150':(19,150,4000), '19x200':(19,200,4000), '19x250':(19,250,4000), '19x300':(19,90,4000), @@ -910,7 +904,6 @@ '22x200':(22,200,4000), '22x250':(22,250,4000), '22x300':(22,300,4000), -'22x100':(22,100,4000), '25x32':(25,32,4000), '25x38':(25,38,4000), '25x40':(25,40,4000), @@ -1180,7 +1173,6 @@ '90x90x6':(90,90,6), '100x100x3':(100,100,3), '100x100x4':(100,100,4), -'100x100x4':(100,100,4), '100x100x5':(100,100,5), '100x100x6':(100,100,6), '100x100x9':(100,100,9), From 9ef069f5db1da76961f29036534869454cb492ec Mon Sep 17 00:00:00 2001 From: hasecilu Date: Mon, 13 Jan 2025 17:38:06 -0600 Subject: [PATCH 093/135] Update some icons, part 3 --- cut_list/resources/cut_list_icon.svg | 636 ++++++++++++++++-- iconz/adjustAngle.svg | 545 ++++++++-------- iconz/around.svg | 942 ++++++++++++++------------- iconz/beamFit.svg | 710 ++++++++++++++++---- iconz/beamRot.svg | 445 +++++++------ iconz/beamShift.svg | 342 +++++----- iconz/beamStretch.svg | 413 ++++++------ iconz/edgeAlign.svg | 430 ++++++------ iconz/extend.svg | 574 ++++++---------- iconz/flangeAlign.svg | 653 +++++-------------- iconz/framebranch.svg | 869 +++++++----------------- iconz/path.svg | 368 +++++------ iconz/pipe.svg | 869 ++++++++++++++++++------ iconz/reverse.svg | 538 +++++++-------- iconz/rotjoin.svg | 435 +++++-------- iconz/route.svg | 611 +++++------------ iconz/sect.svg | 396 +++++------ 17 files changed, 4832 insertions(+), 4944 deletions(-) diff --git a/cut_list/resources/cut_list_icon.svg b/cut_list/resources/cut_list_icon.svg index a144344..e4061a5 100644 --- a/cut_list/resources/cut_list_icon.svg +++ b/cut_list/resources/cut_list_icon.svg @@ -2,97 +2,623 @@ + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + Template + inkscape:current-layer="svg1" + showguides="true" + inkscape:lockguides="false" + guidecolor="#ffff00" + guideopacity="0.6" + guidehicolor="#ff00ff" + guidehiopacity="0.50196078"> + + + + + + + + + id="linearGradient29" + inkscape:collect="always" + inkscape:label="Free Teal gradiente"> + + + + + + + + + id="stop24" /> + + + + + + id="linearGradient19" + inkscape:collect="always" + inkscape:label="Chocolate gradient"> + id="stop19" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Template + + + + + + + + + + + + + id="g1" + inkscape:label="Example icon" + style="display:none"> + inkscape:label="main" /> + + - + id="g30" + inkscape:label="Gradient samples" + style="display:none" + transform="translate(-6,-2)"> + + + + + + + style="opacity:1;fill:url(#linearGradient23);fill-opacity:1;stroke:none;stroke-width:2;stroke-dasharray:none;stroke-opacity:1" + id="rect20" + width="14" + height="16" + x="8" + y="48" + ry="0.022097087" + inkscape:label="Scarlet Red" /> + + + - + id="g2" + inkscape:label="Up arrow" + transform="translate(-1.0602643e-7,0.06366303)" + style="display:none"> + d="M 14.400051,49.561876 5.5999492,40.761775 23.199898,23.161825 32,14.313498 40.800102,23.113599 58.400051,40.713549 49.599949,49.51365 32,32 Z" + fill-rule="evenodd" + stroke="#a40000" + stroke-width="3.80732" + fill="#cc0000" + id="path5" + inkscape:label="up" + style="display:inline;fill:#729fcf;stroke:#204a87;stroke-width:2;stroke-dasharray:none;stroke-opacity:1" + sodipodi:nodetypes="ccccccccc" /> + + + + + + + + diff --git a/iconz/adjustAngle.svg b/iconz/adjustAngle.svg index ef6c2bf..b82d0a5 100644 --- a/iconz/adjustAngle.svg +++ b/iconz/adjustAngle.svg @@ -1,291 +1,256 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 90° - - - - - - - \ No newline at end of file + + Quetzal - Adjust Angle + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Adjust Angle + + + + + + + + + + + + + + + + + + + + + + diff --git a/iconz/around.svg b/iconz/around.svg index 32820c2..4430b29 100644 --- a/iconz/around.svg +++ b/iconz/around.svg @@ -1,457 +1,485 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + +Quetzal - Pivot BeamhaseciluFreeCADcommandTemplate file to create icons for FreeCAD commands.2025FreeCAD LGPL2+FreeCAD/src/FreeCADhttps://wiki.freecad.org/ArtworkQuetzal - Pivot Beam diff --git a/iconz/beamFit.svg b/iconz/beamFit.svg index 368a0e1..8720777 100644 --- a/iconz/beamFit.svg +++ b/iconz/beamFit.svg @@ -1,139 +1,581 @@ - + + - - - - - - - - - - - - + + Quetzal - Fit Beam + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Fit Beam + + + + + + + + + + + + + - - + - - + - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/iconz/beamRot.svg b/iconz/beamRot.svg index 667bf2d..30048ee 100644 --- a/iconz/beamRot.svg +++ b/iconz/beamRot.svg @@ -1,223 +1,222 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + Quetzal - Rotate Beam + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Rotate Beam + + + + + + + + + + + + + + + + + + diff --git a/iconz/beamShift.svg b/iconz/beamShift.svg index 0b2ac25..e596cc3 100644 --- a/iconz/beamShift.svg +++ b/iconz/beamShift.svg @@ -1,167 +1,177 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + Quetzal - Shift Beam + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Shift Beam + + + + + + + + + + + + + + + + diff --git a/iconz/beamStretch.svg b/iconz/beamStretch.svg index 74560ab..f50f881 100644 --- a/iconz/beamStretch.svg +++ b/iconz/beamStretch.svg @@ -1,220 +1,195 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + Quetzal - Stretch Beam + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Stretch Beam + + + + + + + + + + + + + + + diff --git a/iconz/edgeAlign.svg b/iconz/edgeAlign.svg index 36a0148..c0c5cf6 100644 --- a/iconz/edgeAlign.svg +++ b/iconz/edgeAlign.svg @@ -1,242 +1,190 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + Template + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Template + + + + + + + + + + + + + + + + + diff --git a/iconz/extend.svg b/iconz/extend.svg index 0d34179..4cb330a 100644 --- a/iconz/extend.svg +++ b/iconz/extend.svg @@ -1,362 +1,214 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + Quetzal - Extend Beam + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Extend Beam + + + + + + + + + + + + + + + + + + + + diff --git a/iconz/flangeAlign.svg b/iconz/flangeAlign.svg index b29ba0f..64e9a24 100644 --- a/iconz/flangeAlign.svg +++ b/iconz/flangeAlign.svg @@ -1,490 +1,163 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + +Quetzal - Align FlangehaseciluFreeCADcommandTemplate file to create icons for FreeCAD commands.2025FreeCAD LGPL2+FreeCAD/src/FreeCADhttps://wiki.freecad.org/ArtworkQuetzal - Align Flange diff --git a/iconz/framebranch.svg b/iconz/framebranch.svg index 8c661b2..4e59005 100644 --- a/iconz/framebranch.svg +++ b/iconz/framebranch.svg @@ -1,648 +1,223 @@ - - - - - - - - - - - - - - + + + + + Quetzal - Frame Branch Manager + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Frame Branch Manager + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/iconz/path.svg b/iconz/path.svg index d27cbb1..5214ad9 100644 --- a/iconz/path.svg +++ b/iconz/path.svg @@ -1,202 +1,168 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + Quetzal - Make Path + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Make Path + + + + + + + + + + + + + + diff --git a/iconz/pipe.svg b/iconz/pipe.svg index 401d5a6..e413715 100644 --- a/iconz/pipe.svg +++ b/iconz/pipe.svg @@ -1,223 +1,658 @@ - + + - - - - - - - - - - - - + + Quetzal - Insert Pipe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Insert Pipe + + + + + + + + + + + + + - - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - \ No newline at end of file + diff --git a/iconz/reverse.svg b/iconz/reverse.svg index b45fb99..def161c 100644 --- a/iconz/reverse.svg +++ b/iconz/reverse.svg @@ -1,313 +1,225 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + Quetzal - Reverse Orientation + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Reverse Orientation + + + + + + + + + + + + + + + + + + diff --git a/iconz/rotjoin.svg b/iconz/rotjoin.svg index 98cafd5..5a639f7 100644 --- a/iconz/rotjoin.svg +++ b/iconz/rotjoin.svg @@ -1,277 +1,160 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +Quetzal - Rotate & Align BeamhaseciluFreeCADcommandTemplate file to create icons for FreeCAD commands.2025FreeCAD LGPL2+FreeCAD/src/FreeCADhttps://wiki.freecad.org/ArtworkQuetzal - Rotate & Align Beam diff --git a/iconz/route.svg b/iconz/route.svg index e2a32ce..c724b48 100644 --- a/iconz/route.svg +++ b/iconz/route.svg @@ -1,434 +1,177 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + Quetzal - Insert Route + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Insert Route + + + + + + + + + + + + + + + diff --git a/iconz/sect.svg b/iconz/sect.svg index ea7dd38..fce37a3 100644 --- a/iconz/sect.svg +++ b/iconz/sect.svg @@ -1,222 +1,178 @@ - + + - - - - - - - - - - - - + + Quetzal - Insert Sections + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Insert Sections + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + From fd1e0f4fcebb7f470d6efecfd5daa8be32c66c53 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Mon, 13 Jan 2025 18:18:08 -0600 Subject: [PATCH 094/135] Use PySide instead of PySide2 --- fFeatures.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fFeatures.py b/fFeatures.py index fadd7c7..02ce381 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -16,9 +16,9 @@ import Part from Arch import makeProfile, makeStructure from Draft import makeCircle -from PySide2.QtCore import * -from PySide2.QtGui import * -from PySide2.QtWidgets import ( +from PySide.QtCore import * +from PySide.QtGui import * +from PySide.QtWidgets import ( QCheckBox, QComboBox, QDialog, From f8fc2a3560596eaa4eb1db1a5697262a3acbee98 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 15 Jan 2025 14:53:12 -0600 Subject: [PATCH 095/135] Normalize tooltips --- CFrame.py | 16 ++++++++-------- CPipe.py | 17 +++++++++++------ CUtils.py | 10 +++++----- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/CFrame.py b/CFrame.py index e079d76..05c1672 100644 --- a/CFrame.py +++ b/CFrame.py @@ -138,7 +138,7 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "flangeAlign.svg" ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_AlignFlange", "alignFlange"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_AlignFlange", "Align flange"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_AlignFlange", "Rotates the section of the beam to make the faces parallel to another face", @@ -176,7 +176,7 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "beamShift.svg" ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_ShiftBeam", "shiftTheBeam"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_ShiftBeam", "Shift the beam"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_ShiftBeam", "Translate objects by vectors defined on existing geometry" ), @@ -290,7 +290,7 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "around.svg" ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_PivotBeam", "pivotTheBeam"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_PivotBeam", "Pivot the beam"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_PivotBeam", "Rotates the beam around an axis (edge or center-of-curvature)" ), @@ -321,7 +321,7 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "beamStretch.svg" ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_StretchBeam", "stretchTheBeam"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_StretchBeam", "Stretch the beam"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_StretchBeam", "Changes the length of the beam, either according a preselected edge or a direct input", @@ -348,7 +348,7 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "extend.svg" ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_Extend", "extendTheBeam"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Extend", "Extend the beam"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_Extend", "Extend the beam either to a face, a vertex or the c.o.m. of the selected object", @@ -373,7 +373,7 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "adjustAngle.svg" ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_AdjustFrameAngle", "adjustFrameAngle"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_AdjustFrameAngle", "Adjust frame angle"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_AdjustFrameAngle", "Adjust the angle of frame by two edges" ), @@ -404,7 +404,7 @@ def GetResources(self): "Pixmap": os.path.join( os.path.dirname(os.path.abspath(__file__)), "iconz", "rotjoin.svg" ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotJoin", "rotJoinEdge"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotJoin", "Rotate join to edge"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_RotJoin", "Rotates and align the beam according another edge" ), @@ -429,7 +429,7 @@ def Activated(self): def GetResources(self): return { "Pixmap": os.path.join(os.path.dirname(os.path.abspath(__file__)), "iconz", "path.svg"), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPath", "insert Path"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPath", "Insert path"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_InsertPath", "Creates one path along selected edges" ), diff --git a/CPipe.py b/CPipe.py index bc018b0..70b4c19 100644 --- a/CPipe.py +++ b/CPipe.py @@ -268,7 +268,7 @@ def GetResources(self): return { "Pixmap": get_icon_path("intersect"), "MenuText": QT_TRANSLATE_NOOP( - "Quetzal_Extend2intersection", "Extends pipes to intersection" + "Quetzal_Extend2intersection", "Extend pipes to intersection" ), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_Extend2intersection", "Extends pipes to intersection" @@ -291,7 +291,7 @@ def GetResources(self): return { "Pixmap": get_icon_path("intersect1"), "MenuText": QT_TRANSLATE_NOOP( - "Quetzal_Extend1intersection", "Extends pipe to intersection" + "Quetzal_Extend1intersection", "Extend pipe to intersection" ), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_Extend1intersection", "Extends pipe to intersection" @@ -364,7 +364,7 @@ def Activated(self): def GetResources(self): return { "Pixmap": get_icon_path("join"), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Join pypes"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Join pipes"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Select the part-pype and the port"), } @@ -403,7 +403,7 @@ def Activated(self): def GetResources(self): return { "Pixmap": get_icon_path("attach"), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_Attach2tube", "Attach to tube"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Attach2tube", "Attach to tube"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_Attach2tube", "Attach one pype to the nearest port of selected pipe" ), @@ -419,8 +419,10 @@ def Activated(self): def GetResources(self): return { "Pixmap": get_icon_path("point2point"), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_Point2point", "draw a tube point-to-point"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Point2point", "Click on subsequent points."), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Point2point", "Draw a tube point by point"), + "ToolTip": QT_TRANSLATE_NOOP( + "Quetzal_Point2point", "A new body is created on each click on subsequent points" + ), } @@ -540,6 +542,9 @@ def GetResources(self): addCommand("Quetzal_PipeQM", pipeQM()) +# Quick Menu section + + class elbowQM: def Activated(self): import dodoPM diff --git a/CUtils.py b/CUtils.py index 8fff148..4b49c69 100644 --- a/CUtils.py +++ b/CUtils.py @@ -27,7 +27,7 @@ def GetResources(self): return { "Pixmap": get_icon_path("query"), "Accel": "Q,M", - "MenuText": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "query the model"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "Query the model"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "Click objects to print infos"), } @@ -55,7 +55,7 @@ def GetResources(self): return { "Pixmap": get_icon_path("grid"), "Accel": "A,W", - "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveWorkPlane", "align Workplane"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveWorkPlane", "Align workplane"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_MoveWorkPlane", "Moves and rotates the drafting workplane with points, edges and faces", @@ -73,7 +73,7 @@ def GetResources(self): return { "Pixmap": get_icon_path("rotWP"), "Accel": "R,W", - "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotateWorkPlane", "rotate Workplane"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotateWorkPlane", "Rotate workplane"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_RotateWorkPlane", "Spin the Draft working plane about one of its axes" ), @@ -106,7 +106,7 @@ def GetResources(self): return { "Pixmap": get_icon_path("offsetWP"), "Accel": "O,W", - "MenuText": QT_TRANSLATE_NOOP("Quetzal_OffsetWorkPlane", "offset Workplane"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_OffsetWorkPlane", "Offset workplane"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_OffsetWorkPlane", "Shifts the WP along its normal." ), @@ -123,7 +123,7 @@ def GetResources(self): return { "Pixmap": get_icon_path("hackedL"), "Accel": "H,L", - "MenuText": QT_TRANSLATE_NOOP("Quetzal_HackedL", "draw a DWire"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_HackedL", "Draw a Draft wire"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_HackedL", "WP is re-positioned at each point. Possible to spin and offset it.", From 0323c9bcca10fef015495f7b02f7a43d052154ea Mon Sep 17 00:00:00 2001 From: hasecilu Date: Mon, 4 Nov 2024 20:01:11 -0600 Subject: [PATCH 096/135] Update WB icon with an actual quetzal* * attempt of quetzal, temporarely --- InitGui.py | 2 +- iconz/dodo.svg | 212 -------------------------------------- iconz/dodo1.svg | 252 ---------------------------------------------- iconz/quetzal.svg | 144 ++++++++++++++++++++++++++ pCmd.py | 4 +- package.xml | 2 +- 6 files changed, 148 insertions(+), 468 deletions(-) delete mode 100644 iconz/dodo.svg delete mode 100644 iconz/dodo1.svg create mode 100644 iconz/quetzal.svg diff --git a/InitGui.py b/InitGui.py index cb3446e..50c207d 100644 --- a/InitGui.py +++ b/InitGui.py @@ -48,7 +48,7 @@ def __init__(self): "Quetzal is the fork of Dodo workbench for FreeCAD. " "Extending Dodo workbench support and adding translation support. ", ) - self.__class__.Icon = os.path.join(ICONPATH, "dodo.svg") + self.__class__.Icon = os.path.join(ICONPATH, "quetzal.svg") try: import DraftSnap diff --git a/iconz/dodo.svg b/iconz/dodo.svg deleted file mode 100644 index 0d2cd46..0000000 --- a/iconz/dodo.svg +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/iconz/dodo1.svg b/iconz/dodo1.svg deleted file mode 100644 index 6e6ff89..0000000 --- a/iconz/dodo1.svg +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/iconz/quetzal.svg b/iconz/quetzal.svg new file mode 100644 index 0000000..96390ea --- /dev/null +++ b/iconz/quetzal.svg @@ -0,0 +1,144 @@ + + + +templatehaseciluFreeCADcommandTemplate file to create icons for FreeCAD commands.2024FreeCAD LGPL2+FreeCAD/src/FreeCADhttps://wiki.freecad.org/Artworktemplate diff --git a/pCmd.py b/pCmd.py index 8d90348..fc6f86f 100644 --- a/pCmd.py +++ b/pCmd.py @@ -135,13 +135,13 @@ class ViewProvider: def __init__(self, obj, icon_fn): obj.Proxy = self self._check_attr() - self.icon_fn = get_icon_path(icon_fn) or get_icon_path("dodo") + self.icon_fn = get_icon_path(icon_fn or "quetzal") def _check_attr(self): """Check for missing attributes.""" if not hasattr(self, "icon_fn"): - setattr(self, "icon_fn", get_icon_path("dodo")) + setattr(self, "icon_fn", get_icon_path("quetzal")) def getIcon(self): """Returns the path to the SVG icon.""" diff --git a/package.xml b/package.xml index fe238ae..248ab46 100644 --- a/package.xml +++ b/package.xml @@ -27,7 +27,7 @@ Riccardo Treu (oddtopus) - iconz/dodo.svg + iconz/quetzal.svg From 2417ae61cb8641426a7b4c11e949a8fb6ffe1adb Mon Sep 17 00:00:00 2001 From: hasecilu Date: Wed, 15 Jan 2025 17:07:54 -0600 Subject: [PATCH 097/135] Don't translate objects' internal name, part 2 Only translate the strings attached to `obj.Label` --- fFeatures.py | 14 ++++++++++++-- fForms.py | 19 +++++++++++-------- pCmd.py | 9 +++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/fFeatures.py b/fFeatures.py index 02ce381..2f23b05 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -1330,8 +1330,7 @@ def doProfile( "doProfile(typeS, label, dims)" if typeS in ["RH", "R", "H", "U", "L", "T", "Z", "omega", "circle"]: profile = [0, "SECTION", label, typeS] + dims # for py2.6 versions - obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython", profile[2]) - obj.Label = translate("Arch", profile[2]) + obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython", profile[2]) # FIXME: if profile[3] == "RH": _ProfileRH(obj, profile) elif profile[3] == "R": @@ -1530,6 +1529,7 @@ class _ProfileRH(_Profile): """A parametric Rectangular hollow beam profile. Profile data: [width, height, thickness]""" def __init__(self, obj, profile): + obj.Label = translate("Objects", "Rectangular hollow", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", @@ -1581,6 +1581,7 @@ class _ProfileR(_Profile): """A parametric Rectangular solid beam profile. Profile data: [width, height]""" def __init__(self, obj, profile): + obj.Label = translate("Objects", "Rectangular solid", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", @@ -1618,6 +1619,7 @@ class _ProfileCircle(_Profile): t1: thickness (optional; "0" for solid section)""" def __init__(self, obj, profile): + obj.Label = translate("Objects", "Circle-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", @@ -1692,6 +1694,7 @@ def execute(self, obj): class _ProfileAngle(_Profile): def __init__(self, obj, profile): self.label = obj.Name + # FIXME: : 'FeaturePython' object has no attribute 'size' self.size = FreeCAD.ActiveDocument.getObject(self.label).size self.standard = FreeCAD.ActiveDocument.getObject(self.label).standard self.Solid = FreeCAD.ActiveDocument.getObject(self.label).Solid @@ -1702,6 +1705,7 @@ def __init__(self, obj, profile): self.sa = ShpstData.angle_ss_unequal[self.size] elif self.standard == "SUS_Equal": self.sa = ShpstData.angle_sus_equal[self.size] + obj.Label = translate("Objects", "L-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", @@ -1759,6 +1763,7 @@ def execute(self, obj): class _ProfileChannel(_Profile): def __init__(self, obj, profile): self.label = obj.Name + # FIXME: : 'FeaturePython' object has no attribute 'size' self.size = FreeCAD.ActiveDocument.getObject(self.label).size self.standard = FreeCAD.ActiveDocument.getObject(self.label).standard Solid = FreeCAD.ActiveDocument.getObject(self.label).Solid @@ -1771,6 +1776,7 @@ def __init__(self, obj, profile): self.self.sa = ShpstData.channel_sus[self.size] self.s0 = 0 self.t2 = float(self.sa[2]) + obj.Label = translate("Objects", "U-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", @@ -1830,6 +1836,7 @@ class _ProfileT(_Profile): """A parametric T beam profile. Profile data: [width, height, web thickness]""" def __init__(self, obj, profile): + obj.Label = translate("Objects", "T-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", @@ -1871,6 +1878,7 @@ class _ProfileZ(_Profile): """A parametric Z beam profile. Profile data: [width, height, web thickness, flange thickness]""" def __init__(self, obj, profile): + obj.Label = translate("Objects", "Z-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", @@ -1912,6 +1920,7 @@ class _ProfileOmega(_Profile): """A parametric omega beam profile. Profile data: [W, H, D, t1,t2,t3]""" def __init__(self, obj, profile): + obj.Label = translate("Objects", "Omega-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", @@ -1972,6 +1981,7 @@ class _ProfileH(_Profile): """A parametric omega beam profile. Profile data: [W, H, D, t1,t2,t3]""" def __init__(self, obj, profile): + obj.Label = translate("Objects", "H-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", "FType", diff --git a/fForms.py b/fForms.py index fd3add3..2485638 100644 --- a/fForms.py +++ b/fForms.py @@ -525,38 +525,41 @@ def __init__(self): # TODO: translation def setProfile(self, typeS): + # NOTE: the self.label is used on the `addObject()` method as therefore is assigned + # tot the internal name of the object, to translate the label is needed to + # assign the translated string to `obj.Label`. if typeS == "square": self.form.labImg.setPixmap(pixSquare) self.type = "R" - self.label = translate("profEdit", "Square", "Profile name in the Tree View") + self.label = "Square" elif typeS == "T": self.form.labImg.setPixmap(pixT) self.type = "T" - self.label = translate("profEdit", "T-profile", "Profile name in the Tree View") + self.label = "T-profile" elif typeS == "U": self.form.labImg.setPixmap(pixU) self.type = "U" - self.label = translate("profEdit", "U-profile", "Profile name in the Tree View") + self.label = "U-profile" elif typeS == "H": self.form.labImg.setPixmap(pixH) self.type = "H" - self.label = translate("profEdit", "H-profile", "Profile name in the Tree View") + self.label = "H-profile" elif typeS == "L": self.form.labImg.setPixmap(pixL) self.type = "L" - self.label = translate("profEdit", "L-profile", "Profile name in the Tree View") + self.label = "L-profile" elif typeS == "Z": self.form.labImg.setPixmap(pixZ) self.type = "Z" - self.label = translate("profEdit", "Z-profile", "Profile name in the Tree View") + self.label = "Z-profile" elif typeS == "omega": self.form.labImg.setPixmap(pixOmega) self.type = "omega" - self.label = translate("profEdit", "Omega-profile", "Profile name in the Tree View") + self.label = "Omega-profile" elif typeS == "circle": self.form.labImg.setPixmap(pixCircle) self.type = "circle" - self.label = translate("profEdit", "Circle-profile", "Profile name in the Tree View") + self.label = "Circle-profile" def accept(self): D, H, B, t1, t2, t3 = ( diff --git a/pCmd.py b/pCmd.py index fc6f86f..e66f95d 100644 --- a/pCmd.py +++ b/pCmd.py @@ -184,6 +184,7 @@ def makePipe(propList=[], pos=None, Z=None): a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + a.Label = translate("Objects", "Tube") return a @@ -271,6 +272,7 @@ def makeElbow(propList=[], pos=None, Z=None): rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) # rot=FreeCAD.Rotation(FreeCAD.Vector(0,-1,0),Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + a.Label = translate("Objects", "Elbow") return a @@ -466,6 +468,7 @@ def makeFlange(propList=[], pos=None, Z=None): FreeCAD.Placement(FreeCAD.Vector(0, 0, zpos), FreeCAD.Rotation(1, 0, 0)) ) FreeCAD.ActiveDocument.recompute() + a.Label = translate("Objects", "Flange") return a @@ -566,6 +569,7 @@ def makeReduct(propList=[], pos=None, Z=None, conc=True): a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + a.Label = translate("Objects", "Reduct") return a @@ -595,6 +599,7 @@ def makeUbolt(propList=[], pos=None, Z=None): a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + a.Label = translate("Objects", "U-Bolt") return a @@ -614,6 +619,7 @@ def makeShell(L=1000, W=1500, H=1500, thk1=6, thk2=8): a.ViewObject.ShapeColor = 0.0, 0.0, 1.0 a.ViewObject.Transparency = 85 FreeCAD.ActiveDocument.recompute() + a.Label = translate("Objects", "Tank") return a @@ -642,6 +648,7 @@ def makeCap(propList=[], pos=None, Z=None): a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + a.Label = translate("Objects", "Cap") return a @@ -1250,6 +1257,7 @@ def makeValve(propList=[], pos=None, Z=None): a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + a.Label = translate("Objects", "Valve") return a @@ -1428,6 +1436,7 @@ def makeRoute(n=Z): curvedEdges = [e for e in fCmd.edges() if e.curvatureAt(0) != 0] if curvedEdges: s = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject", "pipeRoute") + s.Label = translate("Objects", "Pipe route") s.MapMode = "SectionOfRevolution" sup = fCmd.edgeName() s.AttachmentSupport = [sup] From f5b2ba74c4563e179be04d497dcf20365890d15e Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 16 Jan 2025 10:23:04 -0600 Subject: [PATCH 098/135] Update some icons, part 4 Some icons were taken from: https://forum.freecad.org/viewtopic.php?f=34&t=55223 and reworked a little bit. --- iconz/attach.svg | 619 +++++++------------ iconz/beamFit.svg | 2 +- iconz/beamLevel.svg | 410 ++++++------- iconz/branch.svg | 744 +++++++--------------- iconz/break.svg | 963 ++++++++++++++++++++--------- iconz/flat.svg | 623 ++++++++----------- iconz/header.svg | 1365 +++++++++++++++++++++++------------------ iconz/intersect.svg | 497 +++++++-------- iconz/intersect1.svg | 671 +++++++------------- iconz/laydown.svg | 611 ++++++++---------- iconz/mate.svg | 509 ++++++++------- iconz/pipe.svg | 587 +++--------------- iconz/point2point.svg | 1014 +++++++++++++++++------------- iconz/pypeline.svg | 1076 +++++++++++++++++--------------- iconz/raiseup.svg | 651 ++++++++------------ iconz/tank.svg | 1109 +++++++-------------------------- 16 files changed, 5030 insertions(+), 6421 deletions(-) diff --git a/iconz/attach.svg b/iconz/attach.svg index 950ef3f..e2eecaa 100644 --- a/iconz/attach.svg +++ b/iconz/attach.svg @@ -1,384 +1,235 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + +Quetzal - Attach to Tube + + + + + + + + + + + + + + + + + + + + haseciluFreeCADcommandTemplate file to create icons for FreeCAD commands.2025FreeCAD LGPL2+FreeCAD/src/FreeCADhttps://wiki.freecad.org/ArtworkQuetzal - Attach to Tube diff --git a/iconz/beamFit.svg b/iconz/beamFit.svg index 8720777..3db29b4 100644 --- a/iconz/beamFit.svg +++ b/iconz/beamFit.svg @@ -569,7 +569,7 @@ d="m 6.3580999,12.202549 v 3.788968 H 11.420563 V 28.169169 H 6.3580999 v 3.788972 H 20.468252 V 28.169169 H 15.405793 V 15.991517 h 5.062459 v -3.788968 z" /> + + - - - - - - - - - - - - + + Quetzal - Level Beam + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Level Beam + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/iconz/branch.svg b/iconz/branch.svg index 8a0710a..d42ee53 100644 --- a/iconz/branch.svg +++ b/iconz/branch.svg @@ -1,528 +1,216 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + Quetzal - Insert Branch + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Insert Branch + + + + + + + + + + + + + + + + + diff --git a/iconz/break.svg b/iconz/break.svg index 67d682f..1e3bf85 100644 --- a/iconz/break.svg +++ b/iconz/break.svg @@ -1,287 +1,684 @@ - + + - - - - - - - - - - - - + + Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Template + + + + + + + + + + + + + - - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iconz/flat.svg b/iconz/flat.svg index 6646231..2f57b7b 100644 --- a/iconz/flat.svg +++ b/iconz/flat.svg @@ -1,384 +1,243 @@ - - - - - - - - - - - - - - + + + + + Quetzal - Flat + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Flat + + + + + + + + + + + + + + + - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/iconz/header.svg b/iconz/header.svg index 16cbd2f..bb9dbe2 100644 --- a/iconz/header.svg +++ b/iconz/header.svg @@ -1,593 +1,782 @@ - - - - - - - - - - - - - - - - - + + + + + Quetzal - Header + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Header + + + + + + + + + + + + + - - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - \ No newline at end of file + diff --git a/iconz/intersect.svg b/iconz/intersect.svg index adeefc7..944beb4 100644 --- a/iconz/intersect.svg +++ b/iconz/intersect.svg @@ -1,284 +1,215 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + Quetzal - Intersect 2 + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Intersect 2 + + + + + + + + + + + + + + + + + + + + + + diff --git a/iconz/intersect1.svg b/iconz/intersect1.svg index 3852d54..a19cc2c 100644 --- a/iconz/intersect1.svg +++ b/iconz/intersect1.svg @@ -1,466 +1,207 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + Quetzal - Intersect 1 + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Intersect 1 + + + + + + + + + + + + + + + + + + + + + diff --git a/iconz/laydown.svg b/iconz/laydown.svg index 9a92957..5790a01 100644 --- a/iconz/laydown.svg +++ b/iconz/laydown.svg @@ -1,353 +1,264 @@ - + + - - - - - - - - - - - - + + Quetzal - Raise Support + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Raise Support + + + + + + + + + + + + + + + + + + + - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + diff --git a/iconz/mate.svg b/iconz/mate.svg index d7ddd01..28e0519 100644 --- a/iconz/mate.svg +++ b/iconz/mate.svg @@ -1,269 +1,246 @@ - + + - - - - - - - - - - - - + + Quetzal - Mate Edges + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Mate Edges + + + + + + + + + + + + + + + + - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + diff --git a/iconz/pipe.svg b/iconz/pipe.svg index e413715..ae90a4d 100644 --- a/iconz/pipe.svg +++ b/iconz/pipe.svg @@ -11,7 +11,6 @@ sodipodi:docname="pipe.svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" @@ -30,10 +29,10 @@ inkscape:deskcolor="#191919" inkscape:document-units="px" showgrid="true" - inkscape:zoom="5.656854" - inkscape:cx="11.402097" - inkscape:cy="-5.2149127" - inkscape:window-width="1290" + inkscape:zoom="11.313708" + inkscape:cx="37.25569" + inkscape:cy="32.217554" + inkscape:window-width="1894" inkscape:window-height="999" inkscape:window-x="0" inkscape:window-y="0" @@ -103,256 +102,7 @@ inkscape:color="rgb(255,255,0)" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="defs1" /> @@ -406,253 +156,106 @@ + + + - + + style="fill:#babdb6;fill-opacity:1;stroke:#2e3436;stroke-width:18.0489;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1" + width="258.01907" + height="54.768028" + x="239.07593" + y="715.59937" /> + style="fill:#babdb6;fill-opacity:1;stroke:#2e3436;stroke-width:20.8939;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect2" + width="70.789925" + height="57.622242" + x="523.18933" + y="714.05591" /> + style="fill:#babdb6;fill-opacity:1;stroke:#2e3436;stroke-width:20.4323;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3" + width="330.6622" + height="54.768028" + x="639.16107" + y="715.00702" /> + style="fill:#babdb6;fill-opacity:1;stroke:#2e3436;stroke-width:24.2176;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect4" + width="100.92338" + height="54.298645" + x="1011.5822" + y="713.7937" /> - - - - - - - - - - - - - - - - - - - - + style="fill:#babdb6;fill-opacity:1;stroke:#2e3436;stroke-width:16.82;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect5" + width="205.70102" + height="59.660999" + x="1152.5133" + y="708.8327" /> diff --git a/iconz/point2point.svg b/iconz/point2point.svg index 769551b..f233e89 100644 --- a/iconz/point2point.svg +++ b/iconz/point2point.svg @@ -1,438 +1,576 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + +Quetzal - Point to Point + + + + + + + + + + + + + + + + + + + + haseciluFreeCADcommandTemplate file to create icons for FreeCAD commands.2025FreeCAD LGPL2+FreeCAD/src/FreeCADhttps://wiki.freecad.org/ArtworkQuetzal - Point to Point diff --git a/iconz/pypeline.svg b/iconz/pypeline.svg index e9d39d7..39e76d8 100644 --- a/iconz/pypeline.svg +++ b/iconz/pypeline.svg @@ -1,485 +1,601 @@ - + + - - - - - - - - - - - - + + Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Template + + + + + + + + + + + + + - - + - - + - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/iconz/raiseup.svg b/iconz/raiseup.svg index ce903b8..933f03d 100644 --- a/iconz/raiseup.svg +++ b/iconz/raiseup.svg @@ -1,392 +1,265 @@ - + + - - - - - - - - - - - - + + Quetzal - Raise Support + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Raise Support + + + + + + + + + + + + + + + + + + + - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + diff --git a/iconz/tank.svg b/iconz/tank.svg index 20ca00c..dbd340d 100644 --- a/iconz/tank.svg +++ b/iconz/tank.svg @@ -1,872 +1,237 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + Quetzal - Tank + + + + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2025 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + Quetzal - Tank + + + + + + + + + + + + + + + + + + + From d7d420554b9aa70c2e0121227578ce80ee404265 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Thu, 16 Jan 2025 14:04:09 -0600 Subject: [PATCH 099/135] Rename icons and add them to FreeCAD resources path - Move icons to FreeCAD's icon list to make them available for PieMenu - Rename icons to prevent clash with other Wb's icons - Some commands were renamed to be more explicit on what they do --- CFrame.py | 74 +++++---------- CPipe.py | 90 +++++++++---------- CUtils.py | 32 +++---- InitGui.py | 23 ++--- cut_list/cut_list_commands.py | 3 +- fFeatures.py | 4 +- ...Angle.svg => Quetzal_AdjustFrameAngle.svg} | 0 .../{edgeAlign.svg => Quetzal_AlignEdge.svg} | 0 ...langeAlign.svg => Quetzal_AlignFlange.svg} | 0 iconz/{attach.svg => Quetzal_Attach2Tube.svg} | 0 iconz/{break.svg => Quetzal_BreakPipe.svg} | 0 .../Quetzal_CreateCutList.svg | 0 iconz/{extend.svg => Quetzal_ExtendBeam.svg} | 0 ...t1.svg => Quetzal_ExtendIntersection1.svg} | 0 ...ct.svg => Quetzal_ExtendIntersection2.svg} | 0 iconz/{flat.svg => Quetzal_Flat.svg} | 0 ...nch.svg => Quetzal_FrameBranchManager.svg} | 0 iconz/{beamFit.svg => Quetzal_FrameIt.svg} | 0 iconz/{hackedL.svg => Quetzal_HackedLine.svg} | 0 ...nyZhape.svg => Quetzal_InsertAnyShape.svg} | 0 .../{branch.svg => Quetzal_InsertBranch.svg} | 0 iconz/{cap.svg => Quetzal_InsertCap.svg} | 10 +-- iconz/{elbow.svg => Quetzal_InsertElbow.svg} | 47 +++++++--- .../{flange.svg => Quetzal_InsertFlange.svg} | 0 iconz/{path.svg => Quetzal_InsertPath.svg} | 0 iconz/{pipe.svg => Quetzal_InsertPipe.svg} | 0 ...ypeline.svg => Quetzal_InsertPypeLine.svg} | 0 .../{reduct.svg => Quetzal_InsertReduct.svg} | 0 iconz/{route.svg => Quetzal_InsertRoute.svg} | 0 iconz/{sect.svg => Quetzal_InsertSection.svg} | 0 iconz/{tank.svg => Quetzal_InsertTank.svg} | 0 iconz/{clamp.svg => Quetzal_InsertUBolt.svg} | 0 iconz/{valve.svg => Quetzal_InsertValve.svg} | 0 iconz/{join.svg => Quetzal_JoinPype.svg} | 0 iconz/{laydown.svg => Quetzal_Laydown.svg} | 0 .../{beamLevel.svg => Quetzal_LevelBeam.svg} | 0 iconz/{header.svg => Quetzal_MakeHeader.svg} | 0 iconz/{mate.svg => Quetzal_MateEdges.svg} | 0 ...{moveHandle.svg => Quetzal_MoveHandle.svg} | 0 iconz/{grid.svg => Quetzal_MoveWorkPlane.svg} | 0 ...fsetWP.svg => Quetzal_OffsetWorkPlane.svg} | 24 ++--- iconz/{around.svg => Quetzal_PivotBeam.svg} | 0 ...oint2point.svg => Quetzal_Point2Point.svg} | 0 ...svg => Quetzal_PressureLossCalculator.svg} | 0 iconz/{query.svg => Quetzal_QueryModel.svg} | 0 iconz/{raiseup.svg => Quetzal_Raiseup.svg} | 0 .../{reverse.svg => Quetzal_ReverseBeam.svg} | 0 iconz/{rotjoin.svg => Quetzal_RotateJoin.svg} | 0 ...{rotWP.svg => Quetzal_RotateWorkPlane.svg} | 0 .../{solids.svg => Quetzal_SelectSolids.svg} | 0 .../{beamShift.svg => Quetzal_ShiftBeam.svg} | 0 .../{beamRot.svg => Quetzal_SpinSection.svg} | 0 ...eamStretch.svg => Quetzal_StretchBeam.svg} | 0 pCmd.py | 16 ++-- pFeatures.py | 8 +- 55 files changed, 164 insertions(+), 167 deletions(-) rename iconz/{adjustAngle.svg => Quetzal_AdjustFrameAngle.svg} (100%) rename iconz/{edgeAlign.svg => Quetzal_AlignEdge.svg} (100%) rename iconz/{flangeAlign.svg => Quetzal_AlignFlange.svg} (100%) rename iconz/{attach.svg => Quetzal_Attach2Tube.svg} (100%) rename iconz/{break.svg => Quetzal_BreakPipe.svg} (100%) rename cut_list/resources/cut_list_icon.svg => iconz/Quetzal_CreateCutList.svg (100%) rename iconz/{extend.svg => Quetzal_ExtendBeam.svg} (100%) rename iconz/{intersect1.svg => Quetzal_ExtendIntersection1.svg} (100%) rename iconz/{intersect.svg => Quetzal_ExtendIntersection2.svg} (100%) rename iconz/{flat.svg => Quetzal_Flat.svg} (100%) rename iconz/{framebranch.svg => Quetzal_FrameBranchManager.svg} (100%) rename iconz/{beamFit.svg => Quetzal_FrameIt.svg} (100%) rename iconz/{hackedL.svg => Quetzal_HackedLine.svg} (100%) rename iconz/{insertAnyZhape.svg => Quetzal_InsertAnyShape.svg} (100%) rename iconz/{branch.svg => Quetzal_InsertBranch.svg} (100%) rename iconz/{cap.svg => Quetzal_InsertCap.svg} (95%) rename iconz/{elbow.svg => Quetzal_InsertElbow.svg} (63%) rename iconz/{flange.svg => Quetzal_InsertFlange.svg} (100%) rename iconz/{path.svg => Quetzal_InsertPath.svg} (100%) rename iconz/{pipe.svg => Quetzal_InsertPipe.svg} (100%) rename iconz/{pypeline.svg => Quetzal_InsertPypeLine.svg} (100%) rename iconz/{reduct.svg => Quetzal_InsertReduct.svg} (100%) rename iconz/{route.svg => Quetzal_InsertRoute.svg} (100%) rename iconz/{sect.svg => Quetzal_InsertSection.svg} (100%) rename iconz/{tank.svg => Quetzal_InsertTank.svg} (100%) rename iconz/{clamp.svg => Quetzal_InsertUBolt.svg} (100%) rename iconz/{valve.svg => Quetzal_InsertValve.svg} (100%) rename iconz/{join.svg => Quetzal_JoinPype.svg} (100%) rename iconz/{laydown.svg => Quetzal_Laydown.svg} (100%) rename iconz/{beamLevel.svg => Quetzal_LevelBeam.svg} (100%) rename iconz/{header.svg => Quetzal_MakeHeader.svg} (100%) rename iconz/{mate.svg => Quetzal_MateEdges.svg} (100%) rename iconz/{moveHandle.svg => Quetzal_MoveHandle.svg} (100%) rename iconz/{grid.svg => Quetzal_MoveWorkPlane.svg} (100%) rename iconz/{offsetWP.svg => Quetzal_OffsetWorkPlane.svg} (95%) rename iconz/{around.svg => Quetzal_PivotBeam.svg} (100%) rename iconz/{point2point.svg => Quetzal_Point2Point.svg} (100%) rename iconz/{delta.svg => Quetzal_PressureLossCalculator.svg} (100%) rename iconz/{query.svg => Quetzal_QueryModel.svg} (100%) rename iconz/{raiseup.svg => Quetzal_Raiseup.svg} (100%) rename iconz/{reverse.svg => Quetzal_ReverseBeam.svg} (100%) rename iconz/{rotjoin.svg => Quetzal_RotateJoin.svg} (100%) rename iconz/{rotWP.svg => Quetzal_RotateWorkPlane.svg} (100%) rename iconz/{solids.svg => Quetzal_SelectSolids.svg} (100%) rename iconz/{beamShift.svg => Quetzal_ShiftBeam.svg} (100%) rename iconz/{beamRot.svg => Quetzal_SpinSection.svg} (100%) rename iconz/{beamStretch.svg => Quetzal_StretchBeam.svg} (100%) diff --git a/CFrame.py b/CFrame.py index 05c1672..2d0d958 100644 --- a/CFrame.py +++ b/CFrame.py @@ -37,9 +37,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "beamFit.svg" - ), + "Pixmap": "Quetzal_FrameIt", "MenuText": QT_TRANSLATE_NOOP("Quetzal_FrameIt", "Place one-beam over one-edge"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_FrameIt", "Place one beam after the other over the edges" @@ -64,12 +62,10 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "beamRot.svg" - ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_SpinSect", "Spin beams by 45 deg."), + "Pixmap": "Quetzal_SpinSection", + "MenuText": QT_TRANSLATE_NOOP("Quetzal_SpinSection", "Spin beams by 45 deg."), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_SpinSect", "Rotates the section of the beam by 45 degrees" + "Quetzal_SpinSection", "Rotates the section of the beam by 45 degrees" ), } @@ -93,9 +89,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "reverse.svg" - ), + "Pixmap": "Quetzal_ReverseBeam", "MenuText": QT_TRANSLATE_NOOP("Quetzal_ReverseBeam", "Reverse orientation"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_ReverseBeam", "Reverse the orientation of selected objects" @@ -135,9 +129,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "flangeAlign.svg" - ), + "Pixmap": "Quetzal_AlignFlange", "MenuText": QT_TRANSLATE_NOOP("Quetzal_AlignFlange", "Align flange"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_AlignFlange", @@ -173,9 +165,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "beamShift.svg" - ), + "Pixmap": "Quetzal_ShiftBeam", "MenuText": QT_TRANSLATE_NOOP("Quetzal_ShiftBeam", "Shift the beam"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_ShiftBeam", "Translate objects by vectors defined on existing geometry" @@ -216,9 +206,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "beamLevel.svg" - ), + "Pixmap": "Quetzal_LevelBeam", "MenuText": QT_TRANSLATE_NOOP("Quetzal_LevelBeam", "Flush the surfaces"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_LevelBeam", @@ -260,9 +248,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "edgeAlign.svg" - ), + "Pixmap": "Quetzal_AlignEdge", "MenuText": QT_TRANSLATE_NOOP("Quetzal_AlignEdge", "Mate the edges"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_AlignEdge", "Join two edges: select two or pre-select several" @@ -287,9 +273,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "around.svg" - ), + "Pixmap": "Quetzal_PivotBeam", "MenuText": QT_TRANSLATE_NOOP("Quetzal_PivotBeam", "Pivot the beam"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_PivotBeam", "Rotates the beam around an axis (edge or center-of-curvature)" @@ -318,9 +302,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "beamStretch.svg" - ), + "Pixmap": "Quetzal_StretchBeam", "MenuText": QT_TRANSLATE_NOOP("Quetzal_StretchBeam", "Stretch the beam"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_StretchBeam", @@ -345,12 +327,10 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "extend.svg" - ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_Extend", "Extend the beam"), + "Pixmap": "Quetzal_ExtendBeam", + "MenuText": QT_TRANSLATE_NOOP("Quetzal_ExtendBeam", "Extend the beam"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_Extend", + "Quetzal_ExtendBeam", "Extend the beam either to a face, a vertex or the c.o.m. of the selected object", ), } @@ -370,9 +350,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "adjustAngle.svg" - ), + "Pixmap": "Quetzal_AdjustFrameAngle", "MenuText": QT_TRANSLATE_NOOP("Quetzal_AdjustFrameAngle", "Adjust frame angle"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_AdjustFrameAngle", "Adjust the angle of frame by two edges" @@ -401,12 +379,10 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "rotjoin.svg" - ), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotJoin", "Rotate join to edge"), + "Pixmap": "Quetzal_RotateJoin", + "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotateJoin", "Rotate join to edge"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_RotJoin", "Rotates and align the beam according another edge" + "Quetzal_RotateJoin", "Rotates and align the beam according another edge" ), } @@ -428,7 +404,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join(os.path.dirname(os.path.abspath(__file__)), "iconz", "path.svg"), + "Pixmap": "Quetzal_InsertPath", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPath", "Insert path"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_InsertPath", "Creates one path along selected edges" @@ -492,9 +468,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join( - os.path.dirname(os.path.abspath(__file__)), "iconz", "framebranch.svg" - ), + "Pixmap": "Quetzal_FrameBranchManager", "MenuText": QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager", "FrameBranch Manager"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager", "Open FrameBranch Manager"), } @@ -513,7 +487,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": os.path.join(os.path.dirname(os.path.abspath(__file__)), "iconz", "sect.svg"), + "Pixmap": "Quetzal_InsertSection", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertSection", "Insert sections"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_InsertSection", "Creates customized beam profiles 2D" @@ -525,7 +499,7 @@ def GetResources(self): # Adds the commands to the FreeCAD command manager # --------------------------------------------------------------------------- addCommand("Quetzal_FrameIt", frameIt()) -addCommand("Quetzal_SpinSect", spinSect()) +addCommand("Quetzal_SpinSection", spinSect()) addCommand("Quetzal_ReverseBeam", reverseBeam()) # addCommand('fillFrame',fillFrame()) addCommand("Quetzal_AlignFlange", alignFlange()) @@ -534,9 +508,9 @@ def GetResources(self): addCommand("Quetzal_AlignEdge", alignEdge()) addCommand("Quetzal_PivotBeam", pivotBeam()) addCommand("Quetzal_StretchBeam", stretchBeam()) -addCommand("Quetzal_Extend", extend()) +addCommand("Quetzal_ExtendBeam", extend()) addCommand("Quetzal_AdjustFrameAngle", adjustFrameAngle()) -addCommand("Quetzal_RotJoin", rotJoin()) +addCommand("Quetzal_RotateJoin", rotJoin()) addCommand("Quetzal_InsertPath", insertPath()) # addCommand('FrameLineManager',FrameLineManager()) addCommand("Quetzal_InsertSection", insertSection()) diff --git a/CPipe.py b/CPipe.py index 70b4c19..ad3c9ab 100644 --- a/CPipe.py +++ b/CPipe.py @@ -9,7 +9,7 @@ import FreeCAD import FreeCADGui -from quetzal_config import addCommand, get_icon_path +from quetzal_config import addCommand QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP translate = FreeCAD.Qt.translate @@ -48,7 +48,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("pipe"), + "Pixmap": "Quetzal_InsertPipe", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", "Insert a tube"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", "Insert a tube"), } @@ -68,7 +68,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("elbow"), + "Pixmap": "Quetzal_InsertElbow", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a curve"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a curve"), } @@ -88,7 +88,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("reduct"), + "Pixmap": "Quetzal_InsertReduct", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertReduct", "Insert a reduction"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertReduct", "Insert a reduction"), } @@ -108,7 +108,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("cap"), + "Pixmap": "Quetzal_InsertCap", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertCap", "Insert a cap"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertCap", "Insert a cap"), } @@ -128,7 +128,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("flange"), + "Pixmap": "Quetzal_InsertFlange", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertFlange", "Insert a flange"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertFlange", "Insert a flange"), } @@ -148,7 +148,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("clamp"), + "Pixmap": "Quetzal_InsertUBolt", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertUbolt", "Insert a U-bolt"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertUbolt", "Insert a U-bolt"), } @@ -168,7 +168,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("pypeline"), + "Pixmap": "Quetzal_InsertPypeLine", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPypeLine", "PypeLine Manager"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertPypeLine", "Open PypeLine Manager"), } @@ -189,7 +189,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("branch"), + "Pixmap": "Quetzal_InsertBranch", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertBranch", "Insert a branch"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertBranch", "Insert a PypeBranch"), } @@ -209,7 +209,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("break"), + "Pixmap": "Quetzal_BreakPipe", "MenuText": QT_TRANSLATE_NOOP("Quetzal_BreakPipe", "Break the pipe"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_BreakPipe", "Break one pipe at point and insert gap" @@ -228,8 +228,8 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("mate"), "Accel": "M,E", + "Pixmap": "Quetzal_MateEdges", "MenuText": QT_TRANSLATE_NOOP("Quetzal_MateEdges", "Mate pipes edges"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_MateEdges", "Mate two terminations through their edges" @@ -245,7 +245,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("flat"), + "Pixmap": "Quetzal_Flat", "MenuText": QT_TRANSLATE_NOOP("Quetzal_Flat", "Fit one elbow"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_Flat", "Place the elbow between two pipes or beams" @@ -266,12 +266,12 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("intersect"), + "Pixmap": "Quetzal_ExtendIntersection2", "MenuText": QT_TRANSLATE_NOOP( - "Quetzal_Extend2intersection", "Extend pipes to intersection" + "Quetzal_ExtendIntersection2", "Extend pipes to intersection" ), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_Extend2intersection", "Extends pipes to intersection" + "Quetzal_ExtendIntersection2", "Extends pipes to intersection" ), } @@ -289,12 +289,12 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("intersect1"), + "Pixmap": "Quetzal_ExtendIntersection1", "MenuText": QT_TRANSLATE_NOOP( - "Quetzal_Extend1intersection", "Extend pipe to intersection" + "Quetzal_ExtendIntersection1", "Extend pipe to intersection" ), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_Extend1intersection", "Extends pipe to intersection" + "Quetzal_ExtendIntersection1", "Extends pipe to intersection" ), } @@ -315,7 +315,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("laydown"), + "Pixmap": "Quetzal_Laydown", "MenuText": QT_TRANSLATE_NOOP("Quetzal_Laydown", "Lay-down the pipe"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_Laydown", "Lay-down the pipe on the support plane" @@ -345,7 +345,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("raiseup"), + "Pixmap": "Quetzal_Raiseup", "MenuText": QT_TRANSLATE_NOOP("Quetzal_Raiseup", "Raise-up the support"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_Raiseup", "Raise the support to the pipe"), } @@ -363,7 +363,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("join"), + "Pixmap": "Quetzal_JoinPype", "MenuText": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Join pipes"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_JoinPype", "Select the part-pype and the port"), } @@ -385,7 +385,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("valve"), + "Pixmap": "Quetzal_InsertValve", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertValve", "Insert a valve"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertValve", "Insert a valve"), } @@ -402,10 +402,10 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("attach"), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_Attach2tube", "Attach to tube"), + "Pixmap": "Quetzal_Attach2Tube", + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Attach2Tube", "Attach to tube"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_Attach2tube", "Attach one pype to the nearest port of selected pipe" + "Quetzal_Attach2Tube", "Attach one pype to the nearest port of selected pipe" ), } @@ -418,10 +418,10 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("point2point"), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_Point2point", "Draw a tube point by point"), + "Pixmap": "Quetzal_Point2Point", + "MenuText": QT_TRANSLATE_NOOP("Quetzal_Point2Point", "Draw a tube point by point"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_Point2point", "A new body is created on each click on subsequent points" + "Quetzal_Point2Point", "A new body is created on each click on subsequent points" ), } @@ -438,9 +438,9 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("insertAnyZhape"), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertAnyz", "Insert any shape"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertAnyz", "Insert a STEP, IGES or BREP"), + "Pixmap": "Quetzal_InsertAnyShape", + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertAnyShape", "Insert any shape"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertAnyShape", "Insert a STEP, IGES or BREP"), } @@ -453,7 +453,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("tank"), + "Pixmap": "Quetzal_InsertTank", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertTank", "Insert a tank"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertTank", "Create tank and nozzles"), } @@ -468,7 +468,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("route"), + "Pixmap": "Quetzal_InsertRoute", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertRoute", "Insert a pipe route"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_InsertRoute", "Create a sketch attached to a circular edge" @@ -487,7 +487,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("header"), + "Pixmap": "Quetzal_MakeHeader", "MenuText": QT_TRANSLATE_NOOP("Quetzal_MakeHeader", "Connect to header"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_MakeHeader", @@ -505,7 +505,7 @@ def GetResources(self): addCommand("Quetzal_InsertCap", insertCap()) addCommand("Quetzal_InsertValve", insertValve()) addCommand("Quetzal_InsertFlange", insertFlange()) -addCommand("Quetzal_InsertUbolt", insertUbolt()) +addCommand("Quetzal_InsertUBolt", insertUbolt()) addCommand("Quetzal_InsertPypeLine", insertPypeLine()) addCommand("Quetzal_InsertBranch", insertBranch()) addCommand("Quetzal_InsertTank", insertTank()) @@ -513,14 +513,14 @@ def GetResources(self): addCommand("Quetzal_BreakPipe", breakPipe()) addCommand("Quetzal_MateEdges", mateEdges()) addCommand("Quetzal_JoinPype", joinPype()) -addCommand("Quetzal_Attach2tube", attach2tube()) +addCommand("Quetzal_Attach2Tube", attach2tube()) addCommand("Quetzal_Flat", flat()) -addCommand("Quetzal_Extend2intersection", extend2intersection()) -addCommand("Quetzal_Extend1intersection", extend1intersection()) +addCommand("Quetzal_ExtendIntersection2", extend2intersection()) +addCommand("Quetzal_ExtendIntersection1", extend1intersection()) addCommand("Quetzal_Laydown", laydown()) addCommand("Quetzal_Raiseup", raiseup()) -addCommand("Quetzal_Point2point", point2point()) -addCommand("Quetzal_InsertAnyz", insertAnyz()) +addCommand("Quetzal_Point2Point", point2point()) +addCommand("Quetzal_InsertAnyShape", insertAnyz()) addCommand("Quetzal_MakeHeader", makeHeader()) @@ -534,7 +534,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("pipe"), + "Pixmap": "Quetzal_InsertPipe", "MenuText": QT_TRANSLATE_NOOP("Quetzal_PipeQM", "QM for pipes"), } @@ -553,7 +553,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("elbow"), + "Pixmap": "Quetzal_InsertElbow", "MenuText": QT_TRANSLATE_NOOP("Quetzal_ElbowQM", "QM for elbows"), } @@ -569,7 +569,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("flange"), + "Pixmap": "Quetzal_InsertFlange", "MenuText": QT_TRANSLATE_NOOP("Quetzal_FlangeQM", "QM for flanges"), } @@ -585,7 +585,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("valve"), + "Pixmap": "Quetzal_InsertValve", "MenuText": QT_TRANSLATE_NOOP("Quetzal_ValveQM", "QM for valves"), } @@ -601,7 +601,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("cap"), + "Pixmap": "Quetzal_InsertCap", "MenuText": QT_TRANSLATE_NOOP("Quetzal_CapQM", "QM for caps"), } diff --git a/CUtils.py b/CUtils.py index 4b49c69..0c45280 100644 --- a/CUtils.py +++ b/CUtils.py @@ -7,7 +7,7 @@ import FreeCAD import FreeCADGui -from quetzal_config import addCommand, get_icon_path +from quetzal_config import addCommand QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP @@ -25,7 +25,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("query"), + "Pixmap": "Quetzal_QueryModel", "Accel": "Q,M", "MenuText": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "Query the model"), "ToolTip": QT_TRANSLATE_NOOP("Quetzal_QueryModel", "Click objects to print infos"), @@ -53,7 +53,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("grid"), + "Pixmap": "Quetzal_MoveWorkPlane", "Accel": "A,W", "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveWorkPlane", "Align workplane"), "ToolTip": QT_TRANSLATE_NOOP( @@ -71,8 +71,8 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("rotWP"), "Accel": "R,W", + "Pixmap": "Quetzal_RotateWorkPlane", "MenuText": QT_TRANSLATE_NOOP("Quetzal_RotateWorkPlane", "Rotate workplane"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_RotateWorkPlane", "Spin the Draft working plane about one of its axes" @@ -104,7 +104,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("offsetWP"), + "Pixmap": "Quetzal_OffsetWorkPlane", "Accel": "O,W", "MenuText": QT_TRANSLATE_NOOP("Quetzal_OffsetWorkPlane", "Offset workplane"), "ToolTip": QT_TRANSLATE_NOOP( @@ -121,11 +121,11 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("hackedL"), + "Pixmap": "Quetzal_HackedLine", "Accel": "H,L", - "MenuText": QT_TRANSLATE_NOOP("Quetzal_HackedL", "Draw a Draft wire"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_HackedLine", "Draw a Draft wire"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_HackedL", + "Quetzal_HackedLine", "WP is re-positioned at each point. Possible to spin and offset it.", ), } @@ -140,7 +140,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("moveHandle"), + "Pixmap": "Quetzal_MoveHandle", "Accel": "M,H", "MenuText": QT_TRANSLATE_NOOP("Quetzal_MoveHandle", "Move objects"), "ToolTip": QT_TRANSLATE_NOOP( @@ -157,10 +157,12 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("delta"), - "MenuText": QT_TRANSLATE_NOOP("Quetzal_DpCalc", "Pressure loss calculator"), + "Pixmap": "Quetzal_PressureLossCalculator", + "MenuText": QT_TRANSLATE_NOOP( + "Quetzal_PressureLossCalculator", "Pressure loss calculator" + ), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_DpCalc", + "Quetzal_PressureLossCalculator", "Calculate pressure loss in 'pypes' using ChEDL libraries.\n" "See __doc__ of the module for further information.", ), @@ -179,7 +181,7 @@ def Activated(self): def GetResources(self): return { - "Pixmap": get_icon_path("solids"), + "Pixmap": "Quetzal_SelectSolids", "MenuText": QT_TRANSLATE_NOOP("Quetzal_SelectSolids", "Select solids"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_SelectSolids", @@ -195,7 +197,7 @@ def GetResources(self): addCommand("Quetzal_MoveWorkPlane", moveWorkPlane()) addCommand("Quetzal_RotateWorkPlane", rotateWorkPlane()) addCommand("Quetzal_OffsetWorkPlane", offsetWorkPlane()) -addCommand("Quetzal_HackedL", hackedL()) +addCommand("Quetzal_HackedLine", hackedL()) addCommand("Quetzal_MoveHandle", moveHandle()) -addCommand("Quetzal_DpCalc", dpCalc()) +addCommand("Quetzal_PressureLossCalculator", dpCalc()) addCommand("Quetzal_SelectSolids", selectSolids()) diff --git a/InitGui.py b/InitGui.py index 50c207d..65d8662 100644 --- a/InitGui.py +++ b/InitGui.py @@ -49,6 +49,7 @@ def __init__(self): "Extending Dodo workbench support and adding translation support. ", ) self.__class__.Icon = os.path.join(ICONPATH, "quetzal.svg") + FreeCADGui.addIconPath(ICONPATH) try: import DraftSnap @@ -78,9 +79,9 @@ def Initialize(self): "Quetzal_MoveWorkPlane", "Quetzal_OffsetWorkPlane", "Quetzal_RotateWorkPlane", - "Quetzal_HackedL", + "Quetzal_HackedLine", "Quetzal_MoveHandle", - "Quetzal_DpCalc", + "Quetzal_PressureLossCalculator", ] self.appendToolbar("Utils", self.utilsList) Log("Loading Utils: done\n") @@ -91,16 +92,16 @@ def Initialize(self): "Quetzal_FrameIt", "Quetzal_FrameBranchManager", "Quetzal_InsertSection", - "Quetzal_SpinSect", + "Quetzal_SpinSection", "Quetzal_ReverseBeam", "Quetzal_ShiftBeam", "Quetzal_PivotBeam", "Quetzal_LevelBeam", "Quetzal_AlignEdge", - "Quetzal_RotJoin", + "Quetzal_RotateJoin", "Quetzal_AlignFlange", "Quetzal_StretchBeam", - "Quetzal_Extend", + "Quetzal_ExtendBeam", "Quetzal_AdjustFrameAngle", "Quetzal_InsertPath", "Quetzal_CreateCutList", @@ -116,7 +117,7 @@ def Initialize(self): "Quetzal_InsertCap", "Quetzal_InsertValve", "Quetzal_InsertFlange", - "Quetzal_InsertUbolt", + "Quetzal_InsertUBolt", "Quetzal_InsertPypeLine", "Quetzal_InsertBranch", "Quetzal_InsertTank", @@ -124,14 +125,14 @@ def Initialize(self): "Quetzal_BreakPipe", "Quetzal_MateEdges", "Quetzal_Flat", - "Quetzal_Extend2intersection", - "Quetzal_Extend1intersection", + "Quetzal_ExtendIntersection2", + "Quetzal_ExtendIntersection1", "Quetzal_MakeHeader", "Quetzal_Laydown", "Quetzal_Raiseup", - "Quetzal_Attach2tube", - "Quetzal_Point2point", - "Quetzal_InsertAnyz", + "Quetzal_Attach2Tube", + "Quetzal_Point2Point", + "Quetzal_InsertAnyShape", ] # ,"joinPype"] from dodoPM import toolList diff --git a/cut_list/cut_list_commands.py b/cut_list/cut_list_commands.py index e53ece1..39063aa 100644 --- a/cut_list/cut_list_commands.py +++ b/cut_list/cut_list_commands.py @@ -13,13 +13,12 @@ class cutListCommand: commandName = "createCutList" def GetResources(self): - Icon = os.path.join(RESOURCE_PATH, "cut_list_icon.svg") return { "MenuText": QT_TRANSLATE_NOOP("Quetzal_CreateCutList", "createCutList"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_CreateCutList", "Create a new Cut List from Quetzal Beams" ), - "Pixmap": Icon, + "Pixmap": "Quetzal_CreateCutList", } def Activated(self): diff --git a/fFeatures.py b/fFeatures.py index 2f23b05..9cb6c26 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -32,7 +32,7 @@ import fCmd import pCmd -from quetzal_config import FREECADVERSION +from quetzal_config import FREECADVERSION, get_icon_path from uCmd import label3D import ShpstData @@ -1286,7 +1286,7 @@ def __init__(self, vobj): vobj.Proxy = self def getIcon(self): - return join(dirname(abspath(__file__)), "iconz", "framebranch.svg") + return get_icon_path("Quetzal_FrameBranchManager") def attach(self, vobj): self.ViewObject = vobj diff --git a/iconz/adjustAngle.svg b/iconz/Quetzal_AdjustFrameAngle.svg similarity index 100% rename from iconz/adjustAngle.svg rename to iconz/Quetzal_AdjustFrameAngle.svg diff --git a/iconz/edgeAlign.svg b/iconz/Quetzal_AlignEdge.svg similarity index 100% rename from iconz/edgeAlign.svg rename to iconz/Quetzal_AlignEdge.svg diff --git a/iconz/flangeAlign.svg b/iconz/Quetzal_AlignFlange.svg similarity index 100% rename from iconz/flangeAlign.svg rename to iconz/Quetzal_AlignFlange.svg diff --git a/iconz/attach.svg b/iconz/Quetzal_Attach2Tube.svg similarity index 100% rename from iconz/attach.svg rename to iconz/Quetzal_Attach2Tube.svg diff --git a/iconz/break.svg b/iconz/Quetzal_BreakPipe.svg similarity index 100% rename from iconz/break.svg rename to iconz/Quetzal_BreakPipe.svg diff --git a/cut_list/resources/cut_list_icon.svg b/iconz/Quetzal_CreateCutList.svg similarity index 100% rename from cut_list/resources/cut_list_icon.svg rename to iconz/Quetzal_CreateCutList.svg diff --git a/iconz/extend.svg b/iconz/Quetzal_ExtendBeam.svg similarity index 100% rename from iconz/extend.svg rename to iconz/Quetzal_ExtendBeam.svg diff --git a/iconz/intersect1.svg b/iconz/Quetzal_ExtendIntersection1.svg similarity index 100% rename from iconz/intersect1.svg rename to iconz/Quetzal_ExtendIntersection1.svg diff --git a/iconz/intersect.svg b/iconz/Quetzal_ExtendIntersection2.svg similarity index 100% rename from iconz/intersect.svg rename to iconz/Quetzal_ExtendIntersection2.svg diff --git a/iconz/flat.svg b/iconz/Quetzal_Flat.svg similarity index 100% rename from iconz/flat.svg rename to iconz/Quetzal_Flat.svg diff --git a/iconz/framebranch.svg b/iconz/Quetzal_FrameBranchManager.svg similarity index 100% rename from iconz/framebranch.svg rename to iconz/Quetzal_FrameBranchManager.svg diff --git a/iconz/beamFit.svg b/iconz/Quetzal_FrameIt.svg similarity index 100% rename from iconz/beamFit.svg rename to iconz/Quetzal_FrameIt.svg diff --git a/iconz/hackedL.svg b/iconz/Quetzal_HackedLine.svg similarity index 100% rename from iconz/hackedL.svg rename to iconz/Quetzal_HackedLine.svg diff --git a/iconz/insertAnyZhape.svg b/iconz/Quetzal_InsertAnyShape.svg similarity index 100% rename from iconz/insertAnyZhape.svg rename to iconz/Quetzal_InsertAnyShape.svg diff --git a/iconz/branch.svg b/iconz/Quetzal_InsertBranch.svg similarity index 100% rename from iconz/branch.svg rename to iconz/Quetzal_InsertBranch.svg diff --git a/iconz/cap.svg b/iconz/Quetzal_InsertCap.svg similarity index 95% rename from iconz/cap.svg rename to iconz/Quetzal_InsertCap.svg index d1165dd..6261af8 100644 --- a/iconz/cap.svg +++ b/iconz/Quetzal_InsertCap.svg @@ -8,7 +8,7 @@ version="1.1" id="svg1" inkscape:version="1.4 (e7c3feb100, 2024-10-09)" - sodipodi:docname="cap.svg" + sodipodi:docname="Quetzal_InsertCap.svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" @@ -30,9 +30,9 @@ inkscape:deskcolor="#191919" inkscape:document-units="px" showgrid="true" - inkscape:zoom="7.9999999" - inkscape:cx="12.625" - inkscape:cy="27.125" + inkscape:zoom="11.313708" + inkscape:cx="23.909049" + inkscape:cy="28.505243" inkscape:window-width="1894" inkscape:window-height="999" inkscape:window-x="0" @@ -181,7 +181,7 @@ d="m 20,11.070313 v 41.859374 h 8.089844 C 29.598678,52.112833 41.859375,45.120817 41.859375,32 c 0,-13.120817 -12.260697,-20.112833 -13.769531,-20.929687 z" transform="matrix(1.0511385,0,0,1.0511385,-0.75748011,-1.6364315)" /> diff --git a/iconz/elbow.svg b/iconz/Quetzal_InsertElbow.svg similarity index 63% rename from iconz/elbow.svg rename to iconz/Quetzal_InsertElbow.svg index cc6ebe6..2d53e55 100644 --- a/iconz/elbow.svg +++ b/iconz/Quetzal_InsertElbow.svg @@ -8,7 +8,7 @@ version="1.1" id="svg1" inkscape:version="1.4 (e7c3feb100, 2024-10-09)" - sodipodi:docname="elbow.svg" + sodipodi:docname="Quetzal_InsertElbow.svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" @@ -30,9 +30,9 @@ inkscape:deskcolor="#191919" inkscape:document-units="px" showgrid="true" - inkscape:zoom="7.9999999" - inkscape:cx="-0.62500001" - inkscape:cy="29.375" + inkscape:zoom="4" + inkscape:cx="-29.375" + inkscape:cy="30.125" inkscape:window-width="1894" inkscape:window-height="999" inkscape:window-x="0" @@ -50,8 +50,8 @@ units="px" originx="0" originy="0" - spacingx="2" - spacingy="2" + spacingx="1" + spacingy="1" empcolor="#0099e5" empopacity="0.30196078" color="#0099e5" @@ -153,13 +153,34 @@ + sodipodi:type="inkscape:offset" + inkscape:radius="-0.84368467" + inkscape:original="M 10.068359 10 L 10.105469 11.115234 C 10.420368 15.050575 11.150058 18.958645 12.431641 22.697266 C 13.797684 26.757101 15.743269 30.617824 18.171875 34.146484 C 20.780939 37.905777 23.943942 41.285449 27.541016 44.115234 C 31.316391 47.097016 35.564913 49.467394 40.076172 51.136719 C 44.372854 52.725939 48.910979 53.6591 53.484375 53.914062 C 54.349331 54.202995 53.886808 53.119122 54 52.630859 L 54 33.904297 C 50.576691 33.645102 47.21097 32.686871 44.152344 31.126953 C 41.127316 29.571404 38.408881 27.423661 36.203125 24.832031 C 34.003539 22.237315 32.313898 19.214037 31.269531 15.974609 C 30.653234 14.037952 30.247157 12.02767 30.095703 10 L 10.068359 10 z " + d="m 10.941406,10.84375 0.0059,0.205078 c 1.54e-4,0.0019 -1.55e-4,0.0039 0,0.0059 0.310427,3.874342 1.028874,7.710026 2.283203,11.36914 a 0.84376904,0.84376904 0 0 1 0,0.0039 c 1.340382,3.983574 3.251747,7.774974 5.636718,11.240235 2.561702,3.690578 5.666625,7.007217 9.195313,9.783203 a 0.84376904,0.84376904 0 0 1 0.002,0.002 c 3.704447,2.925763 7.875529,5.253633 12.304688,6.892578 4.097909,1.5157 8.424942,2.398127 12.787109,2.677734 -0.01432,-0.161876 -0.03811,-0.326896 0.02148,-0.583984 l -0.02148,0.191406 V 34.607422 c -3.2638,-0.346886 -6.464873,-1.238357 -9.386719,-2.728516 a 0.84376904,0.84376904 0 0 1 -0.0039,-0.002 c -3.123088,-1.605974 -5.926683,-3.82107 -8.205078,-6.498047 a 0.84376904,0.84376904 0 0 1 -0.002,-0.002 c -2.270808,-2.678732 -4.012926,-5.796125 -5.091797,-9.142578 a 0.84376904,0.84376904 0 0 1 -0.002,-0.0039 C 29.910308,14.48789 29.602551,12.669955 29.408203,10.84375 Z" /> +
Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" + +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" + +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. +# The default value is: YES. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag UML_LOOK is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH = YES + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. Disabling a call graph can be +# accomplished by means of the command \hidecallgraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. Disabling a caller graph can be +# accomplished by means of the command \hidecallergraph. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH = YES + +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. For an explanation of the image formats see the section +# output formats in the documentation of the dot tool (Graphviz (see: +# https://www.graphviz.org/)). +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, +# gif, gif:cairo, gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, +# png:cairo, png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. + +PLANTUML_JAR_PATH = + +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. + +PLANTUML_CFG_FILE = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate +# files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. +# The default value is: YES. + +DOT_CLEANUP = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/cut_list/cut_list_ui.py b/cut_list/cut_list_ui.py index da3e10e..1a08b74 100644 --- a/cut_list/cut_list_ui.py +++ b/cut_list/cut_list_ui.py @@ -79,7 +79,7 @@ def accept(self): if profils == []: # Do not try to create a cut list with an empty selection - # TODO: Add Message Box + FreeCAD.Console.PrintMessage("Nothing selected") return # Get the Nesting Information or set the default if self.form.use_nesting.checkState() == False: diff --git a/fFeatures.py b/fFeatures.py index f94b319..7f9d7b3 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -1704,12 +1704,22 @@ def execute(self, obj): class _ProfileAngle(_Profile): - def __init__(self, obj, profile): + """ + # Create a angle profile considering round edges + obj: _Profile object + profile: list of profile parameters + """ + def __init__(self, obj:_Profile, profile:list): + ## Profile name self.label = obj.Name # FIXME: : 'FeaturePython' object has no attribute 'size' + + ## Profile size base on .csv semantic self.size = FreeCAD.ActiveDocument.getObject(self.label).size + ## Profile proportion type self.standard = FreeCAD.ActiveDocument.getObject(self.label).standard self.Solid = FreeCAD.ActiveDocument.getObject(self.label).Solid + ## Profile final length self.g0 = FreeCAD.ActiveDocument.getObject(self.label).g0 * 1000 if self.standard == "SS_Equal": self.sa = ShpstData.angle_ss_equal[self.size] @@ -1757,7 +1767,10 @@ def __init__(self, obj, profile): _Profile.__init__(self, obj, profile) return - def execute(self, obj): + def execute(self, obj:_Profile): + """ + Modify provided object based on profile list parameters + """ A = float(self.sa[0]) B = float(self.sa[1]) t = float(self.sa[2]) diff --git a/html/annotated.html b/html/annotated.html new file mode 100644 index 0000000..82401d9 --- /dev/null +++ b/html/annotated.html @@ -0,0 +1,253 @@ + + + + + + + +Quetzal: Class List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 NanyShapez
 NCFrame
 NCPipe
 Ncut_list
 NCUtils
 NdodoDialogs
 NdodoPM
 NfFeatures
 NfForms
 NfObservers
 NInitGui
 NpCmd
 NpFeatures
 NpForms
 NpObservers
 NuCmd
 NuForms
 Nupdate_crowdin
+
+
+ + + + diff --git a/html/bc_s.png b/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/html/bc_sd.png b/html/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/html/classCFrame_1_1FrameBranchManager-members.html b/html/classCFrame_1_1FrameBranchManager-members.html new file mode 100644 index 0000000..c6a872a --- /dev/null +++ b/html/classCFrame_1_1FrameBranchManager-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.FrameBranchManager Member List
+
+
+ +

This is the complete list of members for CFrame.FrameBranchManager, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.FrameBranchManager)CFrame.FrameBranchManager
GetResources(self) (defined in CFrame.FrameBranchManager)CFrame.FrameBranchManager
IsActive(self) (defined in CFrame.FrameBranchManager)CFrame.FrameBranchManager
+ + + + diff --git a/html/classCFrame_1_1FrameBranchManager.html b/html/classCFrame_1_1FrameBranchManager.html new file mode 100644 index 0000000..3aa3d1d --- /dev/null +++ b/html/classCFrame_1_1FrameBranchManager.html @@ -0,0 +1,108 @@ + + + + + + + +Quetzal: CFrame.FrameBranchManager Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.FrameBranchManager Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Dialog to create and change properties of objects FrameBranch
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1adjustFrameAngle-members.html b/html/classCFrame_1_1adjustFrameAngle-members.html new file mode 100644 index 0000000..61038a5 --- /dev/null +++ b/html/classCFrame_1_1adjustFrameAngle-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.adjustFrameAngle Member List
+
+
+ +

This is the complete list of members for CFrame.adjustFrameAngle, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.adjustFrameAngle)CFrame.adjustFrameAngle
GetResources(self) (defined in CFrame.adjustFrameAngle)CFrame.adjustFrameAngle
IsActive(self) (defined in CFrame.adjustFrameAngle)CFrame.adjustFrameAngle
+ + + + diff --git a/html/classCFrame_1_1adjustFrameAngle.html b/html/classCFrame_1_1adjustFrameAngle.html new file mode 100644 index 0000000..2dd3e8c --- /dev/null +++ b/html/classCFrame_1_1adjustFrameAngle.html @@ -0,0 +1,108 @@ + + + + + + + +Quetzal: CFrame.adjustFrameAngle Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.adjustFrameAngle Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to adjust the beams at square angles of frames.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1alignEdge-members.html b/html/classCFrame_1_1alignEdge-members.html new file mode 100644 index 0000000..80244c2 --- /dev/null +++ b/html/classCFrame_1_1alignEdge-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.alignEdge Member List
+
+
+ +

This is the complete list of members for CFrame.alignEdge, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.alignEdge)CFrame.alignEdge
GetResources(self) (defined in CFrame.alignEdge)CFrame.alignEdge
IsActive(self) (defined in CFrame.alignEdge)CFrame.alignEdge
+ + + + diff --git a/html/classCFrame_1_1alignEdge.html b/html/classCFrame_1_1alignEdge.html new file mode 100644 index 0000000..d0bffd5 --- /dev/null +++ b/html/classCFrame_1_1alignEdge.html @@ -0,0 +1,115 @@ + + + + + + + +Quetzal: CFrame.alignEdge Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.alignEdge Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to mate two parallel edges.
+
+Notes: - actually the command moves the objects along the minimum
+distance of their selected edge to the first one. Thus it translates
+the object even if edges are not parallel.
+- It is also possible to select two edges of the same objects. With
+this method is possible to move quickly one object by steps defined
+on its own geometry.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1alignFlange-members.html b/html/classCFrame_1_1alignFlange-members.html new file mode 100644 index 0000000..7832b57 --- /dev/null +++ b/html/classCFrame_1_1alignFlange-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.alignFlange Member List
+
+
+ +

This is the complete list of members for CFrame.alignFlange, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.alignFlange)CFrame.alignFlange
GetResources(self) (defined in CFrame.alignFlange)CFrame.alignFlange
IsActive(self) (defined in CFrame.alignFlange)CFrame.alignFlange
+ + + + diff --git a/html/classCFrame_1_1alignFlange.html b/html/classCFrame_1_1alignFlange.html new file mode 100644 index 0000000..43c200d --- /dev/null +++ b/html/classCFrame_1_1alignFlange.html @@ -0,0 +1,113 @@ + + + + + + + +Quetzal: CFrame.alignFlange Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.alignFlange Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to rotate beams (or other objects) so that their surfaces are
+parallel to one reference plane.
+If multiple faces are preselected, objects will be rotated according
+the first face in the selections set. Otherwise the program prompts
+to select one reference face and then the faces to be reoriented until
+ESC is pressed.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1extend-members.html b/html/classCFrame_1_1extend-members.html new file mode 100644 index 0000000..4ac73a8 --- /dev/null +++ b/html/classCFrame_1_1extend-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.extend Member List
+
+
+ +

This is the complete list of members for CFrame.extend, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.extend)CFrame.extend
GetResources(self) (defined in CFrame.extend)CFrame.extend
IsActive(self) (defined in CFrame.extend)CFrame.extend
+ + + + diff --git a/html/classCFrame_1_1extend.html b/html/classCFrame_1_1extend.html new file mode 100644 index 0000000..6124492 --- /dev/null +++ b/html/classCFrame_1_1extend.html @@ -0,0 +1,111 @@ + + + + + + + +Quetzal: CFrame.extend Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.extend Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Dialog to extend one beam to one selected target.
+Note: - if entities are preselected before calling this command, the
+first entity is automatically taken as target and the object attached
+to it is removed from selection set.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1frameIt-members.html b/html/classCFrame_1_1frameIt-members.html new file mode 100644 index 0000000..1cf79cb --- /dev/null +++ b/html/classCFrame_1_1frameIt-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.frameIt Member List
+
+
+ +

This is the complete list of members for CFrame.frameIt, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.frameIt)CFrame.frameIt
GetResources(self) (defined in CFrame.frameIt)CFrame.frameIt
IsActive(self) (defined in CFrame.frameIt)CFrame.frameIt
+ + + + diff --git a/html/classCFrame_1_1frameIt.html b/html/classCFrame_1_1frameIt.html new file mode 100644 index 0000000..b0004b8 --- /dev/null +++ b/html/classCFrame_1_1frameIt.html @@ -0,0 +1,110 @@ + + + + + + + +Quetzal: CFrame.frameIt Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.frameIt Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Given a beam object and an edge in the model, this tool lay down the
+beam over the edge by selecting them one after the other until ESC is
+pressed.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1insertPath-members.html b/html/classCFrame_1_1insertPath-members.html new file mode 100644 index 0000000..379abda --- /dev/null +++ b/html/classCFrame_1_1insertPath-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.insertPath Member List
+
+
+ +

This is the complete list of members for CFrame.insertPath, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.insertPath)CFrame.insertPath
GetResources(self) (defined in CFrame.insertPath)CFrame.insertPath
IsActive(self) (defined in CFrame.insertPath)CFrame.insertPath
+ + + + diff --git a/html/classCFrame_1_1insertPath.html b/html/classCFrame_1_1insertPath.html new file mode 100644 index 0000000..28daebc --- /dev/null +++ b/html/classCFrame_1_1insertPath.html @@ -0,0 +1,110 @@ + + + + + + + +Quetzal: CFrame.insertPath Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.insertPath Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to create a continuous DWire over the path defined by the
+edges selected in the viewport, even if these are not continuous or
+belongs to different objects.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1insertSection-members.html b/html/classCFrame_1_1insertSection-members.html new file mode 100644 index 0000000..d28517b --- /dev/null +++ b/html/classCFrame_1_1insertSection-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.insertSection Member List
+
+
+ +

This is the complete list of members for CFrame.insertSection, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.insertSection)CFrame.insertSection
GetResources(self) (defined in CFrame.insertSection)CFrame.insertSection
IsActive(self) (defined in CFrame.insertSection)CFrame.insertSection
+ + + + diff --git a/html/classCFrame_1_1insertSection.html b/html/classCFrame_1_1insertSection.html new file mode 100644 index 0000000..a924fa6 --- /dev/null +++ b/html/classCFrame_1_1insertSection.html @@ -0,0 +1,108 @@ + + + + + + + +Quetzal: CFrame.insertSection Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.insertSection Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Dialog to create the set of profiles to be used in the model.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1levelBeam-members.html b/html/classCFrame_1_1levelBeam-members.html new file mode 100644 index 0000000..08247c1 --- /dev/null +++ b/html/classCFrame_1_1levelBeam-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.levelBeam Member List
+
+
+ +

This is the complete list of members for CFrame.levelBeam, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.levelBeam)CFrame.levelBeam
GetResources(self) (defined in CFrame.levelBeam)CFrame.levelBeam
IsActive(self) (defined in CFrame.levelBeam)CFrame.levelBeam
+ + + + diff --git a/html/classCFrame_1_1levelBeam.html b/html/classCFrame_1_1levelBeam.html new file mode 100644 index 0000000..6d13ee9 --- /dev/null +++ b/html/classCFrame_1_1levelBeam.html @@ -0,0 +1,113 @@ + + + + + + + +Quetzal: CFrame.levelBeam Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.levelBeam Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to flush the parallel faces of two objects.
+
+Note: - actually the command takes to the same level, respect the
+position and orientation of the first face selected, the center-of-mass
+of all faces selected. Thus it translates the objects even if the
+faces are not parallel.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1pivotBeam-members.html b/html/classCFrame_1_1pivotBeam-members.html new file mode 100644 index 0000000..fe250f6 --- /dev/null +++ b/html/classCFrame_1_1pivotBeam-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.pivotBeam Member List
+
+
+ +

This is the complete list of members for CFrame.pivotBeam, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.pivotBeam)CFrame.pivotBeam
GetResources(self) (defined in CFrame.pivotBeam)CFrame.pivotBeam
IsActive(self) (defined in CFrame.pivotBeam)CFrame.pivotBeam
+ + + + diff --git a/html/classCFrame_1_1pivotBeam.html b/html/classCFrame_1_1pivotBeam.html new file mode 100644 index 0000000..ca1ca84 --- /dev/null +++ b/html/classCFrame_1_1pivotBeam.html @@ -0,0 +1,112 @@ + + + + + + + +Quetzal: CFrame.pivotBeam Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.pivotBeam Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Dialog to rotate objects around one edge in the model or principal axis.
+* Dial or textbox: the degree of rotation.
+* "copy items" checkbox: select if the objects will be also copied.
+* [Select axis] button: choose the pivot.
+* [X / Y / Z]: choose one principal axis as pivot.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1reverseBeam-members.html b/html/classCFrame_1_1reverseBeam-members.html new file mode 100644 index 0000000..bd0d186 --- /dev/null +++ b/html/classCFrame_1_1reverseBeam-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.reverseBeam Member List
+
+
+ +

This is the complete list of members for CFrame.reverseBeam, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.reverseBeam)CFrame.reverseBeam
GetResources(self) (defined in CFrame.reverseBeam)CFrame.reverseBeam
IsActive(self) (defined in CFrame.reverseBeam)CFrame.reverseBeam
+ + + + diff --git a/html/classCFrame_1_1reverseBeam.html b/html/classCFrame_1_1reverseBeam.html new file mode 100644 index 0000000..02b9f02 --- /dev/null +++ b/html/classCFrame_1_1reverseBeam.html @@ -0,0 +1,111 @@ + + + + + + + +Quetzal: CFrame.reverseBeam Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.reverseBeam Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to spin one object around the "X" axis of its shape
+by 180 degrees.
+Note: - if one edge of the object is selected, that is used
+as the pivot of rotation.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1rotJoin-members.html b/html/classCFrame_1_1rotJoin-members.html new file mode 100644 index 0000000..ed9a78c --- /dev/null +++ b/html/classCFrame_1_1rotJoin-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.rotJoin Member List
+
+
+ +

This is the complete list of members for CFrame.rotJoin, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.rotJoin)CFrame.rotJoin
GetResources(self) (defined in CFrame.rotJoin)CFrame.rotJoin
IsActive(self) (defined in CFrame.rotJoin)CFrame.rotJoin
+ + + + diff --git a/html/classCFrame_1_1rotJoin.html b/html/classCFrame_1_1rotJoin.html new file mode 100644 index 0000000..13d0236 --- /dev/null +++ b/html/classCFrame_1_1rotJoin.html @@ -0,0 +1,108 @@ + + + + + + + +Quetzal: CFrame.rotJoin Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.rotJoin Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to translate and rotate the beams to mate two edges.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1shiftBeam-members.html b/html/classCFrame_1_1shiftBeam-members.html new file mode 100644 index 0000000..791b6de --- /dev/null +++ b/html/classCFrame_1_1shiftBeam-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.shiftBeam Member List
+
+
+ +

This is the complete list of members for CFrame.shiftBeam, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.shiftBeam)CFrame.shiftBeam
GetResources(self) (defined in CFrame.shiftBeam)CFrame.shiftBeam
IsActive(self) (defined in CFrame.shiftBeam)CFrame.shiftBeam
+ + + + diff --git a/html/classCFrame_1_1shiftBeam.html b/html/classCFrame_1_1shiftBeam.html new file mode 100644 index 0000000..c9a5685 --- /dev/null +++ b/html/classCFrame_1_1shiftBeam.html @@ -0,0 +1,122 @@ + + + + + + + +Quetzal: CFrame.shiftBeam Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.shiftBeam Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Dialog to translate and copy objects.
+* "x/y/z" textboxes: direct input of amount of translation in each
+direction.
+* "Multiple" textbox: the multiple coefficient of the translation
+amount.
+* "Steps" textbox: the denominator of the translation amount. It's
+used when the amount of translation is to be covered in some steps.
+* "move/copy" radiobuttons: to select if the selected objects shall
+be copied or only translated.
+* [Displacement] button: takes the amount and direction of translation
+from the distance of selected entities (points, edges, faces).
+* [Vector] button: defines the amount and direction of translation
+by the orientation and length of the selected edge.
+* [OK] button: execute the translation
+* [Cancel]: exits
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1spinSect-members.html b/html/classCFrame_1_1spinSect-members.html new file mode 100644 index 0000000..7aa48ee --- /dev/null +++ b/html/classCFrame_1_1spinSect-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.spinSect Member List
+
+
+ +

This is the complete list of members for CFrame.spinSect, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.spinSect)CFrame.spinSect
GetResources(self) (defined in CFrame.spinSect)CFrame.spinSect
IsActive(self) (defined in CFrame.spinSect)CFrame.spinSect
+ + + + diff --git a/html/classCFrame_1_1spinSect.html b/html/classCFrame_1_1spinSect.html new file mode 100644 index 0000000..bf95d3a --- /dev/null +++ b/html/classCFrame_1_1spinSect.html @@ -0,0 +1,109 @@ + + + + + + + +Quetzal: CFrame.spinSect Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.spinSect Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to spin one object around the "Z" axis of its shape
+by 45 degrees.
+

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCFrame_1_1stretchBeam-members.html b/html/classCFrame_1_1stretchBeam-members.html new file mode 100644 index 0000000..649b41e --- /dev/null +++ b/html/classCFrame_1_1stretchBeam-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CFrame.stretchBeam Member List
+
+
+ +

This is the complete list of members for CFrame.stretchBeam, including all inherited members.

+ + + + +
Activated(self) (defined in CFrame.stretchBeam)CFrame.stretchBeam
GetResources(self) (defined in CFrame.stretchBeam)CFrame.stretchBeam
IsActive(self) (defined in CFrame.stretchBeam)CFrame.stretchBeam
+ + + + diff --git a/html/classCFrame_1_1stretchBeam.html b/html/classCFrame_1_1stretchBeam.html new file mode 100644 index 0000000..a419954 --- /dev/null +++ b/html/classCFrame_1_1stretchBeam.html @@ -0,0 +1,114 @@ + + + + + + + +Quetzal: CFrame.stretchBeam Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CFrame.stretchBeam Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Dialog to change the length of beams.
+* "mm" textbox: the new length that will be applied to selected beams.
+* [OK] button: execute the stretch operation to the selected beams.
+* [Get Length] button: takes the new length from the selected geometry,
+either the length of a beam or edge or the distance between geometric
+entities (point, edges, faces).
+* [Cancel]: exits
+* slider: extends the reference length from -100% to +100%.

The documentation for this class was generated from the following file:
    +
  • CFrame.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1attach2tube-members.html b/html/classCPipe_1_1attach2tube-members.html new file mode 100644 index 0000000..ba19bb9 --- /dev/null +++ b/html/classCPipe_1_1attach2tube-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.attach2tube Member List
+
+
+ +

This is the complete list of members for CPipe.attach2tube, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.attach2tube)CPipe.attach2tube
GetResources(self) (defined in CPipe.attach2tube)CPipe.attach2tube
IsActive(self) (defined in CPipe.attach2tube)CPipe.attach2tube
+ + + + diff --git a/html/classCPipe_1_1attach2tube.html b/html/classCPipe_1_1attach2tube.html new file mode 100644 index 0000000..88ecdd1 --- /dev/null +++ b/html/classCPipe_1_1attach2tube.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.attach2tube Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.attach2tube Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1breakPipe-members.html b/html/classCPipe_1_1breakPipe-members.html new file mode 100644 index 0000000..8cdf497 --- /dev/null +++ b/html/classCPipe_1_1breakPipe-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.breakPipe Member List
+
+
+ +

This is the complete list of members for CPipe.breakPipe, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.breakPipe)CPipe.breakPipe
GetResources(self) (defined in CPipe.breakPipe)CPipe.breakPipe
IsActive(self) (defined in CPipe.breakPipe)CPipe.breakPipe
+ + + + diff --git a/html/classCPipe_1_1breakPipe.html b/html/classCPipe_1_1breakPipe.html new file mode 100644 index 0000000..f03dac5 --- /dev/null +++ b/html/classCPipe_1_1breakPipe.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.breakPipe Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.breakPipe Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1capQM-members.html b/html/classCPipe_1_1capQM-members.html new file mode 100644 index 0000000..953c052 --- /dev/null +++ b/html/classCPipe_1_1capQM-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.capQM Member List
+
+
+ +

This is the complete list of members for CPipe.capQM, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.capQM)CPipe.capQM
GetResources(self) (defined in CPipe.capQM)CPipe.capQM
IsActive(self) (defined in CPipe.capQM)CPipe.capQM
+ + + + diff --git a/html/classCPipe_1_1capQM.html b/html/classCPipe_1_1capQM.html new file mode 100644 index 0000000..5227500 --- /dev/null +++ b/html/classCPipe_1_1capQM.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.capQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.capQM Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1elbowQM-members.html b/html/classCPipe_1_1elbowQM-members.html new file mode 100644 index 0000000..435c23f --- /dev/null +++ b/html/classCPipe_1_1elbowQM-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.elbowQM Member List
+
+
+ +

This is the complete list of members for CPipe.elbowQM, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.elbowQM)CPipe.elbowQM
GetResources(self) (defined in CPipe.elbowQM)CPipe.elbowQM
IsActive(self) (defined in CPipe.elbowQM)CPipe.elbowQM
+ + + + diff --git a/html/classCPipe_1_1elbowQM.html b/html/classCPipe_1_1elbowQM.html new file mode 100644 index 0000000..ca7d094 --- /dev/null +++ b/html/classCPipe_1_1elbowQM.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.elbowQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.elbowQM Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1extend1intersection-members.html b/html/classCPipe_1_1extend1intersection-members.html new file mode 100644 index 0000000..175c3cc --- /dev/null +++ b/html/classCPipe_1_1extend1intersection-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.extend1intersection Member List
+
+
+ +

This is the complete list of members for CPipe.extend1intersection, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.extend1intersection)CPipe.extend1intersection
GetResources(self) (defined in CPipe.extend1intersection)CPipe.extend1intersection
IsActive(self) (defined in CPipe.extend1intersection)CPipe.extend1intersection
+ + + + diff --git a/html/classCPipe_1_1extend1intersection.html b/html/classCPipe_1_1extend1intersection.html new file mode 100644 index 0000000..0997282 --- /dev/null +++ b/html/classCPipe_1_1extend1intersection.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.extend1intersection Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.extend1intersection Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1extend2intersection-members.html b/html/classCPipe_1_1extend2intersection-members.html new file mode 100644 index 0000000..b53ea77 --- /dev/null +++ b/html/classCPipe_1_1extend2intersection-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.extend2intersection Member List
+
+
+ +

This is the complete list of members for CPipe.extend2intersection, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.extend2intersection)CPipe.extend2intersection
GetResources(self) (defined in CPipe.extend2intersection)CPipe.extend2intersection
IsActive(self) (defined in CPipe.extend2intersection)CPipe.extend2intersection
+ + + + diff --git a/html/classCPipe_1_1extend2intersection.html b/html/classCPipe_1_1extend2intersection.html new file mode 100644 index 0000000..bf999ac --- /dev/null +++ b/html/classCPipe_1_1extend2intersection.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.extend2intersection Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.extend2intersection Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1flangeQM-members.html b/html/classCPipe_1_1flangeQM-members.html new file mode 100644 index 0000000..71e76d8 --- /dev/null +++ b/html/classCPipe_1_1flangeQM-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.flangeQM Member List
+
+
+ +

This is the complete list of members for CPipe.flangeQM, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.flangeQM)CPipe.flangeQM
GetResources(self) (defined in CPipe.flangeQM)CPipe.flangeQM
IsActive(self) (defined in CPipe.flangeQM)CPipe.flangeQM
+ + + + diff --git a/html/classCPipe_1_1flangeQM.html b/html/classCPipe_1_1flangeQM.html new file mode 100644 index 0000000..a121c17 --- /dev/null +++ b/html/classCPipe_1_1flangeQM.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.flangeQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.flangeQM Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1flat-members.html b/html/classCPipe_1_1flat-members.html new file mode 100644 index 0000000..4c952b5 --- /dev/null +++ b/html/classCPipe_1_1flat-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.flat Member List
+
+
+ +

This is the complete list of members for CPipe.flat, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.flat)CPipe.flat
GetResources(self) (defined in CPipe.flat)CPipe.flat
IsActive(self) (defined in CPipe.flat)CPipe.flat
+ + + + diff --git a/html/classCPipe_1_1flat.html b/html/classCPipe_1_1flat.html new file mode 100644 index 0000000..667eaf8 --- /dev/null +++ b/html/classCPipe_1_1flat.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.flat Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.flat Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertAnyz-members.html b/html/classCPipe_1_1insertAnyz-members.html new file mode 100644 index 0000000..85bf05d --- /dev/null +++ b/html/classCPipe_1_1insertAnyz-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertAnyz Member List
+
+
+ +

This is the complete list of members for CPipe.insertAnyz, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertAnyz)CPipe.insertAnyz
GetResources(self) (defined in CPipe.insertAnyz)CPipe.insertAnyz
IsActive(self) (defined in CPipe.insertAnyz)CPipe.insertAnyz
+ + + + diff --git a/html/classCPipe_1_1insertAnyz.html b/html/classCPipe_1_1insertAnyz.html new file mode 100644 index 0000000..be2e7ae --- /dev/null +++ b/html/classCPipe_1_1insertAnyz.html @@ -0,0 +1,108 @@ + + + + + + + +Quetzal: CPipe.insertAnyz Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertAnyz Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Dialog to insert any object saved as .STEP, .IGES or .BREP in folder ../Mod/dodo/shapez or subfolders.
+

The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertBranch-members.html b/html/classCPipe_1_1insertBranch-members.html new file mode 100644 index 0000000..f81075d --- /dev/null +++ b/html/classCPipe_1_1insertBranch-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertBranch Member List
+
+
+ +

This is the complete list of members for CPipe.insertBranch, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertBranch)CPipe.insertBranch
GetResources(self) (defined in CPipe.insertBranch)CPipe.insertBranch
IsActive(self) (defined in CPipe.insertBranch)CPipe.insertBranch
+ + + + diff --git a/html/classCPipe_1_1insertBranch.html b/html/classCPipe_1_1insertBranch.html new file mode 100644 index 0000000..03d52c1 --- /dev/null +++ b/html/classCPipe_1_1insertBranch.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertBranch Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertBranch Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertCap-members.html b/html/classCPipe_1_1insertCap-members.html new file mode 100644 index 0000000..95988eb --- /dev/null +++ b/html/classCPipe_1_1insertCap-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertCap Member List
+
+
+ +

This is the complete list of members for CPipe.insertCap, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertCap)CPipe.insertCap
GetResources(self) (defined in CPipe.insertCap)CPipe.insertCap
IsActive(self) (defined in CPipe.insertCap)CPipe.insertCap
+ + + + diff --git a/html/classCPipe_1_1insertCap.html b/html/classCPipe_1_1insertCap.html new file mode 100644 index 0000000..82e0242 --- /dev/null +++ b/html/classCPipe_1_1insertCap.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertCap Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertCap Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertElbow-members.html b/html/classCPipe_1_1insertElbow-members.html new file mode 100644 index 0000000..b9b28f0 --- /dev/null +++ b/html/classCPipe_1_1insertElbow-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertElbow Member List
+
+
+ +

This is the complete list of members for CPipe.insertElbow, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertElbow)CPipe.insertElbow
GetResources(self) (defined in CPipe.insertElbow)CPipe.insertElbow
IsActive(self) (defined in CPipe.insertElbow)CPipe.insertElbow
+ + + + diff --git a/html/classCPipe_1_1insertElbow.html b/html/classCPipe_1_1insertElbow.html new file mode 100644 index 0000000..61e8fe8 --- /dev/null +++ b/html/classCPipe_1_1insertElbow.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertElbow Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertElbow Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertFlange-members.html b/html/classCPipe_1_1insertFlange-members.html new file mode 100644 index 0000000..f86396f --- /dev/null +++ b/html/classCPipe_1_1insertFlange-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertFlange Member List
+
+
+ +

This is the complete list of members for CPipe.insertFlange, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertFlange)CPipe.insertFlange
GetResources(self) (defined in CPipe.insertFlange)CPipe.insertFlange
IsActive(self) (defined in CPipe.insertFlange)CPipe.insertFlange
+ + + + diff --git a/html/classCPipe_1_1insertFlange.html b/html/classCPipe_1_1insertFlange.html new file mode 100644 index 0000000..f8c9d71 --- /dev/null +++ b/html/classCPipe_1_1insertFlange.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertFlange Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertFlange Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertPipe-members.html b/html/classCPipe_1_1insertPipe-members.html new file mode 100644 index 0000000..4216e38 --- /dev/null +++ b/html/classCPipe_1_1insertPipe-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertPipe Member List
+
+
+ +

This is the complete list of members for CPipe.insertPipe, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertPipe)CPipe.insertPipe
GetResources(self) (defined in CPipe.insertPipe)CPipe.insertPipe
IsActive(self) (defined in CPipe.insertPipe)CPipe.insertPipe
+ + + + diff --git a/html/classCPipe_1_1insertPipe.html b/html/classCPipe_1_1insertPipe.html new file mode 100644 index 0000000..92338c3 --- /dev/null +++ b/html/classCPipe_1_1insertPipe.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertPipe Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertPipe Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertPypeLine-members.html b/html/classCPipe_1_1insertPypeLine-members.html new file mode 100644 index 0000000..773f31e --- /dev/null +++ b/html/classCPipe_1_1insertPypeLine-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertPypeLine Member List
+
+
+ +

This is the complete list of members for CPipe.insertPypeLine, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertPypeLine)CPipe.insertPypeLine
GetResources(self) (defined in CPipe.insertPypeLine)CPipe.insertPypeLine
IsActive(self) (defined in CPipe.insertPypeLine)CPipe.insertPypeLine
+ + + + diff --git a/html/classCPipe_1_1insertPypeLine.html b/html/classCPipe_1_1insertPypeLine.html new file mode 100644 index 0000000..0c7b13e --- /dev/null +++ b/html/classCPipe_1_1insertPypeLine.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertPypeLine Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertPypeLine Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertReduct-members.html b/html/classCPipe_1_1insertReduct-members.html new file mode 100644 index 0000000..0306304 --- /dev/null +++ b/html/classCPipe_1_1insertReduct-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertReduct Member List
+
+
+ +

This is the complete list of members for CPipe.insertReduct, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertReduct)CPipe.insertReduct
GetResources(self) (defined in CPipe.insertReduct)CPipe.insertReduct
IsActive(self) (defined in CPipe.insertReduct)CPipe.insertReduct
+ + + + diff --git a/html/classCPipe_1_1insertReduct.html b/html/classCPipe_1_1insertReduct.html new file mode 100644 index 0000000..ba5eae9 --- /dev/null +++ b/html/classCPipe_1_1insertReduct.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertReduct Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertReduct Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertRoute-members.html b/html/classCPipe_1_1insertRoute-members.html new file mode 100644 index 0000000..1e82c61 --- /dev/null +++ b/html/classCPipe_1_1insertRoute-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertRoute Member List
+
+
+ +

This is the complete list of members for CPipe.insertRoute, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertRoute)CPipe.insertRoute
GetResources(self) (defined in CPipe.insertRoute)CPipe.insertRoute
IsActive(self) (defined in CPipe.insertRoute)CPipe.insertRoute
+ + + + diff --git a/html/classCPipe_1_1insertRoute.html b/html/classCPipe_1_1insertRoute.html new file mode 100644 index 0000000..0c3fa34 --- /dev/null +++ b/html/classCPipe_1_1insertRoute.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertRoute Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertRoute Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertTank-members.html b/html/classCPipe_1_1insertTank-members.html new file mode 100644 index 0000000..24ee2fc --- /dev/null +++ b/html/classCPipe_1_1insertTank-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertTank Member List
+
+
+ +

This is the complete list of members for CPipe.insertTank, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertTank)CPipe.insertTank
GetResources(self) (defined in CPipe.insertTank)CPipe.insertTank
IsActive(self) (defined in CPipe.insertTank)CPipe.insertTank
+ + + + diff --git a/html/classCPipe_1_1insertTank.html b/html/classCPipe_1_1insertTank.html new file mode 100644 index 0000000..7f59f18 --- /dev/null +++ b/html/classCPipe_1_1insertTank.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertTank Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertTank Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertUbolt-members.html b/html/classCPipe_1_1insertUbolt-members.html new file mode 100644 index 0000000..8d71e58 --- /dev/null +++ b/html/classCPipe_1_1insertUbolt-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertUbolt Member List
+
+
+ +

This is the complete list of members for CPipe.insertUbolt, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertUbolt)CPipe.insertUbolt
GetResources(self) (defined in CPipe.insertUbolt)CPipe.insertUbolt
IsActive(self) (defined in CPipe.insertUbolt)CPipe.insertUbolt
+ + + + diff --git a/html/classCPipe_1_1insertUbolt.html b/html/classCPipe_1_1insertUbolt.html new file mode 100644 index 0000000..7331a11 --- /dev/null +++ b/html/classCPipe_1_1insertUbolt.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertUbolt Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertUbolt Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1insertValve-members.html b/html/classCPipe_1_1insertValve-members.html new file mode 100644 index 0000000..6d75556 --- /dev/null +++ b/html/classCPipe_1_1insertValve-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.insertValve Member List
+
+
+ +

This is the complete list of members for CPipe.insertValve, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.insertValve)CPipe.insertValve
GetResources(self) (defined in CPipe.insertValve)CPipe.insertValve
IsActive(self) (defined in CPipe.insertValve)CPipe.insertValve
+ + + + diff --git a/html/classCPipe_1_1insertValve.html b/html/classCPipe_1_1insertValve.html new file mode 100644 index 0000000..dee4557 --- /dev/null +++ b/html/classCPipe_1_1insertValve.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.insertValve Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.insertValve Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1joinPype-members.html b/html/classCPipe_1_1joinPype-members.html new file mode 100644 index 0000000..dcd4395 --- /dev/null +++ b/html/classCPipe_1_1joinPype-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.joinPype Member List
+
+
+ +

This is the complete list of members for CPipe.joinPype, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.joinPype)CPipe.joinPype
GetResources(self) (defined in CPipe.joinPype)CPipe.joinPype
IsActive(self) (defined in CPipe.joinPype)CPipe.joinPype
+ + + + diff --git a/html/classCPipe_1_1joinPype.html b/html/classCPipe_1_1joinPype.html new file mode 100644 index 0000000..7ef97f8 --- /dev/null +++ b/html/classCPipe_1_1joinPype.html @@ -0,0 +1,107 @@ + + + + + + + +Quetzal: CPipe.joinPype Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.joinPype Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
 

The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1laydown-members.html b/html/classCPipe_1_1laydown-members.html new file mode 100644 index 0000000..514d6e6 --- /dev/null +++ b/html/classCPipe_1_1laydown-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.laydown Member List
+
+
+ +

This is the complete list of members for CPipe.laydown, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.laydown)CPipe.laydown
GetResources(self) (defined in CPipe.laydown)CPipe.laydown
IsActive(self) (defined in CPipe.laydown)CPipe.laydown
+ + + + diff --git a/html/classCPipe_1_1laydown.html b/html/classCPipe_1_1laydown.html new file mode 100644 index 0000000..53f10dd --- /dev/null +++ b/html/classCPipe_1_1laydown.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.laydown Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.laydown Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1makeHeader-members.html b/html/classCPipe_1_1makeHeader-members.html new file mode 100644 index 0000000..072b991 --- /dev/null +++ b/html/classCPipe_1_1makeHeader-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.makeHeader Member List
+
+
+ +

This is the complete list of members for CPipe.makeHeader, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.makeHeader)CPipe.makeHeader
GetResources(self) (defined in CPipe.makeHeader)CPipe.makeHeader
IsActive(self) (defined in CPipe.makeHeader)CPipe.makeHeader
+ + + + diff --git a/html/classCPipe_1_1makeHeader.html b/html/classCPipe_1_1makeHeader.html new file mode 100644 index 0000000..edac5a8 --- /dev/null +++ b/html/classCPipe_1_1makeHeader.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.makeHeader Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.makeHeader Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1mateEdges-members.html b/html/classCPipe_1_1mateEdges-members.html new file mode 100644 index 0000000..55649ed --- /dev/null +++ b/html/classCPipe_1_1mateEdges-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.mateEdges Member List
+
+
+ +

This is the complete list of members for CPipe.mateEdges, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.mateEdges)CPipe.mateEdges
GetResources(self) (defined in CPipe.mateEdges)CPipe.mateEdges
IsActive(self) (defined in CPipe.mateEdges)CPipe.mateEdges
+ + + + diff --git a/html/classCPipe_1_1mateEdges.html b/html/classCPipe_1_1mateEdges.html new file mode 100644 index 0000000..3a2a327 --- /dev/null +++ b/html/classCPipe_1_1mateEdges.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.mateEdges Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.mateEdges Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1pipeQM-members.html b/html/classCPipe_1_1pipeQM-members.html new file mode 100644 index 0000000..6474d60 --- /dev/null +++ b/html/classCPipe_1_1pipeQM-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.pipeQM Member List
+
+
+ +

This is the complete list of members for CPipe.pipeQM, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.pipeQM)CPipe.pipeQM
GetResources(self) (defined in CPipe.pipeQM)CPipe.pipeQM
IsActive(self) (defined in CPipe.pipeQM)CPipe.pipeQM
+ + + + diff --git a/html/classCPipe_1_1pipeQM.html b/html/classCPipe_1_1pipeQM.html new file mode 100644 index 0000000..a066f08 --- /dev/null +++ b/html/classCPipe_1_1pipeQM.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.pipeQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.pipeQM Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1point2point-members.html b/html/classCPipe_1_1point2point-members.html new file mode 100644 index 0000000..0e5b775 --- /dev/null +++ b/html/classCPipe_1_1point2point-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.point2point Member List
+
+
+ +

This is the complete list of members for CPipe.point2point, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.point2point)CPipe.point2point
GetResources(self) (defined in CPipe.point2point)CPipe.point2point
IsActive(self) (defined in CPipe.point2point)CPipe.point2point
+ + + + diff --git a/html/classCPipe_1_1point2point.html b/html/classCPipe_1_1point2point.html new file mode 100644 index 0000000..9cebfec --- /dev/null +++ b/html/classCPipe_1_1point2point.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.point2point Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.point2point Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1raiseup-members.html b/html/classCPipe_1_1raiseup-members.html new file mode 100644 index 0000000..25253b0 --- /dev/null +++ b/html/classCPipe_1_1raiseup-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.raiseup Member List
+
+
+ +

This is the complete list of members for CPipe.raiseup, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.raiseup)CPipe.raiseup
GetResources(self) (defined in CPipe.raiseup)CPipe.raiseup
IsActive(self) (defined in CPipe.raiseup)CPipe.raiseup
+ + + + diff --git a/html/classCPipe_1_1raiseup.html b/html/classCPipe_1_1raiseup.html new file mode 100644 index 0000000..021d0a6 --- /dev/null +++ b/html/classCPipe_1_1raiseup.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.raiseup Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.raiseup Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCPipe_1_1valveQM-members.html b/html/classCPipe_1_1valveQM-members.html new file mode 100644 index 0000000..925f443 --- /dev/null +++ b/html/classCPipe_1_1valveQM-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CPipe.valveQM Member List
+
+
+ +

This is the complete list of members for CPipe.valveQM, including all inherited members.

+ + + + +
Activated(self) (defined in CPipe.valveQM)CPipe.valveQM
GetResources(self) (defined in CPipe.valveQM)CPipe.valveQM
IsActive(self) (defined in CPipe.valveQM)CPipe.valveQM
+ + + + diff --git a/html/classCPipe_1_1valveQM.html b/html/classCPipe_1_1valveQM.html new file mode 100644 index 0000000..69b9447 --- /dev/null +++ b/html/classCPipe_1_1valveQM.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CPipe.valveQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CPipe.valveQM Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CPipe.py
  • +
+
+ + + + diff --git a/html/classCUtils_1_1dpCalc-members.html b/html/classCUtils_1_1dpCalc-members.html new file mode 100644 index 0000000..61f9f33 --- /dev/null +++ b/html/classCUtils_1_1dpCalc-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CUtils.dpCalc Member List
+
+
+ +

This is the complete list of members for CUtils.dpCalc, including all inherited members.

+ + + + +
Activated(self) (defined in CUtils.dpCalc)CUtils.dpCalc
GetResources(self) (defined in CUtils.dpCalc)CUtils.dpCalc
IsActive(self) (defined in CUtils.dpCalc)CUtils.dpCalc
+ + + + diff --git a/html/classCUtils_1_1dpCalc.html b/html/classCUtils_1_1dpCalc.html new file mode 100644 index 0000000..8f99ada --- /dev/null +++ b/html/classCUtils_1_1dpCalc.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CUtils.dpCalc Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CUtils.dpCalc Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CUtils.py
  • +
+
+ + + + diff --git a/html/classCUtils_1_1hackedL-members.html b/html/classCUtils_1_1hackedL-members.html new file mode 100644 index 0000000..ae8322a --- /dev/null +++ b/html/classCUtils_1_1hackedL-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CUtils.hackedL Member List
+
+
+ +

This is the complete list of members for CUtils.hackedL, including all inherited members.

+ + + + +
Activated(self) (defined in CUtils.hackedL)CUtils.hackedL
GetResources(self) (defined in CUtils.hackedL)CUtils.hackedL
IsActive(self) (defined in CUtils.hackedL)CUtils.hackedL
+ + + + diff --git a/html/classCUtils_1_1hackedL.html b/html/classCUtils_1_1hackedL.html new file mode 100644 index 0000000..204951b --- /dev/null +++ b/html/classCUtils_1_1hackedL.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CUtils.hackedL Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CUtils.hackedL Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CUtils.py
  • +
+
+ + + + diff --git a/html/classCUtils_1_1moveHandle-members.html b/html/classCUtils_1_1moveHandle-members.html new file mode 100644 index 0000000..76df121 --- /dev/null +++ b/html/classCUtils_1_1moveHandle-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CUtils.moveHandle Member List
+
+
+ +

This is the complete list of members for CUtils.moveHandle, including all inherited members.

+ + + + +
Activated(self) (defined in CUtils.moveHandle)CUtils.moveHandle
GetResources(self) (defined in CUtils.moveHandle)CUtils.moveHandle
IsActive(self) (defined in CUtils.moveHandle)CUtils.moveHandle
+ + + + diff --git a/html/classCUtils_1_1moveHandle.html b/html/classCUtils_1_1moveHandle.html new file mode 100644 index 0000000..f56cdc5 --- /dev/null +++ b/html/classCUtils_1_1moveHandle.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CUtils.moveHandle Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CUtils.moveHandle Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CUtils.py
  • +
+
+ + + + diff --git a/html/classCUtils_1_1moveWorkPlane-members.html b/html/classCUtils_1_1moveWorkPlane-members.html new file mode 100644 index 0000000..c1c9602 --- /dev/null +++ b/html/classCUtils_1_1moveWorkPlane-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CUtils.moveWorkPlane Member List
+
+
+ +

This is the complete list of members for CUtils.moveWorkPlane, including all inherited members.

+ + + + +
Activated(self) (defined in CUtils.moveWorkPlane)CUtils.moveWorkPlane
GetResources(self) (defined in CUtils.moveWorkPlane)CUtils.moveWorkPlane
IsActive(self) (defined in CUtils.moveWorkPlane)CUtils.moveWorkPlane
+ + + + diff --git a/html/classCUtils_1_1moveWorkPlane.html b/html/classCUtils_1_1moveWorkPlane.html new file mode 100644 index 0000000..2731e68 --- /dev/null +++ b/html/classCUtils_1_1moveWorkPlane.html @@ -0,0 +1,117 @@ + + + + + + + +Quetzal: CUtils.moveWorkPlane Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CUtils.moveWorkPlane Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+

Detailed Description

+
Tool to set the DraftWorkingPlane according existing geometry of
+the model.
+The normal of plane is set:
+* 1st according the selected face,
+* then according the plane defined by a curved edge,
+* at last according the plane defined by two straight edges.
+The origin is set:
+* 1st according the selected vertex,
+* then according the center of curvature of a curved edge,
+* at last according the intersection of two straight edges.
+

The documentation for this class was generated from the following file:
    +
  • CUtils.py
  • +
+
+ + + + diff --git a/html/classCUtils_1_1offsetWorkPlane-members.html b/html/classCUtils_1_1offsetWorkPlane-members.html new file mode 100644 index 0000000..79e9528 --- /dev/null +++ b/html/classCUtils_1_1offsetWorkPlane-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CUtils.offsetWorkPlane Member List
+
+
+ +

This is the complete list of members for CUtils.offsetWorkPlane, including all inherited members.

+ + + + +
Activated(self) (defined in CUtils.offsetWorkPlane)CUtils.offsetWorkPlane
GetResources(self) (defined in CUtils.offsetWorkPlane)CUtils.offsetWorkPlane
IsActive(self) (defined in CUtils.offsetWorkPlane)CUtils.offsetWorkPlane
+ + + + diff --git a/html/classCUtils_1_1offsetWorkPlane.html b/html/classCUtils_1_1offsetWorkPlane.html new file mode 100644 index 0000000..d68d299 --- /dev/null +++ b/html/classCUtils_1_1offsetWorkPlane.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CUtils.offsetWorkPlane Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CUtils.offsetWorkPlane Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CUtils.py
  • +
+
+ + + + diff --git a/html/classCUtils_1_1queryModel-members.html b/html/classCUtils_1_1queryModel-members.html new file mode 100644 index 0000000..30f3fc0 --- /dev/null +++ b/html/classCUtils_1_1queryModel-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CUtils.queryModel Member List
+
+
+ +

This is the complete list of members for CUtils.queryModel, including all inherited members.

+ + + + +
Activated(self) (defined in CUtils.queryModel)CUtils.queryModel
GetResources(self) (defined in CUtils.queryModel)CUtils.queryModel
IsActive(self) (defined in CUtils.queryModel)CUtils.queryModel
+ + + + diff --git a/html/classCUtils_1_1queryModel.html b/html/classCUtils_1_1queryModel.html new file mode 100644 index 0000000..b9b519c --- /dev/null +++ b/html/classCUtils_1_1queryModel.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CUtils.queryModel Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CUtils.queryModel Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CUtils.py
  • +
+
+ + + + diff --git a/html/classCUtils_1_1rotateWorkPlane-members.html b/html/classCUtils_1_1rotateWorkPlane-members.html new file mode 100644 index 0000000..869d088 --- /dev/null +++ b/html/classCUtils_1_1rotateWorkPlane-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CUtils.rotateWorkPlane Member List
+
+
+ +

This is the complete list of members for CUtils.rotateWorkPlane, including all inherited members.

+ + + + +
Activated(self) (defined in CUtils.rotateWorkPlane)CUtils.rotateWorkPlane
GetResources(self) (defined in CUtils.rotateWorkPlane)CUtils.rotateWorkPlane
IsActive(self) (defined in CUtils.rotateWorkPlane)CUtils.rotateWorkPlane
+ + + + diff --git a/html/classCUtils_1_1rotateWorkPlane.html b/html/classCUtils_1_1rotateWorkPlane.html new file mode 100644 index 0000000..e210508 --- /dev/null +++ b/html/classCUtils_1_1rotateWorkPlane.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CUtils.rotateWorkPlane Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CUtils.rotateWorkPlane Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CUtils.py
  • +
+
+ + + + diff --git a/html/classCUtils_1_1selectSolids-members.html b/html/classCUtils_1_1selectSolids-members.html new file mode 100644 index 0000000..67dbeef --- /dev/null +++ b/html/classCUtils_1_1selectSolids-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
CUtils.selectSolids Member List
+
+
+ +

This is the complete list of members for CUtils.selectSolids, including all inherited members.

+ + + + +
Activated(self) (defined in CUtils.selectSolids)CUtils.selectSolids
GetResources(self) (defined in CUtils.selectSolids)CUtils.selectSolids
IsActive(self) (defined in CUtils.selectSolids)CUtils.selectSolids
+ + + + diff --git a/html/classCUtils_1_1selectSolids.html b/html/classCUtils_1_1selectSolids.html new file mode 100644 index 0000000..122469a --- /dev/null +++ b/html/classCUtils_1_1selectSolids.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: CUtils.selectSolids Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
CUtils.selectSolids Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

IsActive (self)
 
Activated (self)
 
GetResources (self)
 
+
The documentation for this class was generated from the following file:
    +
  • CUtils.py
  • +
+
+ + + + diff --git a/html/classInitGui_1_1QuetzalWorkbench-members.html b/html/classInitGui_1_1QuetzalWorkbench-members.html new file mode 100644 index 0000000..1bb1edd --- /dev/null +++ b/html/classInitGui_1_1QuetzalWorkbench-members.html @@ -0,0 +1,101 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
InitGui.QuetzalWorkbench Member List
+
+
+ +

This is the complete list of members for InitGui.QuetzalWorkbench, including all inherited members.

+ + + + + + + + + + + + +
__init__(self) (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbench
Activated(self) (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbench
ContextMenu(self, recipient) (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbench
Deactivated(self) (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbench
frameList (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbench
Initialize(self)InitGui.QuetzalWorkbench
pypeList (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbench
qm (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbench
Snapper (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbenchstatic
utilsList (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbench
v (defined in InitGui.QuetzalWorkbench)InitGui.QuetzalWorkbenchstatic
+ + + + diff --git a/html/classInitGui_1_1QuetzalWorkbench.html b/html/classInitGui_1_1QuetzalWorkbench.html new file mode 100644 index 0000000..079d317 --- /dev/null +++ b/html/classInitGui_1_1QuetzalWorkbench.html @@ -0,0 +1,178 @@ + + + + + + + +Quetzal: InitGui.QuetzalWorkbench Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
InitGui.QuetzalWorkbench Class Reference
+
+
+
+Inheritance diagram for InitGui.QuetzalWorkbench:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for InitGui.QuetzalWorkbench:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + +

+Public Member Functions

__init__ (self)
 
 Initialize (self)
 
ContextMenu (self, recipient)
 
Activated (self)
 
Deactivated (self)
 
+ + + + + + + + + +

+Public Attributes

utilsList
 
frameList
 
pypeList
 
qm
 
+ + + + + +

+Static Public Attributes

Snapper
 
v = sys.version_info[0]
 
+

Member Function Documentation

+ +

◆ Initialize()

+ +
+
+ + + + + + + + +
InitGui.QuetzalWorkbench.Initialize ( self)
+
+
This function is called at the first activation of the workbench,
+here is the place to import all the commands.
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • InitGui.py
  • +
+
+ + + + diff --git a/html/classInitGui_1_1QuetzalWorkbench__coll__graph.map b/html/classInitGui_1_1QuetzalWorkbench__coll__graph.map new file mode 100644 index 0000000..f5b9cdf --- /dev/null +++ b/html/classInitGui_1_1QuetzalWorkbench__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classInitGui_1_1QuetzalWorkbench__coll__graph.md5 b/html/classInitGui_1_1QuetzalWorkbench__coll__graph.md5 new file mode 100644 index 0000000..5c29936 --- /dev/null +++ b/html/classInitGui_1_1QuetzalWorkbench__coll__graph.md5 @@ -0,0 +1 @@ +9509f1a9452c9a8087958ea9565936a3 \ No newline at end of file diff --git a/html/classInitGui_1_1QuetzalWorkbench__coll__graph.png b/html/classInitGui_1_1QuetzalWorkbench__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f2908954efa210529b3eea1c7bcc5204bf285ec7 GIT binary patch literal 5043 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 literal 0 HcmV?d00001 diff --git a/html/classInitGui_1_1QuetzalWorkbench__inherit__graph.map b/html/classInitGui_1_1QuetzalWorkbench__inherit__graph.map new file mode 100644 index 0000000..f5b9cdf --- /dev/null +++ b/html/classInitGui_1_1QuetzalWorkbench__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classInitGui_1_1QuetzalWorkbench__inherit__graph.md5 b/html/classInitGui_1_1QuetzalWorkbench__inherit__graph.md5 new file mode 100644 index 0000000..5c29936 --- /dev/null +++ b/html/classInitGui_1_1QuetzalWorkbench__inherit__graph.md5 @@ -0,0 +1 @@ +9509f1a9452c9a8087958ea9565936a3 \ No newline at end of file diff --git a/html/classInitGui_1_1QuetzalWorkbench__inherit__graph.png b/html/classInitGui_1_1QuetzalWorkbench__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f2908954efa210529b3eea1c7bcc5204bf285ec7 GIT binary patch literal 5043 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 literal 0 HcmV?d00001 diff --git a/html/classanyShapez_1_1AnyThing-members.html b/html/classanyShapez_1_1AnyThing-members.html new file mode 100644 index 0000000..2e99c54 --- /dev/null +++ b/html/classanyShapez_1_1AnyThing-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
anyShapez.AnyThing Member List
+
+
+ +

This is the complete list of members for anyShapez.AnyThing, including all inherited members.

+ + + + +
__init__(self, obj, name="valve", fileName="ballDN15.stp", ports="0:0:0") (defined in anyShapez.AnyThing)anyShapez.AnyThing
execute(self, fp) (defined in anyShapez.AnyThing)anyShapez.AnyThing
onChanged(self, fp, prop) (defined in anyShapez.AnyThing)anyShapez.AnyThing
+ + + + diff --git a/html/classanyShapez_1_1AnyThing.html b/html/classanyShapez_1_1AnyThing.html new file mode 100644 index 0000000..6aa7432 --- /dev/null +++ b/html/classanyShapez_1_1AnyThing.html @@ -0,0 +1,225 @@ + + + + + + + +Quetzal: anyShapez.AnyThing Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
anyShapez.AnyThing Class Reference
+
+
+
+Inheritance diagram for anyShapez.AnyThing:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for anyShapez.AnyThing:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, name="valve", fileName="ballDN15.stp", ports="0:0:0")
 
onChanged (self, fp, prop)
 
 execute (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + +

+Additional Inherited Members

- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object TType="Anything"
+AnyThing(obj,name="Thing", fileName="", ports="0:0:0")
+  obj: the "App::FeaturePython object"
+  TType (string): name of the thing
+  FileName (string): a valid .STEP .IGES or .brep
+  ports: a string in the form "x0:y0:z0/x1:y1:z1/..." representing the position of ports 0,1....
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
anyShapez.AnyThing.__init__ ( self,
 obj,
 name = "valve",
 fileName = "ballDN15.stp",
 ports = "0:0:0" 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
anyShapez.AnyThing.execute ( self,
 fp 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • anyShapez.py
  • +
+
+ + + + diff --git a/html/classanyShapez_1_1AnyThing__coll__graph.map b/html/classanyShapez_1_1AnyThing__coll__graph.map new file mode 100644 index 0000000..a0f14fa --- /dev/null +++ b/html/classanyShapez_1_1AnyThing__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classanyShapez_1_1AnyThing__coll__graph.md5 b/html/classanyShapez_1_1AnyThing__coll__graph.md5 new file mode 100644 index 0000000..ce83a58 --- /dev/null +++ b/html/classanyShapez_1_1AnyThing__coll__graph.md5 @@ -0,0 +1 @@ +0ff31ae6b1788472fc561461a1c4b1e4 \ No newline at end of file diff --git a/html/classanyShapez_1_1AnyThing__coll__graph.png b/html/classanyShapez_1_1AnyThing__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6f8d10dbc60bbd69b75d4cde44a8745410ed7773 GIT binary patch literal 5941 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 literal 0 HcmV?d00001 diff --git a/html/classanyShapez_1_1AnyThing__inherit__graph.map b/html/classanyShapez_1_1AnyThing__inherit__graph.map new file mode 100644 index 0000000..a0f14fa --- /dev/null +++ b/html/classanyShapez_1_1AnyThing__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classanyShapez_1_1AnyThing__inherit__graph.md5 b/html/classanyShapez_1_1AnyThing__inherit__graph.md5 new file mode 100644 index 0000000..ce83a58 --- /dev/null +++ b/html/classanyShapez_1_1AnyThing__inherit__graph.md5 @@ -0,0 +1 @@ +0ff31ae6b1788472fc561461a1c4b1e4 \ No newline at end of file diff --git a/html/classanyShapez_1_1AnyThing__inherit__graph.png b/html/classanyShapez_1_1AnyThing__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6f8d10dbc60bbd69b75d4cde44a8745410ed7773 GIT binary patch literal 5941 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 literal 0 HcmV?d00001 diff --git a/html/classanyShapez_1_1shapezDialog-members.html b/html/classanyShapez_1_1shapezDialog-members.html new file mode 100644 index 0000000..909ce7d --- /dev/null +++ b/html/classanyShapez_1_1shapezDialog-members.html @@ -0,0 +1,101 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
anyShapez.shapezDialog Member List
+
+
+ +

This is the complete list of members for anyShapez.shapezDialog, including all inherited members.

+ + + + + + + + + + + + +
__init__(self) (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
accept(self) (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
checkListed (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
checkListed(self) (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
cwd (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
filesListed (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
fillFiles (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
fillFiles(self) (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
lastThing (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
pipeDictList (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
shapesDir (defined in anyShapez.shapezDialog)anyShapez.shapezDialog
+ + + + diff --git a/html/classanyShapez_1_1shapezDialog.html b/html/classanyShapez_1_1shapezDialog.html new file mode 100644 index 0000000..0bf6f78 --- /dev/null +++ b/html/classanyShapez_1_1shapezDialog.html @@ -0,0 +1,243 @@ + + + + + + + +Quetzal: anyShapez.shapezDialog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
anyShapez.shapezDialog Class Reference
+
+
+
+Inheritance diagram for anyShapez.shapezDialog:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for anyShapez.shapezDialog:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 accept (self)
 
fillFiles (self)
 
checkListed (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
selectAction (self)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
reject (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

shapesDir
 
cwd
 
pipeDictList
 
filesListed
 
lastThing
 
fillFiles
 
checkListed
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
selectAction
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
anyShapez.shapezDialog.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
anyShapez.shapezDialog.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • anyShapez.py
  • +
+
+ + + + diff --git a/html/classanyShapez_1_1shapezDialog__coll__graph.map b/html/classanyShapez_1_1shapezDialog__coll__graph.map new file mode 100644 index 0000000..9b6f464 --- /dev/null +++ b/html/classanyShapez_1_1shapezDialog__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classanyShapez_1_1shapezDialog__coll__graph.md5 b/html/classanyShapez_1_1shapezDialog__coll__graph.md5 new file mode 100644 index 0000000..6ea3d08 --- /dev/null +++ b/html/classanyShapez_1_1shapezDialog__coll__graph.md5 @@ -0,0 +1 @@ +b2c0114c4de5a8a14430b910d87a8161 \ No newline at end of file diff --git a/html/classanyShapez_1_1shapezDialog__coll__graph.png b/html/classanyShapez_1_1shapezDialog__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9d7e6ae472d16a9af430b292f48b57f755817d GIT binary patch literal 7006 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 + + + + + + diff --git a/html/classanyShapez_1_1shapezDialog__inherit__graph.md5 b/html/classanyShapez_1_1shapezDialog__inherit__graph.md5 new file mode 100644 index 0000000..6ea3d08 --- /dev/null +++ b/html/classanyShapez_1_1shapezDialog__inherit__graph.md5 @@ -0,0 +1 @@ +b2c0114c4de5a8a14430b910d87a8161 \ No newline at end of file diff --git a/html/classanyShapez_1_1shapezDialog__inherit__graph.png b/html/classanyShapez_1_1shapezDialog__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9d7e6ae472d16a9af430b292f48b57f755817d GIT binary patch literal 7006 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
cut_list.cut_list_commands.cutListCommand Member List
+
+ + + + + diff --git a/html/classcut__list_1_1cut__list__commands_1_1cutListCommand.html b/html/classcut__list_1_1cut__list__commands_1_1cutListCommand.html new file mode 100644 index 0000000..96854b9 --- /dev/null +++ b/html/classcut__list_1_1cut__list__commands_1_1cutListCommand.html @@ -0,0 +1,134 @@ + + + + + + + +Quetzal: cut_list.cut_list_commands.cutListCommand Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
cut_list.cut_list_commands.cutListCommand Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

GetResources (self)
 
Activated (self)
 
 IsActive (self)
 
+ + + + + +

+Static Public Attributes

+str toolbarName = "Cut List"
 
+str commandName = "createCutList"
 
+

Member Function Documentation

+ +

◆ IsActive()

+ +
+
+ + + + + + + + +
cut_list.cut_list_commands.cutListCommand.IsActive ( self)
+
+
If there is no active document we can't do anything.
+
+
+
The documentation for this class was generated from the following file:
    +
  • cut_list/cut_list_commands.py
  • +
+
+ + + + diff --git a/html/classcut__list_1_1cut__list__creation_1_1Beam-members.html b/html/classcut__list_1_1cut__list__creation_1_1Beam-members.html new file mode 100644 index 0000000..74dfd83 --- /dev/null +++ b/html/classcut__list_1_1cut__list__creation_1_1Beam-members.html @@ -0,0 +1,97 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
cut_list.cut_list_creation.Beam Member List
+
+ + + + + diff --git a/html/classcut__list_1_1cut__list__creation_1_1Beam.html b/html/classcut__list_1_1cut__list__creation_1_1Beam.html new file mode 100644 index 0000000..54aa6db --- /dev/null +++ b/html/classcut__list_1_1cut__list__creation_1_1Beam.html @@ -0,0 +1,178 @@ + + + + + + + +Quetzal: cut_list.cut_list_creation.Beam Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
cut_list.cut_list_creation.Beam Class Reference
+
+
+
+Collaboration diagram for cut_list.cut_list_creation.Beam:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + +

+Public Member Functions

 addCut (self, cut)
 
 getCutsAsDict (self)
 
lengthUsed (self)
 
+ + + + + + + + + +

+Static Public Attributes

+int number
 
+object length
 
+object lengthLeft
 
+List cuts [Cut]
 
+

Detailed Description

+
Store the Information about the Stock Material Beam and provide Helper Functions

Member Function Documentation

+ +

◆ addCut()

+ +
+
+ + + + + + + + + + + + + + + + + + +
cut_list.cut_list_creation.Beam.addCut ( self,
 cut 
)
+
+
Try to fit the cut piece on the Beam and provide a status if it fits
+
+
+ +

◆ getCutsAsDict()

+ +
+
+ + + + + + + + +
cut_list.cut_list_creation.Beam.getCutsAsDict ( self)
+
+
Get a easy to work with Dict List of the Beams / Cuts
+
+
+
The documentation for this class was generated from the following file:
    +
  • cut_list/cut_list_creation.py
  • +
+
+ + + + diff --git a/html/classcut__list_1_1cut__list__creation_1_1Beam__coll__graph.map b/html/classcut__list_1_1cut__list__creation_1_1Beam__coll__graph.map new file mode 100644 index 0000000..cd847d1 --- /dev/null +++ b/html/classcut__list_1_1cut__list__creation_1_1Beam__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classcut__list_1_1cut__list__creation_1_1Beam__coll__graph.md5 b/html/classcut__list_1_1cut__list__creation_1_1Beam__coll__graph.md5 new file mode 100644 index 0000000..14a9cae --- /dev/null +++ b/html/classcut__list_1_1cut__list__creation_1_1Beam__coll__graph.md5 @@ -0,0 +1 @@ +57a687e9eb674a5b48f817c579486ccb \ No newline at end of file diff --git a/html/classcut__list_1_1cut__list__creation_1_1Beam__coll__graph.png b/html/classcut__list_1_1cut__list__creation_1_1Beam__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d90b389b19617fd48621965807b0f57971b7a849 GIT binary patch literal 4246 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 b(d7rS_4nf1BND)m29TDTzG~T{XRrSQb8lQ* literal 0 HcmV?d00001 diff --git a/html/classcut__list_1_1cut__list__creation_1_1Cut-members.html b/html/classcut__list_1_1cut__list__creation_1_1Cut-members.html new file mode 100644 index 0000000..7c99046 --- /dev/null +++ b/html/classcut__list_1_1cut__list__creation_1_1Cut-members.html @@ -0,0 +1,103 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
cut_list.cut_list_creation.Cut Member List
+
+ + + + + diff --git a/html/classcut__list_1_1cut__list__creation_1_1Cut.html b/html/classcut__list_1_1cut__list__creation_1_1Cut.html new file mode 100644 index 0000000..8c739ec --- /dev/null +++ b/html/classcut__list_1_1cut__list__creation_1_1Cut.html @@ -0,0 +1,180 @@ + + + + + + + +Quetzal: cut_list.cut_list_creation.Cut Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
cut_list.cut_list_creation.Cut Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

 getKey (self)
 
totalLength (self)
 
 getRow (self)
 
+ + + + + + + + + + + +

+Public Attributes

label
 
profil
 
length
 
cutwidth
 
position
 
+ + + + + + + + + + + +

+Static Public Attributes

+str label
 
+str profil
 
+object length
 
+object cutwidth
 
+int position = 0
 
+

Detailed Description

+
Store the Information about the cut Piece and provide Helper Functions

Member Function Documentation

+ +

◆ getKey()

+ +
+
+ + + + + + + + +
cut_list.cut_list_creation.Cut.getKey ( self)
+
+
Provide a Key to generate the Position Number
+
+
+ +

◆ getRow()

+ +
+
+ + + + + + + + +
cut_list.cut_list_creation.Cut.getRow ( self)
+
+
Provide the Information from the Cut Piece in the form of a dict
+
+
+
The documentation for this class was generated from the following file:
    +
  • cut_list/cut_list_creation.py
  • +
+
+ + + + diff --git a/html/classcut__list_1_1cut__list__ui_1_1cutListUI-members.html b/html/classcut__list_1_1cut__list__ui_1_1cutListUI-members.html new file mode 100644 index 0000000..65a3e8b --- /dev/null +++ b/html/classcut__list_1_1cut__list__ui_1_1cutListUI-members.html @@ -0,0 +1,98 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
cut_list.cut_list_ui.cutListUI Member List
+
+ + + + + diff --git a/html/classcut__list_1_1cut__list__ui_1_1cutListUI.html b/html/classcut__list_1_1cut__list__ui_1_1cutListUI.html new file mode 100644 index 0000000..45ba962 --- /dev/null +++ b/html/classcut__list_1_1cut__list__ui_1_1cutListUI.html @@ -0,0 +1,194 @@ + + + + + + + +Quetzal: cut_list.cut_list_ui.cutListUI Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
cut_list.cut_list_ui.cutListUI Class Reference
+
+
+ + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self)
 
 selectProfilefromSelection (self)
 
 useNestingToggle (self)
 
 UpdateProfileList (self)
 
 accept (self)
 
reject (self)
 
+ + + + + +

+Public Attributes

form
 
useNestingToggle
 
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
cut_list.cut_list_ui.cutListUI.accept ( self)
+
+
Start the Creation of the Cut List
+
+
+ +

◆ selectProfilefromSelection()

+ +
+
+ + + + + + + + +
cut_list.cut_list_ui.cutListUI.selectProfilefromSelection ( self)
+
+
Select the selected Profile if some is used
+
+
+ +

◆ UpdateProfileList()

+ +
+
+ + + + + + + + +
cut_list.cut_list_ui.cutListUI.UpdateProfileList ( self)
+
+
Add all Sketches/Profiles/Sections that can be used for the Beam Creation
+
+
+ +

◆ useNestingToggle()

+ +
+
+ + + + + + + + +
cut_list.cut_list_ui.cutListUI.useNestingToggle ( self)
+
+
Toggle the Nesting Options depending on the Need
+
+
+
The documentation for this class was generated from the following file:
    +
  • cut_list/cut_list_ui.py
  • +
+
+ + + + diff --git a/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet-members.html b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet-members.html new file mode 100644 index 0000000..a17cfcd --- /dev/null +++ b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet-members.html @@ -0,0 +1,107 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
cut_list.resultSpreadsheet.ResultSpreadsheet Member List
+
+
+ +

This is the complete list of members for cut_list.resultSpreadsheet.ResultSpreadsheet, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
__init__(self, spreadsheet, columnLabels) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
clearAll(self) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
clearColumn(self, columnToDelete, maxLineNumber) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
clearLine(self, lineNumberToDelete) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
clearUnusedCells(self, column, line) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
columnLabels (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
getColumnName(self, label) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
lineNumber (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
maxColumn (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
printColumnLabels(self) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
printEmptyLine(self) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
printHeader(self, header="HAEADER") (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
printRows(self, rows) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
recompute(self) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
setCellValue(self, cell, value) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
spreadsheet (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
updateMaxColumn(self, columnName) (defined in cut_list.resultSpreadsheet.ResultSpreadsheet)cut_list.resultSpreadsheet.ResultSpreadsheet
+ + + + diff --git a/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet.html b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet.html new file mode 100644 index 0000000..63c32ae --- /dev/null +++ b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet.html @@ -0,0 +1,172 @@ + + + + + + + +Quetzal: cut_list.resultSpreadsheet.ResultSpreadsheet Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
cut_list.resultSpreadsheet.ResultSpreadsheet Class Reference
+
+
+
+Inheritance diagram for cut_list.resultSpreadsheet.ResultSpreadsheet:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for cut_list.resultSpreadsheet.ResultSpreadsheet:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, spreadsheet, columnLabels)
 
getColumnName (self, label)
 
clearAll (self)
 
printEmptyLine (self)
 
printHeader (self, header="HAEADER")
 
printColumnLabels (self)
 
printRows (self, rows)
 
setCellValue (self, cell, value)
 
recompute (self)
 
updateMaxColumn (self, columnName)
 
clearUnusedCells (self, column, line)
 
clearLine (self, lineNumberToDelete)
 
clearColumn (self, columnToDelete, maxLineNumber)
 
+ + + + + + + + + +

+Public Attributes

spreadsheet
 
lineNumber
 
maxColumn
 
columnLabels
 
+
The documentation for this class was generated from the following file:
    +
  • cut_list/resultSpreadsheet.py
  • +
+
+ + + + diff --git a/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__coll__graph.map b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__coll__graph.map new file mode 100644 index 0000000..5e1ee38 --- /dev/null +++ b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__coll__graph.md5 b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__coll__graph.md5 new file mode 100644 index 0000000..51db1b5 --- /dev/null +++ b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__coll__graph.md5 @@ -0,0 +1 @@ +674eff2370ff00b53e1bfc3a6a0ead72 \ No newline at end of file diff --git a/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__coll__graph.png b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7a190425767e8d13d5d922a22e187ecf533a61 GIT binary patch literal 5988 zcmd6Li9eL>+qagRy0a8YM8sH=bx_vsn=l9!%94Fwl6}t_)!4_7U6zn723fKuVl3JB zJ?oHt&v*{M=Y2o#`}_yb$GB!bGuL%q=XIXnXn|QzS zP1^(7P-=C59zofZp)VXCwUy+Q(zTUzyi&QcmE^~A zA>co+#$W8i5+n*PGfi(VYsX?%nL=uEG(L@5Sy@@YXEw)jHFG_h;KVF=BO zXFe-a>c$wZhzPq1XYEoNHToRP#UYW%Aqn!3tP(ep0D<8*nODx=c>CXn`1^#xq6Lha zbg|p@#&gstVgGmU-u)!(WW+A~`t@@0=ZA}-iWSVPR*XLmcL?z^zQl?Z0`{r?^p7aE z*%JPSBt-@?Azz|*KtMpVnE@TYer93e3%yU{!f~cM=Lm5T3T}5 z?2L@Sjzlq>_kp9n&yFU;jT_jKD88=UwaG4J{u((gt!s6}ouZ|sC3-F5CY~SXIHx4N zKXs1e6>%%oX||c7+-_7}M~C6wy?az2$|m($t(qUHs!~e0uCUy`jW)x_MkOZVo5OB& z3=CH|u&Ju5<{Q+dl#~cPe)2>xUWLSa<2zm7zyJ^7#c;{%K?C39(o*C=;dA^4*${W) z!2)&@rnWW9eDc1jNlxE$iJkJMO;hSl+i^zKGS-)RcbtGP|^N@xHP$`myK_LxJ~p76RAX+sHgTJZ_<= z?Z0l2T9=LF+jb`11E~ER9Bdh{cH7w4pf9gMygjo*g|5h^=j`t8mXniPAJDbu#+Tbq zs;a1vU%7Intt24eEV~0-`R(;3y8Vg0TCo|Tv55&cFRy89G<#-NR#ZYl8}|0o_03II z9-enYL(fF*CsYg!m`T{#*=es`J9`c_I5zf2An{KDd$f5{MMcGDw>ACUm0?+DXQZ%2 z=dX+iY2&pCD4a=WC%9*EaWMjch)hZ8++7`wm-5>Ed<<~fm=0my>{ejD!oZ;P_%XG= zzrTit#?-H0K^P3p(eCQ(_EK+9aIld5grruHepp?d3<>NppdmUTfhQ#;OxVFgG&~xE zsdOP+%gV}9jF!{TpzZ9Obl&(qUVV{*;z3@&Bf$6L!^GgCqN2xqcp(61+oYhNAUuKN z(XQRLrxdJ@ySqEroP&ddUZvyfcklj&J%1Axrde)K?RrN|`T#LEH&;|7ueTxYU`O0u}ikn4vJA7H}a6>3qV+!cYnS^rRCwQ5jj!aT<>fOc zdz#U$6M`2fFYh5K=Y6U0FL?UvC1T7jQmOF^tuSE>RS{uudz50?SXpnrl51QP=kt%awEt$-ke`BrqO`1xLRZ?l zXMcZRvd`~)Lw8weX=sJsSnq{^Fu9)pd*FE9V>?j$|{&?%? z>S6<Zfq>KUh@t~N@AS*cCs^Q zu$3)ye36PO!e~RAK;wsx<9C{>KO-qAnUkA)OIR2a8cII5Wy&q8JU6=$Uo!8HG5;LM z%EqQ$<0-;}eFumd86Dl&+QL<=mYCryJa>4&m?1bhWh}Y+`uf&Efs0LADEq8MKxXy6 zx_8f4!Jhx<=y*_|#fBHE+yBo0CL+S(U~^6}x@is{cd(Uu($4RDpuFvQoZ~WLU3z_X zcDA*vi<6!G_4@kDk7}vXD~Z*xA!B2DNCt{i2f)uCp^Y=Y!pLarl&JUoxpt*vR>|7L zgg$XSMCRq@FO-mw&?145k(TBM07>y&<~G&-2p&VF#Yi2BsIs!MqN?h#o?bii$-Y8Q zZ!dU^m5Ca!z9Bt5J>J-eJqv3DmA6{PAfeJ}f%3LizB->6*unRrb|ZnmN6Z0EcO@j8 zc2~4@baY<2x|%lx{3W_((VhMvr{9`nnLx-bEaYHi4JfK3CiL_?hADGk-ogqv0w z4rmqXp=4#x9qp|xlnv^eOxF7RD9O*qL`SD5RYLu=mRj|4adTG|iBc>tE~b@~L_=K# z1O}e!Fo}zc3sOw%b{sky!F>{3%oOt1rE62m%YWZDHATQ;17`Ay!$fvNmi)Vr$;rt% z8a!j;<1K6{WKa>qUp<6@F&2*ZCbNr+qhMih_<-Wy7V2JJ648hafYSQ{nrqkOeSJ?V z`mNp~Q0=KQsRvsN=hUA+?*Nzj=FJ;*=}=kz9e5xZ`xIb4N4pNN3}?@ted*+sQC6lo z9MWys^!@wy73tZD!uW zFTaz|_>hqytF8a^sYQ7W27?(En-5(4{kwT|RJU@XC^y%LFi;@5`Gd`}Y~%`|hp@A~ zy?vRQTFCkcfno&$OG{(HRRIbL2CNE>Whugd_2{%?JEYTY-MXa`FZ5SnLmF>hPR>;I zW_DJfJndlrb})FZ{Qv-P`d zFFpdC?6<1Df`?0ab!g@KdkiHnPb!`q4s%*RSV+ZrY?| zM)h0`y^5Fqot>&Pv$NRM)5x>r4BYE5-%bx}6AxA6Q-;duo?2OHU+T?{m-Z3Y)YMFp z^oY)Vl6`h+X$j@%C{*pbYCK$G=Ir9)u)jVn$V{f3|J}S`Y1hV zXU$EJ3G=QL3UbDEnE344T2UW86Vs_-1-Cp_;cyOqhfo2OsYNIqAbwb-XP5 z2aK5s4mZ)UvDZM9Y7b}7{KQvln~yj@upo8&J=g!G3NW;qoCn%YHYFE zzqk;PCY;Tzmxre(&z@R=QtqY8f}>a}Z&W8Mz34+;r^$YQl7P%Fa7V+DNg zv065`!qogm`gr@v$jFHM;ZpW0Q=0&P?SA@00v#=FWOVeu8X7U*cT|(^{-dTwr6#%2 z6d1I}-17UJC?`5Nm^3c}&57RJ+!UmkK2fvYa(B!T4r71)`n5NVRA2Ap4$zK{js{a* zrYxDQn%roKq^vgm>byi9$8YelrY3o6%J3S$zU^+G(tfk0&*CCSNBqai%6NEwGs9HS z%(|oTwF=kOgy%E#OS=1zu>b57`Lat&Cbiu3BIoDlKgGA5UBPo>XJ^cgil|j5Qb1ta zcwO8ZL^dWSMqN+Oc6U@2N;X?9^>kn$51{t-^>q@`lxk*~S4m(qKs!-tYMd-AB!1sQ zsAlKp%tZUxWMop=m1EzBO}+L%xbxt_gYBIi5NxvgV2T@eeTkA#y$}&-{q8x(9YZ`>Jm#ZTpNl8i1N=)Al|DaMX*5+Z(rDEE7<(h+X`bhr? zhr={C%i}zd0N!77bAU@_NdF)ZVw2u9nAY?45O*rQ_V^;CcCQ;58G$V64wn}ehM!&} zE?>P%MMY)N97+#CC^|kKWp2&^scX?${1k*wpT?CGDrG$mc7w#a-sMZgfcij!+gM*W zYzb#t-0{r%Gu03ngT)qGcC&*2%P+Trp_IrW)-p({mV2Iwnz9y(CtgwQy@r=*+>DARR)$DJl%5hP{ z)m3z@X747*r}&d>RkOqGC0@OXNP1y&E&@C$n4%B_s;Q;riGe}a#%znn@5%*|_u?*} zhI>DQV?*2ZEIFHF>Yc@zymnU}&3|OP=NNSLwpL_pEGhXP9b#`PQA2xDClwZuXX_Cx z0v8WYdVYQ=2%YY#z0Dlk&a|mOZgg{RF9y7p3I`3qeg^hLv8O(bR68~|H+Onv7zb(g z!7u<)yYfY6XXiW^IVkWTm||pPq`*vQ}be6R9 zaiHM0`jGvJ+{!&lE=J`<;G=sk%d}W577Xjp-deKMO0@93kC`VpC@>oJPGYz0ef<|8g`m=rK$BQ=?e6~yjvH|nE zv-5#1v2+g!D`aYJzFFjZtW57I1N{aF24Frpq4klI!v#wW=m+{c(k#DC0s)x2W=j&`KH!*?QJ&Su)loyvR{KC3omadoxb}SPEJm+c&E)cB9Vv` z6{V)8PXE)1bKfuql(clc+7$-lo05`Z9w#W#&IO0nUME=nkEOpVCRZYF!*1TnqE_=AZ``sHntrCx(U; zy}YW2x0l1iDH#|Tz=zO_a^NkI>4OAdhU>e**akN=1?2(IaSNmo?k69A!X;{I5yMT{ z4LKa91Um!4%a?O+!X_jbBF57$;*>1&`SKSZeS3>i*G~vdudx^ z8Vu8Nb1#BF03H9=!=sX#iu`NK2S{76v48&j$;r=e8XSD;ft1uq4W;c;v_C1P9eox7 zQtMbjb~Yo-F$Ia*N;MR)vSqr>G1Ov-61G~iI^Uqru_M)CinH$L@d{xHJ?HT8|FwPp z$EUEv?Uh#sGj}eWECsWN@!~D~ELJb0S?)4om0U(A1piMjI)EiK`-E&Ija-Xor>YCu P<|L>Gs&a+@8V39q)Y#{T literal 0 HcmV?d00001 diff --git a/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__inherit__graph.map b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__inherit__graph.map new file mode 100644 index 0000000..5e1ee38 --- /dev/null +++ b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__inherit__graph.md5 b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__inherit__graph.md5 new file mode 100644 index 0000000..51db1b5 --- /dev/null +++ b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__inherit__graph.md5 @@ -0,0 +1 @@ +674eff2370ff00b53e1bfc3a6a0ead72 \ No newline at end of file diff --git a/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__inherit__graph.png b/html/classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7a190425767e8d13d5d922a22e187ecf533a61 GIT binary patch literal 5988 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 P<|L>Gs&a+@8V39q)Y#{T literal 0 HcmV?d00001 diff --git a/html/classdodoDialogs_1_1protoPypeForm-members.html b/html/classdodoDialogs_1_1protoPypeForm-members.html new file mode 100644 index 0000000..8272b8a --- /dev/null +++ b/html/classdodoDialogs_1_1protoPypeForm-members.html @@ -0,0 +1,112 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoDialogs.protoPypeForm Member List
+
+
+ +

This is the complete list of members for dodoDialogs.protoPypeForm, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
__init__(self, winTitle="Title", PType="Pipe", PRating="SCH-STD", icon="dodo.svg", x=100, y=350)dodoDialogs.protoPypeForm
btn1 (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
changeRating (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
changeRating(self, item) (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
combo (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
combostandart (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
currentRatingLab (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
fileList (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
fillSizes(self) (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
findDN(self, DN) (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
firstCol (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
mainHL (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
mw (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
pipeDictList (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
PRating (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
PRatingsList (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
PType (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
ratingList (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
secondCol (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
setCurrentPL (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
setCurrentPL(self, PLName=None) (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
sizeList (defined in dodoDialogs.protoPypeForm)dodoDialogs.protoPypeForm
+ + + + diff --git a/html/classdodoDialogs_1_1protoPypeForm.html b/html/classdodoDialogs_1_1protoPypeForm.html new file mode 100644 index 0000000..e33b974 --- /dev/null +++ b/html/classdodoDialogs_1_1protoPypeForm.html @@ -0,0 +1,274 @@ + + + + + + + +Quetzal: dodoDialogs.protoPypeForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoDialogs.protoPypeForm Class Reference
+
+
+
+Inheritance diagram for dodoDialogs.protoPypeForm:
+
+
Inheritance graph
+ + + + + + + + + + + + + + + + + + + + + + + +
[legend]
+
+Collaboration diagram for dodoDialogs.protoPypeForm:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, winTitle="Title", PType="Pipe", PRating="SCH-STD", icon="dodo.svg", x=100, y=350)
 
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dodoDialogs.protoPypeForm.__init__ ( self,
 winTitle = "Title",
 PType = "Pipe",
 PRating = "SCH-STD",
 icon = "dodo.svg",
 x = 100,
 y = 350 
)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented in pForms.insertPipeForm, pForms.insertElbowForm, pForms.insertFlangeForm, pForms.insertReductForm, pForms.insertUboltForm, pForms.insertCapForm, pForms.insertPypeLineForm, pForms.insertBranchForm, and pForms.insertValveForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • dodoDialogs.py
  • +
+
+ + + + diff --git a/html/classdodoDialogs_1_1protoPypeForm__coll__graph.map b/html/classdodoDialogs_1_1protoPypeForm__coll__graph.map new file mode 100644 index 0000000..d9e3107 --- /dev/null +++ b/html/classdodoDialogs_1_1protoPypeForm__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classdodoDialogs_1_1protoPypeForm__coll__graph.md5 b/html/classdodoDialogs_1_1protoPypeForm__coll__graph.md5 new file mode 100644 index 0000000..e46a271 --- /dev/null +++ b/html/classdodoDialogs_1_1protoPypeForm__coll__graph.md5 @@ -0,0 +1 @@ +bf514d30efe7292fdb20b9c3f07984cf \ No newline at end of file diff --git a/html/classdodoDialogs_1_1protoPypeForm__coll__graph.png b/html/classdodoDialogs_1_1protoPypeForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..94e2a0543edd285c3d8e8a99a8db36be3ba1599b GIT binary patch literal 4822 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 literal 0 HcmV?d00001 diff --git a/html/classdodoDialogs_1_1protoPypeForm__inherit__graph.map b/html/classdodoDialogs_1_1protoPypeForm__inherit__graph.map new file mode 100644 index 0000000..503e352 --- /dev/null +++ b/html/classdodoDialogs_1_1protoPypeForm__inherit__graph.map @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/classdodoDialogs_1_1protoPypeForm__inherit__graph.md5 b/html/classdodoDialogs_1_1protoPypeForm__inherit__graph.md5 new file mode 100644 index 0000000..a685ef1 --- /dev/null +++ b/html/classdodoDialogs_1_1protoPypeForm__inherit__graph.md5 @@ -0,0 +1 @@ +dbf95bec452f449a1c7c5824174e4036 \ No newline at end of file diff --git a/html/classdodoDialogs_1_1protoPypeForm__inherit__graph.png b/html/classdodoDialogs_1_1protoPypeForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..97bc32dd3597bbde754fafe4b507d1db485eda1a GIT binary patch literal 41732 zcmZ6z1yEMo8!wCk3W9_Pyh;g3qvWAOkp?O0?h+4vF`mfT0hE5hQ$`-%NnSJ2`}>RDmuQn)7q`d} zS4`CI+qskZ_D|(}+tu{C^3f!8f9lKblu3UQ2&Jr)wJKI@czS`pq`8OqiwH1xM+ zqYDZREqyk|7s+*aa>8TM6r|`ov(v+WmyvP1g+zI?S9k-td;PzCz51gC3LhUI z96Y?aP#Qnut=ZPQOiVkCn1r0RznHbeh27W9J7O7<#eCnxEA0GwqCB&SaD!FW9qYdlp5(@4UaNBOOiI@rY3L&+%%1mO|}j6W&O9nO6fj zqv+yAhap2c*A~^>({mk0{tdm%-``&-Y;0_*%2Px-iCkuF=E4oo9{ajI%`1e|irU(!=QW~Tk>vOF zr~m%U7=J$YOwc}0HA9-1jI6D+PfP*&>=v&zk&(}qRO-T&&2g8$t?%?PKXRThwZ+i% zeR`ZU{M9CIWydPjlX0wEkR|+I0W1#ESFc~ce)I9;$5@)R(XzPdY2%@lU%%9I^ePH! zPu6Sb=w=renf8_k<5ESvtNp}|{*VZ|EyoYr@f~e z{{4HgR5t1k40BX7LPU0dJaRtTo>vqs+*t84F)`tW886baRx#yA;_mJ~QfwykN$kFU z3DH+3{-2pIq0+NA|p{oaZZddW8i&Hb1P?)oj!Y z4^(m7)BQR<{Vfn)TgYwsk5|Lfp#pPra~MJKA0HoG#aOT1=@pL}%Gco;+8E5$$dCxW z_6ye4fHw>)_6LKS=Zf!nU%|R@f!6kC$Pk7Q(xet1m0AC6+VhUO{U3&a_r6`UFO7)D z>)l<~v*V!#%jGUqGt4aOU!PUWce*+UpZ#?e5`4ajDz)mfTPlQI}Y6^id*Mf6P$S{OPP9-qgOYD7niyNC4Bjlq>N0>wajngdb)c1qUB$$f4+ogsaDt<5Ksy< zBJEuH{l&#@Zf52iOli-}Z&!8dy#6By#mpY)c>mwiqLFLs=PPhY7u;1wMTO}4ZQf~k zxD}M4f@Z}~0;<{JVzc1>gVD05xA^TTyWZZL`>p3N|NRYpB$Y5QSbdbbd=(L$zQ+nYUXRdc_t3K9n+mVFD!fB|Ag0wrV;O@avy(_O>%T; ze07@`uFMWrF!o*_T?zEshIp;xb7ZKs`|GL3Cf5`^Bpd)Hh@PNb&3P{{AJ(&yja zkn`E;k^UkRo%8k|xue|yWdo+9jfonq8#iv;rKNrNe07)>=CE&SIXdin0Or*{JAL8_ zuyQ()`Ll$zU)$X?6_W+F+HQNr%PhM~=JL0_ zJ=FXbqLz#LiClIQgKk@J^MT*!upM>VPs<-vY6rcB>iL7XFX9J`URljE=!>Npq6E>b z*8ZoZX;xmLPH^WVvT6;VWCF%(k(kT$K8zt1;}hC-`Gta3Zem&2;x4ezww*-e?$;3y ze3Tu2Ls-%H!t~narG=uwk$6^CuVEzsWzp0T#C>>t)SR1IAE;h46aCQ)bWd>O^|Dq% z3tr4|R)qjuwZVJn_JH;Pd7O<~6cKc%is^8NlGuw!aN|bDEnj}pgHG?T3G%NT)2?ml zOD-2mQfm#k_&o;B#NGc=)b8}@CQ&TLOE1;n#Z*M2t~Th0BuF@jG0vZ1rW;-1ApVuYsElU#uTr1v^M z;BNJ|GM?Ud+pj+h**;n-nQ_4xQEEReIul3R@25mTr9^nXK!HGHX zk#iTVkjr`bF?20nE%)ZpTEjT$_)aO(pfCUXHM@Y}sK5*r7LD1v zn=^%ZkL5}EkZGBVbq$Y1uYW@E(Yv{uVr97h=#P^~G#Ax!*?;6A%?ZLCXRo+B(PKF+ zMPIvG8dt9?z@p*$zju87LEx69ablxQ!2O?>EGv+-;4QdY{T?&!& zN^s1||JVx4gw%yLDJzi&J^0`eJ$?iZ=L&ld$qnv))J{G6R(vNOvF9BT5g)gQ2YDA4 zn>{S%Zm|jDc5GS5oGUq7kjdjQAiZ(J)D0`Egp``v(AxJYg7aH{m~qW|ev3Mi_RtTq zAPs6K-{a5GT&&h?kEZ$({XxC_e{<
1?4`C%hY1s;CPHBK7s6gieXaj(3~FqqOW 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 AQvd(} literal 0 HcmV?d00001 diff --git a/html/classdodoDialogs_1_1protoTypeDialog-members.html b/html/classdodoDialogs_1_1protoTypeDialog-members.html new file mode 100644 index 0000000..46711af --- /dev/null +++ b/html/classdodoDialogs_1_1protoTypeDialog-members.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoDialogs.protoTypeDialog Member List
+
+ + + + + diff --git a/html/classdodoDialogs_1_1protoTypeDialog.html b/html/classdodoDialogs_1_1protoTypeDialog.html new file mode 100644 index 0000000..1c183b8 --- /dev/null +++ b/html/classdodoDialogs_1_1protoTypeDialog.html @@ -0,0 +1,196 @@ + + + + + + + +Quetzal: dodoDialogs.protoTypeDialog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoDialogs.protoTypeDialog Class Reference
+
+
+
+Inheritance diagram for dodoDialogs.protoTypeDialog:
+
+
Inheritance graph
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[legend]
+
+Collaboration diagram for dodoDialogs.protoTypeDialog:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, dialog="anyFile.ui")
 
action (self, arg)
 
selectAction (self)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
reject (self)
 
+ + + + + + + + + + + + + + + + + + + + +

+Public Attributes

form
 
mw
 new shortcuts procedure
 
actionX
 
accept
 
actionS
 
selectAction
 
actionESC
 
view
 
call
 
+
The documentation for this class was generated from the following file:
    +
  • dodoDialogs.py
  • +
+
+ + + + diff --git a/html/classdodoDialogs_1_1protoTypeDialog__coll__graph.map b/html/classdodoDialogs_1_1protoTypeDialog__coll__graph.map new file mode 100644 index 0000000..a6cd00b --- /dev/null +++ b/html/classdodoDialogs_1_1protoTypeDialog__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classdodoDialogs_1_1protoTypeDialog__coll__graph.md5 b/html/classdodoDialogs_1_1protoTypeDialog__coll__graph.md5 new file mode 100644 index 0000000..4973178 --- /dev/null +++ b/html/classdodoDialogs_1_1protoTypeDialog__coll__graph.md5 @@ -0,0 +1 @@ +cc9e24c600432e15c21fce9b4e801272 \ No newline at end of file diff --git a/html/classdodoDialogs_1_1protoTypeDialog__coll__graph.png b/html/classdodoDialogs_1_1protoTypeDialog__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c09ecf0d91d11b5fd1747e45ce166162643ab87f GIT binary patch literal 4236 zcmd5=hdZ0?+m2D~YppagZ;YJ3U47A*|5D0`pTkF9?u>S?V&X;Jw z_B)mHBG}Q`=xRQIod5Y`*5@ZcAk6o)AKZK7^_fKU)ni9Ac5EHo>akvb!xkB4>C&e2 zB|GRZCe}81Ziel^55B^(_STB8(fUrqj60bG{B@O>s^c;tV`6LVYgiQu}cU#r_B&MZtV@Vbk z7LzsZp@?b!>WhV}h7r_*U0?F@hR4U3Vmv~Y%zwEOLo~gIlNWh z;A7v6pFCMF-3#v!qZs}1FV)5IT92EFiHWUkZDn>{taWvDPUND;)gMuTXIE5JRj0h> z7;J29|J~2eTpU2z6Kg%#IXPwQI+>FstaV&nOZ9zCO*z`y+M;+Bld7i!kp9Q}WwsrR zw>ap!y1F1&Rs0UaH?XB5vd?|SKk_PS85-KRhOzV_WnERnUmx)3>(fg&ZGj zh)GGsWoBOEkg(EncK$mxH5Du)E;hEQGft?hw^vw32BR7Co|(~YX;1*?1T9Rz>v!nt z(H3zTKZi!&s5C2ivXY_f`v?ZZ$xi#3@ZNEVeN|~$sdBr1H@?<&Mhymoc`Og-uB=U9 zDyzPKm-E#M zl;;>?ruhO0;dJ16{l1^EF$;)C0lJ$%@Z^UW%FhNfiOR>Ssj@cleG#W^XlQt3W=2qY z3WI%UY;4>=93bIvI4CLb$x{stnjFoTD#ukq_3eo4UmF{S>gpeeKEVyYxl2QHb91*Q z>`{&`B5RX12}oHNkd5p;d9TfDH8nN=^n_+K9xd>Q8hjpKC%^3f+!ZIJ={56#6C^@Z zUOtsf_IU+|Q~XKie0QQ{!Nyd5&pHuHvAMI8Q(nFuPAXhVp)L(AwycZ*kCOLRJ3vBG zWnK6HXm>ZJpRTfTa(48l%7jNo+74#ki@G8ca)FMc0^0y0GP}B}JKf+P9up%bDERJn z!{NKqQb~wuk@-DybFNeJo{)sZ$Hfd^MkXdE$P>RU^>PfRax)@B%w&*{gO9I&C`a@9 zjT_nJOnD@7n=g~*SwjhRZ&rSpswynLZfGAXS0>}x3*>oE{(a_+3%X0 z)dYov{$gOj;ZILbCo18bFEOd{@vNXwL-O;*AW~9N_&u9dYm*_2aFBu#`-g%8apbc~ zZaLS?eRn-QJ>))kSWr+9uf)&J{=mp6mgpQ35`w43B%)AHk*k_R?!rL^!U6*S>LyFX zrKcAot~cKUSAMsKv-u=nyQ=rP`BIk9UzyAb@etboJ5VS?9%TJ)n1Y3^$6_-XU6+SN ztj{zSYVwk9FSc{j`T7x>rG$fsU(hQ(K2FsZ#-Ehnt;ymM3h$cLX<&&ZH1YyRa&-x5 z=a@7tnGT3#Y=zsqH&%=B4>&vTW+psD9zAWMG@6nl(HWbH(bjF}XLSLW!@tEt6!PgU^H6`&n?L$Mf7;Dr zEn;FMCUX$GGBd0t|Lb&f2d#E`ilshvPkLBl;+ReMn|{g8iaUj-;;2w3A_9xzH+d_r z{T7hngm_(cfjPm^(G>P%dCTWPbtn61c<)pp*@sK~q7{LZ`K+v#rF@=W#{)~6{VD_| zGdt59xK$u!BE`j{y-^eK0HF;@5AQzrn9QA1nOznD^Vq^u+@Pz3+QK?=G}@^$*-^tatV37O=!Uw0Qy=8H5ze8+{rv0{<)@yF?6y3MEAv^g zZVad=E|O>@B_%h*FAKF!N7qBT@BSycd;}@#5F31SoDx7aG?M2@*CiwtKnkK|0y|nZgy7f)vFtG z9Wk25mQ(A!ot=X<5B;5qwTZuf+p)5;Dy+dPEsthG`71iAUlW_3NiuVA&;=9Nux zf{psxLg`RuE}5!FO-)@vn3|l7nsB1IcIOWJ`yZbB1me7AG9iGkW+x{nfTgH1D=I$W@s{lB0+N!knVFf42Rm;2Eh8fdfCp&kxq>1i=^&Rc zU!H6XL~U-mP7;Zv*ZF%+^Xuy$C!9pZ#V@(IY(PnTe0(W-qLfrrTU%RYk5OHA*;!ft z5~^JiP^g&D(2H?#ah?ZV4tL6dt~&d!{w)6UetGu=*TsI`TO7K`G&)+^u&}VEo}R)M za@PE<$HvC@{QZ@mKY#wcwiaKZ*puQJdY{tV$fyZl2?s-Dm6gQ-F~nDJa&VM`)JJIu zq0yA3K&Udj7p{cfn$7?j5jD){ovQcM*41qRBRdnIfY-HjbSQuAE{_07eMQC0!tx_q zJ#vjECr4p>XU78T`8UuIC9ln(r6q^{&+;uRxWcXNZ9x#VlM_ERHMN3*f@kefSA<1H ztFXmD+#RYe<>e@T)hBQ!M#hEqXddbd7o?o=cP1w%*M1`Q*DTP5 zg}@2S01XHZ4NZuP8_KnXOQ#-^S4%9)Y(DJk{#jl=Dxez;D^!3rcG=mqgfNVbjm^!^ zt9y9d-B}#4UmDCZkjbm}*(-kxxA#yCGA&H(L&_$krFDPNPB4P~IU!WIOn#3$JoI|m zn?ljFPa;fwcN5xZJXh)K>myn=c-$Dy`0@TC20kXCCu)LiGy-$R4*(njh=jC+GRe5j zwt605a!$v~U(h)^I_jlJQovvnltqV! z|G?oAKYzZe5zT#}38-pVWMoTAOHKr&on?V~KU{+zpDeUD5{U{sv~_eMs`!gb_6N7S1apQuyAs5{qS4I` zcUbxP&pXL%Y;2YOTyn10jE#-08vHEa{ED7M`*hQZbE7!hLUG!;_GlqRMV=sFNBh$i zJHETkDZm0PEUt)%hyamCy?aLq@CBeW3u6B%DM@8JMM>XwL*C>%E~L5Ko?~# zh=+#<7d;Kqto`RcFn6FZs*?ggm6s z1AM(NW#r}MgM)*ad3lLn$?#XNfS5lGIBLsNmX?lRSXj_}ec;G#qPgS=xv!>HYJO|7 z){uJ#`6{dH_yng(%Zow zSY+J|;lvoc}K z0)aV-$c~MR%i=BkX}epnyf^~Q`#4B~kjdnDV2DBer7C#bU|?WaBVx_q2U}YL*RO|1 z^TB}b?9-HIIX(6`Wn76GB}u;l9IBs ztLsNchog?o zFK2k1qM(L6F316;_D#GyusS1JK}b|I#^(kPX&HhM;MEcgOii6tZXvSqV^d60l*fiP-kud z0Rh0wp_7wV5>FeVN=j~*)NMz2iuE}`=hoNzH)mQXI{W)y4u8=e#o_+E-sfPw4+N(2 z87OKNUS56BgZ0TNp&QOlkKK0`^xwF)vLYpJ;_}?JuO6HdQ=p>bHpOOEm_XxJ`lB_z|*tijXp z_YfgD?Yp3LiaGdTwRH%T<-VJn6kzu`Ko;P#rf29s4@qv@#ErqM1NIjy>@$Chq6gpY^}_ol>Qlm#MZ3 z@ij3zQu$AZ^WR1qi?~Pf4}x8qk#nYWkmPy|m6bgQ*w%^h2|nzR=AxI~`*!btyZ7LL bGkzx&nfLNVovYyQ1&Fq~!GmvV&))qPOI}y+ literal 0 HcmV?d00001 diff --git a/html/classdodoDialogs_1_1protoTypeDialog__inherit__graph.map b/html/classdodoDialogs_1_1protoTypeDialog__inherit__graph.map new file mode 100644 index 0000000..6e2b438 --- /dev/null +++ b/html/classdodoDialogs_1_1protoTypeDialog__inherit__graph.map @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/classdodoDialogs_1_1protoTypeDialog__inherit__graph.md5 b/html/classdodoDialogs_1_1protoTypeDialog__inherit__graph.md5 new file mode 100644 index 0000000..0596faa --- /dev/null +++ b/html/classdodoDialogs_1_1protoTypeDialog__inherit__graph.md5 @@ -0,0 +1 @@ +363ed841be788245bb4e4d891be1194a \ No newline at end of file diff --git a/html/classdodoDialogs_1_1protoTypeDialog__inherit__graph.png b/html/classdodoDialogs_1_1protoTypeDialog__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d9dd86b5c849764c89fca18c7d0c3ca4c878799f GIT binary patch literal 62098 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%0DLQOie5 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 literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1DialogQM-members.html b/html/classdodoPM_1_1DialogQM-members.html new file mode 100644 index 0000000..1547d38 --- /dev/null +++ b/html/classdodoPM_1_1DialogQM-members.html @@ -0,0 +1,104 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.DialogQM Member List
+
+
+ +

This is the complete list of members for dodoPM.DialogQM, including all inherited members.

+ + + + + + + + + + + + + + + +
__init__(self, winTitle=translate("DialogQM", "Quick Insert"), PType="Pipe") (defined in dodoPM.DialogQM)dodoPM.DialogQM
dictList (defined in dodoPM.DialogQM)dodoPM.DialogQM
files (defined in dodoPM.DialogQM)dodoPM.DialogQM
go (defined in dodoPM.DialogQM)dodoPM.DialogQM
go(self) (defined in dodoPM.DialogQM)dodoPM.DialogQM
PRating (defined in dodoPM.DialogQM)dodoPM.DialogQM
PTypedodoPM.DialogQM
QM (defined in dodoPM.DialogQM)dodoPM.DialogQM
setCurrentPL (defined in dodoPM.DialogQM)dodoPM.DialogQM
setCurrentPL(self, PLName=None) (defined in dodoPM.DialogQM)dodoPM.DialogQM
show(self) (defined in dodoPM.DialogQM)dodoPM.DialogQM
updatePL(self) (defined in dodoPM.DialogQM)dodoPM.DialogQM
updateSizes (defined in dodoPM.DialogQM)dodoPM.DialogQM
updateSizes(self) (defined in dodoPM.DialogQM)dodoPM.DialogQM
+ + + + diff --git a/html/classdodoPM_1_1DialogQM.html b/html/classdodoPM_1_1DialogQM.html new file mode 100644 index 0000000..25e0389 --- /dev/null +++ b/html/classdodoPM_1_1DialogQM.html @@ -0,0 +1,174 @@ + + + + + + + +Quetzal: dodoPM.DialogQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.DialogQM Class Reference
+
+
+
+Inheritance diagram for dodoPM.DialogQM:
+
+
Inheritance graph
+ + + + + + + + + + + + + + + +
[legend]
+
+Collaboration diagram for dodoPM.DialogQM:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, winTitle=translate("DialogQM", "Quick Insert"), PType="Pipe")
 
show (self)
 
setCurrentPL (self, PLName=None)
 
updateSizes (self)
 
updatePL (self)
 
go (self)
 
+ + + + + + + + + + + + + + + + + + +

+Public Attributes

QM
 
go
 
updateSizes
 
setCurrentPL
 
PType
 pype stuff ###
 
PRating
 
dictList
 
files
 
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1DialogQM__coll__graph.map b/html/classdodoPM_1_1DialogQM__coll__graph.map new file mode 100644 index 0000000..8155dd2 --- /dev/null +++ b/html/classdodoPM_1_1DialogQM__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classdodoPM_1_1DialogQM__coll__graph.md5 b/html/classdodoPM_1_1DialogQM__coll__graph.md5 new file mode 100644 index 0000000..97e8eda --- /dev/null +++ b/html/classdodoPM_1_1DialogQM__coll__graph.md5 @@ -0,0 +1 @@ +5ad23818c1e2d39c5665e7928948b439 \ No newline at end of file diff --git a/html/classdodoPM_1_1DialogQM__coll__graph.png b/html/classdodoPM_1_1DialogQM__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3e2ae6bea3d1cf9b893291eee19650d74aad60 GIT binary patch literal 4595 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 literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1DialogQM__inherit__graph.map b/html/classdodoPM_1_1DialogQM__inherit__graph.map new file mode 100644 index 0000000..abd8437 --- /dev/null +++ b/html/classdodoPM_1_1DialogQM__inherit__graph.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/html/classdodoPM_1_1DialogQM__inherit__graph.md5 b/html/classdodoPM_1_1DialogQM__inherit__graph.md5 new file mode 100644 index 0000000..a11f5f4 --- /dev/null +++ b/html/classdodoPM_1_1DialogQM__inherit__graph.md5 @@ -0,0 +1 @@ +be7a08b751801430bb2f364ccb4382a9 \ No newline at end of file diff --git a/html/classdodoPM_1_1DialogQM__inherit__graph.png b/html/classdodoPM_1_1DialogQM__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..01bed97f07b00da1ddbdabe7d24eb70e9dab7281 GIT binary patch literal 14111 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 R@WdN(T}>BVu3{Vde*tJAvo`<$ literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1HoverButton-members.html b/html/classdodoPM_1_1HoverButton-members.html new file mode 100644 index 0000000..c946b75 --- /dev/null +++ b/html/classdodoPM_1_1HoverButton-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.HoverButton Member List
+
+
+ +

This is the complete list of members for dodoPM.HoverButton, including all inherited members.

+ + + + +
__init__(self, parent=None) (defined in dodoPM.HoverButton)dodoPM.HoverButton
enterEvent(self, event) (defined in dodoPM.HoverButton)dodoPM.HoverButton
mouseReleaseEvent(self, event) (defined in dodoPM.HoverButton)dodoPM.HoverButton
+ + + + diff --git a/html/classdodoPM_1_1HoverButton.html b/html/classdodoPM_1_1HoverButton.html new file mode 100644 index 0000000..eb6ef37 --- /dev/null +++ b/html/classdodoPM_1_1HoverButton.html @@ -0,0 +1,126 @@ + + + + + + + +Quetzal: dodoPM.HoverButton Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.HoverButton Class Reference
+
+
+
+Inheritance diagram for dodoPM.HoverButton:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for dodoPM.HoverButton:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + +

+Public Member Functions

__init__ (self, parent=None)
 
enterEvent (self, event)
 
mouseReleaseEvent (self, event)
 
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1HoverButton__coll__graph.map b/html/classdodoPM_1_1HoverButton__coll__graph.map new file mode 100644 index 0000000..8f24de0 --- /dev/null +++ b/html/classdodoPM_1_1HoverButton__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classdodoPM_1_1HoverButton__coll__graph.md5 b/html/classdodoPM_1_1HoverButton__coll__graph.md5 new file mode 100644 index 0000000..c6aa427 --- /dev/null +++ b/html/classdodoPM_1_1HoverButton__coll__graph.md5 @@ -0,0 +1 @@ +782e6af748535646c88e1d1246fa68b8 \ No newline at end of file diff --git a/html/classdodoPM_1_1HoverButton__coll__graph.png b/html/classdodoPM_1_1HoverButton__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cce3b134ce0a63c4b7fcbafcd89122d46f43e8d7 GIT binary patch literal 4564 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 literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1HoverButton__inherit__graph.map b/html/classdodoPM_1_1HoverButton__inherit__graph.map new file mode 100644 index 0000000..8f24de0 --- /dev/null +++ b/html/classdodoPM_1_1HoverButton__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classdodoPM_1_1HoverButton__inherit__graph.md5 b/html/classdodoPM_1_1HoverButton__inherit__graph.md5 new file mode 100644 index 0000000..c6aa427 --- /dev/null +++ b/html/classdodoPM_1_1HoverButton__inherit__graph.md5 @@ -0,0 +1 @@ +782e6af748535646c88e1d1246fa68b8 \ No newline at end of file diff --git a/html/classdodoPM_1_1HoverButton__inherit__graph.png b/html/classdodoPM_1_1HoverButton__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cce3b134ce0a63c4b7fcbafcd89122d46f43e8d7 GIT binary patch literal 4564 zcmc&&XEqC|9}x2RzdhG0Yx zljwpFC5RxpyM6fIdq3Ro_c?Rs?B_Y>*?aA^-u13`?Pwis)l1Zz)DQ$+dZ32X1J81B zJ5Z8?|5?MN8t@>u)KEo2=NDIQd&x@(VvK%(R7QEf{*@i5gL-t{H^;`BW@5P*IY`gK zqOVKU6ZQDB%ZM@+vFk>E35CNzpYMj8)!42>T?Y2HWe5KY!C!ra*Ol$8A6gq&B>a4r zsBWDb6)}M5Sn3NAj{Q*A`5^!s$nIq@5pH78qp>2{P5akvb7lJP?UnYwZ`_(&q0laK zQFdDLP#3T62{+e(fPj?#r_`{UVsRa;us)W54C@LBgg+|#C~f5Vpv&~!#w(mTZCKP9 z-MnJs8>d%>L`wg>;^XJcU&S_u5bwIAGc>PXzaG?O&W;iC;_}=gr;XHj_0Ls4J`y$&)3EaL8?3?x zK`U?k=uAybAz)_E!GSkS-kag<>ioZ_D`Y$Ox8WB$5Kq;5B}Efko266r>E3S)3$VC5|Y({)Eh|T z7Xslv^tP^UR9IS2Fp~c=Ri#lwOkI8bY9u@$H(Sn2Pg9e&{dn`e=c;ody7I9GA~ohb zssHKjT6y(O-?eMky0ML2<~&g0QEwX?(^Ay0?d|SvTl@Ig&lTjMR#d(hC(@ceL4 zq(gJ6(V^bkzI^%Y;Nal%+3E4&VwSYi=<-mOkdRO`p~^&qjEoGuLjTxtsA4YQ_-3HJ z1ZO`E7w+onYQILJaf%U=N@;9tl+r__qEIO06)F2%Rc@a!DThg_C1#l$A~R9TDS>5!cSr;vn1N}7n7_U+rZcR$H(C87{T zTiD}I#jeJ9-?I}RVkMj5Hw~rq!h6+4-*hJ3Wx0rQTijOkKwP;%sF(2>_e9#ZKjd0H zjsBkQfm*2mAfu$E4MXyB=&-_Iw9wnKvXHxZ5F~6+1C14Hkw7pRXDB#0*xAi((XG*G zE`ECY38duhE#tZIO-$GXcrw&Lxbec7K|xTg$I8-DE*8t(advd0P)`WTt*pFM-Ek(H zoSYmX+|-MyZja!S^USTUXR@}oR(tqR)!VyS>sP~<4lEW+Vrdq5+MqQFCJwe9Oe2D1 zWo2tT)*olN$ED~>mcM^5XJl-AGi}vf7Mf=>Y~o8*r&tmY6yy^Zznqbgaa~A=qp_-{ zMzp+-Z-jQ*C_Owp{CDUjNLN?)gaY%{6(j$pG@j$~kGXJ>wED*?cq9wxp0qdJ_1Ex)0G z#pcuN?^a!1T~X1|U0+J|57X7$*Z&a4#=84HH94zlwm4%G)ztWD=x#Q*kzRb$H5*`tur=!E*keD%8;*6%Z z$&CsR%hb&d=*$&SVmUIN=i#h`z=pBJUlM4*th+S1m~sGv*Rtm zdQ($?$p-8_0yn2`x4N$;k6ZakFfnG!`?z+#u`xEj0w&OX^e7bv!~96wWo2gG_G=b= z_@*!>hWhseUjsVIbs!RjX^4|PgWX8k{QI$rGh z6T-qspL7Ip0l0?V(c2OTdwb|8pr{B(?*1*(cojc8_%(k1V-la0%LL<9^mvdek ztCLRr00S+)g0|~_4P>cLj1&pfy@H-jCMF#L{s!mE$JKXfeCBNypRf-E);lp}iSc`8 zq%JlGW@#2z-`Bu<&%bk7&h$*?PvsCin|q==lUhq~lkRqTl4r7#ke1lNTUxs0ev^8S z=fI^izMbApB)*~eH)&SAY@!hvYv?=$L|WlP#h(4!wy zScqFlzBb>0^L5V5heh_Ok9mh?j1!%#`z2qFWZ{`U%g2bg7$^wj_g)3db@G2GfP@t` zRe0oEk0|?vQ^YpHz}E~ly(E%@Q*aw2E9bAe^Jp&0yY&b zW39b>_zJ$BpCNq~b@nI-qOkcC_H89Td5bGW@*fK{*Hxs!CC877#&Un5gc(NVMRqiS zaeG)klhT~g-n%b^@|@jYg*JlgHByB=yFHFDH%D7jM(B!R9zLW8IW;mhB`0tg_q+dXdP6}0$?EDV5Li~p z!|XW*CgxPplaog7?(Pr-q{Yd}$^7!NRIa?JD8uFGummQ?FLshL@!j~0TNIUZRC;w6<~rft1+)G_%2S?%wh7vDJ9l zBlK?|hhSH)UR6_9=gf|nP&#k?yT5<8V1$Q<2LiQR^w^xP*Cxk5B0ZfQsj5oPc?APQ zKQ0)FiijZh_VFz}G8E#mmcQ&sh)rBn(E3h6Q~`4fkB4V*6pv_en_GUs*2 z>Tx>@QFc&n=-JrV&Ze>NvjO>Xa&jL0!ksy6ZEW-asgszKlK_Mwq@S4i%lEBNZv9U1=|8<7? zvT?hO$p#v3ZtkCJYaik`Zs7-RAP_Y+!`x9w-p@I6%q;<@zNF;jvi#?synK8~+1W2J zU#otjvt>OHyS@savgINV|E%0A8B?x&%y;b?4y28yjf2BY?8%OX{Y+~rd>#YiEv}a2EU!PqVD9<)%Fg<2DKN9K6@c;!)aBcX3Z#+}^i+Hz$Ut3vAaSwAY3|O! z(NR7C4A|A%^74CndY2a#7GR?td{P)ECy|TzT)7epyvM)@#`u9-w{GR>T(7ajQA3?w zp%h6O8PPy`bw3qTZ_xzL}L;XVMMI12c42Fu!S#hz>K zvMH}#W#NF^9S9t(tPvy>bn^?iSV}4?B8Zulbs?C7I|#{3#ApF_Pf0^_&(&32CjK6f z^>+@JnA-LT#?BrdWRPuxQDJfMj@wRKo4lzpFtx0_TvuN|w2!;~mqs%a6O*oyk?ed@ zpdX&#((Lm`Ku=%)``TIz5HRzL35xga?S)@wR|XEYSH^iuD;13778Q}z*49E${NlkJ zQEqK5#n;byI_UYfbtka+FvRNK6NZ#wr)L>V{&62-_5Qv4L&tJZTfpjM&BLgTXXlsM% zl`@0g1NeS%JuW6j+*p49Yg$%TY)A+(K2wtB@2p?-kV8G0ai4OY&NjRvWe6EY;N9pE5-W(^aM#sNx?6!NKbx|GOqD}9VwO` z70bm>iok0P{r&wdBsg`=%!Wm{5jSoex`J$HU1yFQZ`pAf#?(QauWxaV9jTT6L`4Vt;Y%rl=1_x>O z_V#2v)|f%pLz?vQNM}zg_{j5eJhwv3_O>(j`ToYl$DyHcHU5w;b0t&L*`PbO{q}|1 z+S|WxZpI7g7aPRgc7;WB2N^mckx0rumxMViPMke2FYo8(=KW{Sgg_g8k(3gWk^m>2 zI2;*x#So2@2|Sa}%*?E@9pMFL{Ps#sTK-BPSbhkjdTfTNsH_aHt`_My9fh}>CM++b z0aWi0zI~&tHNcC6Rg9Z~bc$vY+$sN_=T6)d_qz`s$OGE?jZBCEv_36Q;$zuF7IuCN zGQ{H49z6ICZyFyTPru_YyX4wpI0aU{pwtE<01C(Xyh!f5fLhMk-$-Iu0T-%kXaGzk zrKE&`Fkkdeyh)VG%F4~2zc|6Gym325PEI>9Db%s!S5;)Q>kn$crxf`5O2GA>CnsY7 zMcr(AW$1qhn$-`*101xfqoboC0|V-@B4+hXRqX#cW%$3;MAur5N|kB5ub_u0JLK4o z!Mq?sd$_u`qQx_?o9Fi#|8w{O&OjoT&xuqV$@fW~&!2*08t8$FHnQrjdB}eOCSs~% literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1PieMenu-members.html b/html/classdodoPM_1_1PieMenu-members.html new file mode 100644 index 0000000..7816d2d --- /dev/null +++ b/html/classdodoPM_1_1PieMenu-members.html @@ -0,0 +1,99 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.PieMenu Member List
+
+
+ +

This is the complete list of members for dodoPM.PieMenu, including all inherited members.

+ + + + + + + + + + +
__init__(self) (defined in dodoPM.PieMenu)dodoPM.PieMenu
add_commands(self, commands) (defined in dodoPM.PieMenu)dodoPM.PieMenu
buttons (defined in dodoPM.PieMenu)dodoPM.PieMenu
buttonSize (defined in dodoPM.PieMenu)dodoPM.PieMenu
hide(self) (defined in dodoPM.PieMenu)dodoPM.PieMenu
menu (defined in dodoPM.PieMenu)dodoPM.PieMenu
menuSize (defined in dodoPM.PieMenu)dodoPM.PieMenu
radius (defined in dodoPM.PieMenu)dodoPM.PieMenu
showAtMouse(self) (defined in dodoPM.PieMenu)dodoPM.PieMenu
+ + + + diff --git a/html/classdodoPM_1_1PieMenu.html b/html/classdodoPM_1_1PieMenu.html new file mode 100644 index 0000000..971e874 --- /dev/null +++ b/html/classdodoPM_1_1PieMenu.html @@ -0,0 +1,128 @@ + + + + + + + +Quetzal: dodoPM.PieMenu Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.PieMenu Class Reference
+
+
+ + + + + + + + + + +

+Public Member Functions

__init__ (self)
 
add_commands (self, commands)
 
hide (self)
 
showAtMouse (self)
 
+ + + + + + + + + + + +

+Public Attributes

radius
 
buttons
 
buttonSize
 
menu
 
menuSize
 
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1QkMenu-members.html b/html/classdodoPM_1_1QkMenu-members.html new file mode 100644 index 0000000..db69020 --- /dev/null +++ b/html/classdodoPM_1_1QkMenu-members.html @@ -0,0 +1,98 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.QkMenu Member List
+
+
+ +

This is the complete list of members for dodoPM.QkMenu, including all inherited members.

+ + + + + + + + + +
btnGO (defined in dodoPM.QkMenu)dodoPM.QkMenu
comboPL (defined in dodoPM.QkMenu)dodoPM.QkMenu
comboRating (defined in dodoPM.QkMenu)dodoPM.QkMenu
gridLayout (defined in dodoPM.QkMenu)dodoPM.QkMenu
labPL (defined in dodoPM.QkMenu)dodoPM.QkMenu
labRating (defined in dodoPM.QkMenu)dodoPM.QkMenu
listSize (defined in dodoPM.QkMenu)dodoPM.QkMenu
setupUi(self, Dialog) (defined in dodoPM.QkMenu)dodoPM.QkMenu
+ + + + diff --git a/html/classdodoPM_1_1QkMenu.html b/html/classdodoPM_1_1QkMenu.html new file mode 100644 index 0000000..dd46d03 --- /dev/null +++ b/html/classdodoPM_1_1QkMenu.html @@ -0,0 +1,145 @@ + + + + + + + +Quetzal: dodoPM.QkMenu Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.QkMenu Class Reference
+
+
+
+Inheritance diagram for dodoPM.QkMenu:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for dodoPM.QkMenu:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + +

+Public Member Functions

setupUi (self, Dialog)
 
+ + + + + + + + + + + + + + + +

+Public Attributes

gridLayout
 
comboRating
 
labRating
 
comboPL
 
btnGO
 
labPL
 
listSize
 
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1QkMenu__coll__graph.map b/html/classdodoPM_1_1QkMenu__coll__graph.map new file mode 100644 index 0000000..e2d7880 --- /dev/null +++ b/html/classdodoPM_1_1QkMenu__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classdodoPM_1_1QkMenu__coll__graph.md5 b/html/classdodoPM_1_1QkMenu__coll__graph.md5 new file mode 100644 index 0000000..5037ca7 --- /dev/null +++ b/html/classdodoPM_1_1QkMenu__coll__graph.md5 @@ -0,0 +1 @@ +a92d48e57a0f27a836bc8d1a3a7057e4 \ No newline at end of file diff --git a/html/classdodoPM_1_1QkMenu__coll__graph.png b/html/classdodoPM_1_1QkMenu__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..538ac977b327a1f524d04271e1a7c64214f9aae3 GIT binary patch literal 3699 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 + + + + diff --git a/html/classdodoPM_1_1QkMenu__inherit__graph.md5 b/html/classdodoPM_1_1QkMenu__inherit__graph.md5 new file mode 100644 index 0000000..5037ca7 --- /dev/null +++ b/html/classdodoPM_1_1QkMenu__inherit__graph.md5 @@ -0,0 +1 @@ +a92d48e57a0f27a836bc8d1a3a7057e4 \ No newline at end of file diff --git a/html/classdodoPM_1_1QkMenu__inherit__graph.png b/html/classdodoPM_1_1QkMenu__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..538ac977b327a1f524d04271e1a7c64214f9aae3 GIT binary patch literal 3699 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.cQM Member List
+
+
+ +

This is the complete list of members for dodoPM.cQM, including all inherited members.

+ + + +
__init__(self) (defined in dodoPM.cQM)dodoPM.cQM
go(self) (defined in dodoPM.cQM)dodoPM.cQM
+ + + + diff --git a/html/classdodoPM_1_1cQM.html b/html/classdodoPM_1_1cQM.html new file mode 100644 index 0000000..e62bc53 --- /dev/null +++ b/html/classdodoPM_1_1cQM.html @@ -0,0 +1,206 @@ + + + + + + + +Quetzal: dodoPM.cQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.cQM Class Reference
+
+
+
+Inheritance diagram for dodoPM.cQM:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for dodoPM.cQM:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 go (self)
 
- Public Member Functions inherited from dodoPM.DialogQM
show (self)
 
setCurrentPL (self, PLName=None)
 
updateSizes (self)
 
updatePL (self)
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dodoPM.DialogQM
QM
 
updateSizes
 
setCurrentPL
 
PType
 pype stuff ###
 
PRating
 
dictList
 
files
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
dodoPM.cQM.__init__ ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+

Member Function Documentation

+ +

◆ go()

+ +
+
+ + + + + + + + +
dodoPM.cQM.go ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1cQM__coll__graph.map b/html/classdodoPM_1_1cQM__coll__graph.map new file mode 100644 index 0000000..79efd1f --- /dev/null +++ b/html/classdodoPM_1_1cQM__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1cQM__coll__graph.md5 b/html/classdodoPM_1_1cQM__coll__graph.md5 new file mode 100644 index 0000000..2160286 --- /dev/null +++ b/html/classdodoPM_1_1cQM__coll__graph.md5 @@ -0,0 +1 @@ +e1df95e23e174556827b65160e00b22a \ No newline at end of file diff --git a/html/classdodoPM_1_1cQM__coll__graph.png b/html/classdodoPM_1_1cQM__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6fd94d2a6feb481d45f4033f652059caf3df86 GIT binary patch literal 6365 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 DdM{l{ literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1cQM__inherit__graph.map b/html/classdodoPM_1_1cQM__inherit__graph.map new file mode 100644 index 0000000..79efd1f --- /dev/null +++ b/html/classdodoPM_1_1cQM__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1cQM__inherit__graph.md5 b/html/classdodoPM_1_1cQM__inherit__graph.md5 new file mode 100644 index 0000000..2160286 --- /dev/null +++ b/html/classdodoPM_1_1cQM__inherit__graph.md5 @@ -0,0 +1 @@ +e1df95e23e174556827b65160e00b22a \ No newline at end of file diff --git a/html/classdodoPM_1_1cQM__inherit__graph.png b/html/classdodoPM_1_1cQM__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6fd94d2a6feb481d45f4033f652059caf3df86 GIT binary patch literal 6365 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 DdM{l{ literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1eQM-members.html b/html/classdodoPM_1_1eQM-members.html new file mode 100644 index 0000000..e168987 --- /dev/null +++ b/html/classdodoPM_1_1eQM-members.html @@ -0,0 +1,92 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.eQM Member List
+
+
+ +

This is the complete list of members for dodoPM.eQM, including all inherited members.

+ + + +
__init__(self) (defined in dodoPM.eQM)dodoPM.eQM
go(self) (defined in dodoPM.eQM)dodoPM.eQM
+ + + + diff --git a/html/classdodoPM_1_1eQM.html b/html/classdodoPM_1_1eQM.html new file mode 100644 index 0000000..3d94811 --- /dev/null +++ b/html/classdodoPM_1_1eQM.html @@ -0,0 +1,206 @@ + + + + + + + +Quetzal: dodoPM.eQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.eQM Class Reference
+
+
+
+Inheritance diagram for dodoPM.eQM:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for dodoPM.eQM:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 go (self)
 
- Public Member Functions inherited from dodoPM.DialogQM
show (self)
 
setCurrentPL (self, PLName=None)
 
updateSizes (self)
 
updatePL (self)
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dodoPM.DialogQM
QM
 
updateSizes
 
setCurrentPL
 
PType
 pype stuff ###
 
PRating
 
dictList
 
files
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
dodoPM.eQM.__init__ ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+

Member Function Documentation

+ +

◆ go()

+ +
+
+ + + + + + + + +
dodoPM.eQM.go ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1eQM__coll__graph.map b/html/classdodoPM_1_1eQM__coll__graph.map new file mode 100644 index 0000000..d965835 --- /dev/null +++ b/html/classdodoPM_1_1eQM__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1eQM__coll__graph.md5 b/html/classdodoPM_1_1eQM__coll__graph.md5 new file mode 100644 index 0000000..90605d2 --- /dev/null +++ b/html/classdodoPM_1_1eQM__coll__graph.md5 @@ -0,0 +1 @@ +0a506b27053f3f23038d1952cd20c571 \ No newline at end of file diff --git a/html/classdodoPM_1_1eQM__coll__graph.png b/html/classdodoPM_1_1eQM__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..90b06b023795e912f071ad0a5425a7cc29567448 GIT binary patch literal 6364 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 literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1eQM__inherit__graph.map b/html/classdodoPM_1_1eQM__inherit__graph.map new file mode 100644 index 0000000..d965835 --- /dev/null +++ b/html/classdodoPM_1_1eQM__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1eQM__inherit__graph.md5 b/html/classdodoPM_1_1eQM__inherit__graph.md5 new file mode 100644 index 0000000..90605d2 --- /dev/null +++ b/html/classdodoPM_1_1eQM__inherit__graph.md5 @@ -0,0 +1 @@ +0a506b27053f3f23038d1952cd20c571 \ No newline at end of file diff --git a/html/classdodoPM_1_1eQM__inherit__graph.png b/html/classdodoPM_1_1eQM__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..90b06b023795e912f071ad0a5425a7cc29567448 GIT binary patch literal 6364 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 literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1fQM-members.html b/html/classdodoPM_1_1fQM-members.html new file mode 100644 index 0000000..85d0676 --- /dev/null +++ b/html/classdodoPM_1_1fQM-members.html @@ -0,0 +1,92 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.fQM Member List
+
+
+ +

This is the complete list of members for dodoPM.fQM, including all inherited members.

+ + + +
__init__(self) (defined in dodoPM.fQM)dodoPM.fQM
go(self) (defined in dodoPM.fQM)dodoPM.fQM
+ + + + diff --git a/html/classdodoPM_1_1fQM.html b/html/classdodoPM_1_1fQM.html new file mode 100644 index 0000000..3c4f93f --- /dev/null +++ b/html/classdodoPM_1_1fQM.html @@ -0,0 +1,206 @@ + + + + + + + +Quetzal: dodoPM.fQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.fQM Class Reference
+
+
+
+Inheritance diagram for dodoPM.fQM:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for dodoPM.fQM:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 go (self)
 
- Public Member Functions inherited from dodoPM.DialogQM
show (self)
 
setCurrentPL (self, PLName=None)
 
updateSizes (self)
 
updatePL (self)
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dodoPM.DialogQM
QM
 
updateSizes
 
setCurrentPL
 
PType
 pype stuff ###
 
PRating
 
dictList
 
files
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
dodoPM.fQM.__init__ ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+

Member Function Documentation

+ +

◆ go()

+ +
+
+ + + + + + + + +
dodoPM.fQM.go ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1fQM__coll__graph.map b/html/classdodoPM_1_1fQM__coll__graph.map new file mode 100644 index 0000000..b22e76b --- /dev/null +++ b/html/classdodoPM_1_1fQM__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1fQM__coll__graph.md5 b/html/classdodoPM_1_1fQM__coll__graph.md5 new file mode 100644 index 0000000..364b382 --- /dev/null +++ b/html/classdodoPM_1_1fQM__coll__graph.md5 @@ -0,0 +1 @@ +095018e559016ca933cf16b329558321 \ No newline at end of file diff --git a/html/classdodoPM_1_1fQM__coll__graph.png b/html/classdodoPM_1_1fQM__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..636bec8f1c1970e7c3863bbe7d09de8fdcea0505 GIT binary patch literal 6271 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 + + + + + + diff --git a/html/classdodoPM_1_1fQM__inherit__graph.md5 b/html/classdodoPM_1_1fQM__inherit__graph.md5 new file mode 100644 index 0000000..364b382 --- /dev/null +++ b/html/classdodoPM_1_1fQM__inherit__graph.md5 @@ -0,0 +1 @@ +095018e559016ca933cf16b329558321 \ No newline at end of file diff --git a/html/classdodoPM_1_1fQM__inherit__graph.png b/html/classdodoPM_1_1fQM__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..636bec8f1c1970e7c3863bbe7d09de8fdcea0505 GIT binary patch literal 6271 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.pQM Member List
+
+
+ +

This is the complete list of members for dodoPM.pQM, including all inherited members.

+ + + +
__init__(self) (defined in dodoPM.pQM)dodoPM.pQM
go(self) (defined in dodoPM.pQM)dodoPM.pQM
+ + + + diff --git a/html/classdodoPM_1_1pQM.html b/html/classdodoPM_1_1pQM.html new file mode 100644 index 0000000..da14852 --- /dev/null +++ b/html/classdodoPM_1_1pQM.html @@ -0,0 +1,206 @@ + + + + + + + +Quetzal: dodoPM.pQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.pQM Class Reference
+
+
+
+Inheritance diagram for dodoPM.pQM:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for dodoPM.pQM:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 go (self)
 
- Public Member Functions inherited from dodoPM.DialogQM
show (self)
 
setCurrentPL (self, PLName=None)
 
updateSizes (self)
 
updatePL (self)
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dodoPM.DialogQM
QM
 
updateSizes
 
setCurrentPL
 
PType
 pype stuff ###
 
PRating
 
dictList
 
files
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
dodoPM.pQM.__init__ ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+

Member Function Documentation

+ +

◆ go()

+ +
+
+ + + + + + + + +
dodoPM.pQM.go ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1pQM__coll__graph.map b/html/classdodoPM_1_1pQM__coll__graph.map new file mode 100644 index 0000000..a2c9507 --- /dev/null +++ b/html/classdodoPM_1_1pQM__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1pQM__coll__graph.md5 b/html/classdodoPM_1_1pQM__coll__graph.md5 new file mode 100644 index 0000000..4ccea60 --- /dev/null +++ b/html/classdodoPM_1_1pQM__coll__graph.md5 @@ -0,0 +1 @@ +430ceff82fa78a2b5d0454bc673f87db \ No newline at end of file diff --git a/html/classdodoPM_1_1pQM__coll__graph.png b/html/classdodoPM_1_1pQM__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..65e10c9fb18322dba4edd11740b677338b8f2094 GIT binary patch literal 6349 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 literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1pQM__inherit__graph.map b/html/classdodoPM_1_1pQM__inherit__graph.map new file mode 100644 index 0000000..a2c9507 --- /dev/null +++ b/html/classdodoPM_1_1pQM__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1pQM__inherit__graph.md5 b/html/classdodoPM_1_1pQM__inherit__graph.md5 new file mode 100644 index 0000000..4ccea60 --- /dev/null +++ b/html/classdodoPM_1_1pQM__inherit__graph.md5 @@ -0,0 +1 @@ +430ceff82fa78a2b5d0454bc673f87db \ No newline at end of file diff --git a/html/classdodoPM_1_1pQM__inherit__graph.png b/html/classdodoPM_1_1pQM__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..65e10c9fb18322dba4edd11740b677338b8f2094 GIT binary patch literal 6349 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 literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1vQM-members.html b/html/classdodoPM_1_1vQM-members.html new file mode 100644 index 0000000..7477e43 --- /dev/null +++ b/html/classdodoPM_1_1vQM-members.html @@ -0,0 +1,92 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
dodoPM.vQM Member List
+
+
+ +

This is the complete list of members for dodoPM.vQM, including all inherited members.

+ + + +
__init__(self) (defined in dodoPM.vQM)dodoPM.vQM
go(self) (defined in dodoPM.vQM)dodoPM.vQM
+ + + + diff --git a/html/classdodoPM_1_1vQM.html b/html/classdodoPM_1_1vQM.html new file mode 100644 index 0000000..601020f --- /dev/null +++ b/html/classdodoPM_1_1vQM.html @@ -0,0 +1,206 @@ + + + + + + + +Quetzal: dodoPM.vQM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
dodoPM.vQM Class Reference
+
+
+
+Inheritance diagram for dodoPM.vQM:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for dodoPM.vQM:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 go (self)
 
- Public Member Functions inherited from dodoPM.DialogQM
show (self)
 
setCurrentPL (self, PLName=None)
 
updateSizes (self)
 
updatePL (self)
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dodoPM.DialogQM
QM
 
updateSizes
 
setCurrentPL
 
PType
 pype stuff ###
 
PRating
 
dictList
 
files
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
dodoPM.vQM.__init__ ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+

Member Function Documentation

+ +

◆ go()

+ +
+
+ + + + + + + + +
dodoPM.vQM.go ( self)
+
+ +

Reimplemented from dodoPM.DialogQM.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • dodoPM.py
  • +
+
+ + + + diff --git a/html/classdodoPM_1_1vQM__coll__graph.map b/html/classdodoPM_1_1vQM__coll__graph.map new file mode 100644 index 0000000..f637901 --- /dev/null +++ b/html/classdodoPM_1_1vQM__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1vQM__coll__graph.md5 b/html/classdodoPM_1_1vQM__coll__graph.md5 new file mode 100644 index 0000000..ef4d439 --- /dev/null +++ b/html/classdodoPM_1_1vQM__coll__graph.md5 @@ -0,0 +1 @@ +fc0929018909ead07dc904f98b5ee7b3 \ No newline at end of file diff --git a/html/classdodoPM_1_1vQM__coll__graph.png b/html/classdodoPM_1_1vQM__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..313deaf1da517785400c3a74dce9442604df4a47 GIT binary patch literal 6355 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 literal 0 HcmV?d00001 diff --git a/html/classdodoPM_1_1vQM__inherit__graph.map b/html/classdodoPM_1_1vQM__inherit__graph.map new file mode 100644 index 0000000..f637901 --- /dev/null +++ b/html/classdodoPM_1_1vQM__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classdodoPM_1_1vQM__inherit__graph.md5 b/html/classdodoPM_1_1vQM__inherit__graph.md5 new file mode 100644 index 0000000..ef4d439 --- /dev/null +++ b/html/classdodoPM_1_1vQM__inherit__graph.md5 @@ -0,0 +1 @@ +fc0929018909ead07dc904f98b5ee7b3 \ No newline at end of file diff --git a/html/classdodoPM_1_1vQM__inherit__graph.png b/html/classdodoPM_1_1vQM__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..313deaf1da517785400c3a74dce9442604df4a47 GIT binary patch literal 6355 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 literal 0 HcmV?d00001 diff --git a/html/classes.html b/html/classes.html new file mode 100644 index 0000000..1724af3 --- /dev/null +++ b/html/classes.html @@ -0,0 +1,146 @@ + + + + + + + +Quetzal: Class Index + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
A | B | C | D | E | F | H | I | J | L | M | O | P | Q | R | S | T | U | V | _
+
+
+
A
+
adjustAngleObserver (fObservers)
adjustFrameAngle (CFrame)
alignEdge (CFrame)
alignEdgeObserver (fObservers)
alignFlange (CFrame)
alignFlangeObserver (fObservers)
alignForm (fForms)
AnyThing (anyShapez)
arrow (uCmd)
arrow_insert (pObservers)
arrow_move (uCmd)
attach2tube (CPipe)
+
+
B
+
Beam (cut_list.cut_list_creation)
breakForm (pForms)
breakPipe (CPipe)
+
+
C
+
Cap (pFeatures)
capQM (CPipe)
cQM (dodoPM)
CrowdinUpdater (update_crowdin)
Cut (cut_list.cut_list_creation)
cutListCommand (cut_list.cut_list_commands)
cutListUI (cut_list.cut_list_ui)
+
+
D
+
DialogQM (dodoPM)
dpCalc (CUtils)
dpCalcDialog (uForms)
+
+
E
+
Elbow (pFeatures)
elbowQM (CPipe)
eQM (dodoPM)
extend (CFrame)
extend1intersection (CPipe)
extend2intersection (CPipe)
extendForm (fForms)
extendObserver (fObservers)
+
+
F
+
fillForm (fForms)
fillFrameObserver (fObservers)
Flange (pFeatures)
flangeQM (CPipe)
flat (CPipe)
fQM (dodoPM)
FrameBranch (fFeatures)
frameBranchForm (fFeatures)
FrameBranchManager (CFrame)
frameIt (CFrame)
frameItObserver (fObservers)
FrameLine (fFeatures)
frameLineForm (fFeatures)
frameObserverPrototype (fObservers)
+
+
H
+
hackedL (CUtils)
hackedLine (uCmd)
handleDialog (uCmd)
HoverButton (dodoPM)
+
+
I
+
insertAnyz (CPipe)
insertBranch (CPipe)
insertBranchForm (pForms)
insertCap (CPipe)
insertCapForm (pForms)
insertElbow (CPipe)
insertElbowForm (pForms)
insertFlange (CPipe)
insertFlangeForm (pForms)
insertPath (CFrame)
insertPipe (CPipe)
insertPipeForm (pForms)
insertPypeLine (CPipe)
insertPypeLineForm (pForms)
insertReduct (CPipe)
insertReductForm (pForms)
insertRoute (CPipe)
insertRouteForm (pForms)
insertSectForm (fFeatures)
insertSection (CFrame)
insertTank (CPipe)
insertTankForm (pForms)
insertUbolt (CPipe)
insertUboltForm (pForms)
insertValve (CPipe)
insertValveForm (pForms)
+
+
J
+
joinForm (pForms)
joinObserver (pObservers)
joinPype (CPipe)
+
+
L
+
label3D (uCmd)
laydown (CPipe)
levelBeam (CFrame)
levelBeamObserver (fObservers)
+
+
M
+
makeHeader (CPipe)
mateEdges (CPipe)
moveHandle (CUtils)
moveWorkPlane (CUtils)
+
+
O
+
offsetWorkPlane (CUtils)
+
+
P
+
PieMenu (dodoPM)
Pipe (pFeatures)
pipeQM (CPipe)
pivotBeam (CFrame)
point2point (CPipe)
point2pointPipe (pForms)
pQM (dodoPM)
profEdit (fForms)
protoPypeForm (dodoDialogs)
protoTypeDialog (dodoDialogs)
PypeBranch2 (pFeatures)
PypeLine2 (pFeatures)
pypeType (pFeatures)
+
+
Q
+
QkMenu (dodoPM)
QueryForm (uForms)
queryModel (CUtils)
QuetzalWorkbench (InitGui)
+
+
R
+
raiseup (CPipe)
redrawDialog (pForms)
Reduct (pFeatures)
ResultSpreadsheet (cut_list.resultSpreadsheet)
reverseBeam (CFrame)
rotateAroundForm (fForms)
rotateWorkPlane (CUtils)
rotJoin (CFrame)
rotjoinObserver (fObservers)
rotWPForm (uForms)
+
+
S
+
selectSolids (CUtils)
shapezDialog (anyShapez)
Shell (pFeatures)
shiftBeam (CFrame)
spinSect (CFrame)
stretchBeam (CFrame)
stretchBeamObserver (fObservers)
stretchForm (fForms)
+
+
T
+
translateForm (fForms)
+
+
U
+
Ubolt (pFeatures)
+
+
V
+
Valve (pFeatures)
valveQM (CPipe)
ViewProvider (pCmd)
ViewProviderFrameBranch (fFeatures)
ViewProviderPypeBranch (pFeatures)
ViewProviderPypeLine (pFeatures)
vQM (dodoPM)
+
+
_
+
_ProfileAngle (fFeatures)
_ProfileChannel (fFeatures)
_ProfileCircle (fFeatures)
_ProfileH (fFeatures)
_ProfileL (fFeatures)
_ProfileOmega (fFeatures)
_ProfileR (fFeatures)
_ProfileRH (fFeatures)
_ProfileT (fFeatures)
_ProfileU (fFeatures)
_ProfileZ (fFeatures)
+
+
+ + + + diff --git a/html/classfFeatures_1_1FrameBranch-members.html b/html/classfFeatures_1_1FrameBranch-members.html new file mode 100644 index 0000000..e5f5769 --- /dev/null +++ b/html/classfFeatures_1_1FrameBranch-members.html @@ -0,0 +1,95 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures.FrameBranch Member List
+
+
+ +

This is the complete list of members for fFeatures.FrameBranch, including all inherited members.

+ + + + + + +
__init__(self, obj, base=None, profile=None) (defined in fFeatures.FrameBranch)fFeatures.FrameBranch
execute(self, obj) (defined in fFeatures.FrameBranch)fFeatures.FrameBranch
objName (defined in fFeatures.FrameBranch)fFeatures.FrameBranch
redraw(self, obj) (defined in fFeatures.FrameBranch)fFeatures.FrameBranch
remove(self, i) (defined in fFeatures.FrameBranch)fFeatures.FrameBranch
+ + + + diff --git a/html/classfFeatures_1_1FrameBranch.html b/html/classfFeatures_1_1FrameBranch.html new file mode 100644 index 0000000..c2f3337 --- /dev/null +++ b/html/classfFeatures_1_1FrameBranch.html @@ -0,0 +1,136 @@ + + + + + + + +Quetzal: fFeatures.FrameBranch Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures.FrameBranch Class Reference
+
+
+
+Inheritance diagram for fFeatures.FrameBranch:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures.FrameBranch:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + +

+Public Member Functions

__init__ (self, obj, base=None, profile=None)
 
execute (self, obj)
 
redraw (self, obj)
 
remove (self, i)
 
+ + + +

+Public Attributes

objName
 
+
The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1FrameBranch__coll__graph.map b/html/classfFeatures_1_1FrameBranch__coll__graph.map new file mode 100644 index 0000000..adaae78 --- /dev/null +++ b/html/classfFeatures_1_1FrameBranch__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1FrameBranch__coll__graph.md5 b/html/classfFeatures_1_1FrameBranch__coll__graph.md5 new file mode 100644 index 0000000..927f3e9 --- /dev/null +++ b/html/classfFeatures_1_1FrameBranch__coll__graph.md5 @@ -0,0 +1 @@ +752dc96c52249dd120af34ffd2c06c8c \ No newline at end of file diff --git a/html/classfFeatures_1_1FrameBranch__coll__graph.png b/html/classfFeatures_1_1FrameBranch__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..da9efadeeebb84e070d445ece2d584f2b9a848da GIT binary patch literal 3841 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 + + + + diff --git a/html/classfFeatures_1_1FrameBranch__inherit__graph.md5 b/html/classfFeatures_1_1FrameBranch__inherit__graph.md5 new file mode 100644 index 0000000..927f3e9 --- /dev/null +++ b/html/classfFeatures_1_1FrameBranch__inherit__graph.md5 @@ -0,0 +1 @@ +752dc96c52249dd120af34ffd2c06c8c \ No newline at end of file diff --git a/html/classfFeatures_1_1FrameBranch__inherit__graph.png b/html/classfFeatures_1_1FrameBranch__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..da9efadeeebb84e070d445ece2d584f2b9a848da GIT binary patch literal 3841 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures.FrameLine Member List
+
+
+ +

This is the complete list of members for fFeatures.FrameLine, including all inherited members.

+ + + + + + + +
__init__(self, obj, section="IPE200", lab=None) (defined in fFeatures.FrameLine)fFeatures.FrameLine
execute(self, fp) (defined in fFeatures.FrameLine)fFeatures.FrameLine
IsActive(self) (defined in fFeatures.FrameLine)fFeatures.FrameLine
onChanged(self, fp, prop) (defined in fFeatures.FrameLine)fFeatures.FrameLine
purge(self, fp) (defined in fFeatures.FrameLine)fFeatures.FrameLine
update(self, fp, copyProfile=True) (defined in fFeatures.FrameLine)fFeatures.FrameLine
+ + + + diff --git a/html/classfFeatures_1_1FrameLine.html b/html/classfFeatures_1_1FrameLine.html new file mode 100644 index 0000000..4e4da77 --- /dev/null +++ b/html/classfFeatures_1_1FrameLine.html @@ -0,0 +1,142 @@ + + + + + + + +Quetzal: fFeatures.FrameLine Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures.FrameLine Class Reference
+
+
+
+Inheritance diagram for fFeatures.FrameLine:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures.FrameLine:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, obj, section="IPE200", lab=None)
 
onChanged (self, fp, prop)
 
purge (self, fp)
 
IsActive (self)
 
update (self, fp, copyProfile=True)
 
execute (self, fp)
 
+

Detailed Description

+
Class for object FrameLine
+Has attributes Base (the path) and Profile to define the frame shape and
+the type section's profile.
+Creates a group to collect the Structure objects.
+Provides methods update() and purge() to redraw the Structure objects
+when the Base is modified.
+

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1FrameLine__coll__graph.map b/html/classfFeatures_1_1FrameLine__coll__graph.map new file mode 100644 index 0000000..11631e6 --- /dev/null +++ b/html/classfFeatures_1_1FrameLine__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1FrameLine__coll__graph.md5 b/html/classfFeatures_1_1FrameLine__coll__graph.md5 new file mode 100644 index 0000000..2a6370a --- /dev/null +++ b/html/classfFeatures_1_1FrameLine__coll__graph.md5 @@ -0,0 +1 @@ +cc3e80c3fb190fcf597f0992cb283c1a \ No newline at end of file diff --git a/html/classfFeatures_1_1FrameLine__coll__graph.png b/html/classfFeatures_1_1FrameLine__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6918d630781e8d402e55266d28b59928829df849 GIT binary patch literal 3680 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 VTxl|{1D}i#^K(`vr3kl}e*siD6{r9J literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1FrameLine__inherit__graph.map b/html/classfFeatures_1_1FrameLine__inherit__graph.map new file mode 100644 index 0000000..11631e6 --- /dev/null +++ b/html/classfFeatures_1_1FrameLine__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1FrameLine__inherit__graph.md5 b/html/classfFeatures_1_1FrameLine__inherit__graph.md5 new file mode 100644 index 0000000..2a6370a --- /dev/null +++ b/html/classfFeatures_1_1FrameLine__inherit__graph.md5 @@ -0,0 +1 @@ +cc3e80c3fb190fcf597f0992cb283c1a \ No newline at end of file diff --git a/html/classfFeatures_1_1FrameLine__inherit__graph.png b/html/classfFeatures_1_1FrameLine__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6918d630781e8d402e55266d28b59928829df849 GIT binary patch literal 3680 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 VTxl|{1D}i#^K(`vr3kl}e*siD6{r9J literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1ViewProviderFrameBranch-members.html b/html/classfFeatures_1_1ViewProviderFrameBranch-members.html new file mode 100644 index 0000000..d81bbfc --- /dev/null +++ b/html/classfFeatures_1_1ViewProviderFrameBranch-members.html @@ -0,0 +1,104 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures.ViewProviderFrameBranch Member List
+
+
+ +

This is the complete list of members for fFeatures.ViewProviderFrameBranch, including all inherited members.

+ + + + + + + + + + + + + + + +
__getstate__(self) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
__init__(self, vobj) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
__setstate__(self, state) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
attach(self, vobj) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
claimChildren(self) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
dumps(self) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
getIcon(self) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
IsActive(self) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
loads(self, state) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
Object (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
onDelete(self, feature, subelements) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
setEdit(self, vobj, mode) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
unsetEdit(self, vobj, mode) (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
ViewObject (defined in fFeatures.ViewProviderFrameBranch)fFeatures.ViewProviderFrameBranch
+ + + + diff --git a/html/classfFeatures_1_1ViewProviderFrameBranch.html b/html/classfFeatures_1_1ViewProviderFrameBranch.html new file mode 100644 index 0000000..fb73959 --- /dev/null +++ b/html/classfFeatures_1_1ViewProviderFrameBranch.html @@ -0,0 +1,143 @@ + + + + + + + +Quetzal: fFeatures.ViewProviderFrameBranch Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures.ViewProviderFrameBranch Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, vobj)
 
IsActive (self)
 
getIcon (self)
 
attach (self, vobj)
 
setEdit (self, vobj, mode)
 
unsetEdit (self, vobj, mode)
 
__getstate__ (self)
 
__setstate__ (self, state)
 
dumps (self)
 
loads (self, state)
 
claimChildren (self)
 
onDelete (self, feature, subelements)
 
+ + + + + +

+Public Attributes

ViewObject
 
Object
 
+
The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileAngle-members.html b/html/classfFeatures_1_1__ProfileAngle-members.html new file mode 100644 index 0000000..231254c --- /dev/null +++ b/html/classfFeatures_1_1__ProfileAngle-members.html @@ -0,0 +1,98 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileAngle Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileAngle, including all inherited members.

+ + + + + + + + + +
__init__(self, _Profile obj, list profile) (defined in fFeatures._ProfileAngle)fFeatures._ProfileAngle
execute(self, _Profile obj)fFeatures._ProfileAngle
g0fFeatures._ProfileAngle
labelfFeatures._ProfileAngle
sa (defined in fFeatures._ProfileAngle)fFeatures._ProfileAngle
sizefFeatures._ProfileAngle
Solid (defined in fFeatures._ProfileAngle)fFeatures._ProfileAngle
standardfFeatures._ProfileAngle
+ + + + diff --git a/html/classfFeatures_1_1__ProfileAngle.html b/html/classfFeatures_1_1__ProfileAngle.html new file mode 100644 index 0000000..0c85f93 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileAngle.html @@ -0,0 +1,182 @@ + + + + + + + +Quetzal: fFeatures._ProfileAngle Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileAngle Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileAngle:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileAngle:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, _Profile obj, list profile)
 
 execute (self, _Profile obj)
 
+ + + + + + + + + + + + + + + + + +

+Public Attributes

label
 Profile name.
 
size
 Profile size base on .csv semantic.
 
standard
 Profile proportion type.
 
Solid
 
g0
 Profile final length.
 
sa
 
+

Detailed Description

+
# Create a angle profile considering round edges
+obj: _Profile object
+profile: list of profile parameters
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
fFeatures._ProfileAngle.execute ( self,
_Profile obj 
)
+
+
Modify provided object based on profile list parameters
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileAngle__coll__graph.map b/html/classfFeatures_1_1__ProfileAngle__coll__graph.map new file mode 100644 index 0000000..f62ce98 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileAngle__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileAngle__coll__graph.md5 b/html/classfFeatures_1_1__ProfileAngle__coll__graph.md5 new file mode 100644 index 0000000..96e2e73 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileAngle__coll__graph.md5 @@ -0,0 +1 @@ +c90cd2367bac42841633696a6c6478b4 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileAngle__coll__graph.png b/html/classfFeatures_1_1__ProfileAngle__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfc7f8e030973cf33dcc7aa1b3b30a6384f7c75 GIT binary patch literal 4139 zcmchai9eKI-^VSLC@o|SC2NfA`<9yQOR^4GvPXzXj4h#*J_r)?HIZQiZapPNeY=5e>|KG;RBfl~{8v~E6kg{i6)^g!Kav+x=RnR#4p92ZV#{p;$?7t~>> zE-o)G&ti`g>iMe7XPzQ>xRdnk05$qmdF2jaiDpZ1@XwKM3Z)JOSNrG!3uoU+LcxE; z6%8`auC0B3r2F|WYJWl(`)}Tu|fl@j&8MC6}F8szB6hX zJF`)Iq1YOSIp-Hd4a&C76q_@XNx&tK${6 zI;N%!nr4$t47q?ts!q=}eMp)S+UNkf) zj8{3BfO&f1DtXb^!$AH4@2L3rvyo9zjAzfjD=A@&pirJ5Auzg*42N*NfB<>TLkg=+ z1$zXM=+@wiH}>=t^YimtdZHq1oa+&$&=j9T%(!#!jNnP}_^nwpxn z#fCNZ^gx-In0Cl5Ycw9--mcr^Y4xqvs5dDow=68!gi~Md>;%ot&m#^tu-C=JesA0s zdUBD_fMR47UjG$yrRLFu%m?E zLoWM)@eQ?g8CltOQBl$4n8Ar!cf#J@o(3+gMobt+9RRaFT?Lxz}&iV9o<)0s0MWh4i+QGU8fLZA&Q7?P#Z zUWkiHY`BoIn;VgXN~M~_?PEd)2L^5-3GS>cEIn~-X=KXsx0N4g)aQW9iavtM%7|!I z#s(Gw)y&_&Mzp%?6|24$8j3mD%R*qkWRPZi7h+1jNHMENvBuv3+wGo%!_m!F9jwGe z-lK2Ov%MT?hl4K|UKI^W=#3u1AV^7`Jo>BHOX$)&PYv3fn5g*IrKNb@Jci~OmKQ4u0bRtet zuMct_9enxRofo7-)^Np+Jwdw7xQ|_{_ z0?~D>pkxQ9=r46)kcK?{#+CZ;2pZ|AbEG0s6|_+YQB}cuT-*A8VoHc2MH>sP|AWx~ zYC+q~?$P@UdmDbeQB$30Q@PLRfA~$VvV{_s1Y_%b@t^GNEH}6NA3S)lWhBd8Po;CR zkFoIb5)TLn2&*JDPHAXpJUt_LT0n~jeoX&=5B-o2eqP(w_Oj~Jm5#Bo^yK6VmR0uZ zJl#y&UuI@T5_whcmY7FJN3XBce!gdFss)9fpaHL5RZu|w_+iZ;ayY2#&W-eUXbrk( zVqyZA=4)pOgX!7Y+9rMe=2;)lt2$0xO;1n%wYr)R6B9G+oDfZhzqKp_kb|PW{*ZIC zx92-Xy)urpnX86Kv2q9-`{0+8lT%Vs!Y?QHofw~}03m!r{1v99RX>W}1<&tTSXd+x z=KB&ZBmJLkO}O`9v9ey{kQ^*G3T!}H21!-UGx(pyzH0C~|HH~O$x22D*(8o=+qST^y!0~HwZp@&C@ zqm-1}5a<2-_k-gne*TOV)Z5wFnI)0D?5xbpZij@Z*4Nix;^07i^*GJU{Qlj$XlduZ z!ZA-;shr`ov^1&kgP`2p-13l+1nt{KM$8}zO)V{WS%#apZ_^JC51%-B5-dlIn#uIy zT-S>;p?k~4P#qmsPR<{`3UR%W_Eikc1Eht8?~A#3e!Y~!Ha|EV1qP+VhdANxzR2%d^J17V z(%=6U=mQL?9DblAEiFCnzg_&{!^>kymE!#3SuZCqzcCjl$->3;khk{TyPmz_u$^Bq zutpzV&-(1vR<-Qx?4~EnEI@Fsii*CftCQ29?l_N^!<>0h7)(~4YTzI0{u*k`Q#o`; z3h*xtiJT*m41i?i=jR_1fqPh)Y)qP)bE2c8^YHL+>`xII%2%HpzwW$8S>{oB@+vl# ziH@Fre~9?|_W<>9-?YU1pJ!ByRiK1f$;rv~@N;(9*|D*)6+m!Z__^eq90QP-Kn`78 zT}`d6e>flh>W*PNeY&u`{A^%gU}WAlZSlsNN@vCrulUL_{FeJ#49o6_^% zAY*4C)g)+twb3siz;$`_{dkph&hW}iTTXd7Bqb%q8aR{P-QC+N5RgNTlMUV;a@;O3 zVnyT3Z^anOkH@pr|=AZtLLED#723b1FMK0bX;XzK!3^2qqaL_evjeI%Ys*1E=p zk%o(li$^Ue8Mw7Aq?OiVx=KJi2V9j&RY4Pjf|TAh3}*}!aN zWp%8pOQA)g};CQ{uo#i zE#Hu&g^$c4S$^uxOsZU`oSZi6gp=x$XU@~ea49(0~<>lq4ngimZqfZo) zE<7YpVH8|z#;SAgZWUKKlS#NL0X-Ic_`Y`%;qBYE))4kWFUbJv0RrS1FmRy3%X!A` z@O-j!U0vOjY>aWS^B_{Gk?tQ)Pytu z%Levw@coLW+Kl#nrtdeW*3h?b_LI}o)4`eavjjpf2EO<&w?qn`@mu66tgU5@>Wqks zJ0mvckp7!GB$sB`P~(N!mjN&l)Vl_DFEEd!KZ%Lw?%Uawl$8mHi^pxxgq#N)r2*XS z8!NM_C?Ek~sh?}RT{brQ^QY%wQ$xe}2OeHt-XP$#syKmD-yr7r%D4_(dZNM`+{TyM zFE?AJxvhfvWb5d7wFY8lY1!B0Hy=@X<(!B}vAxy%Q%+Zt*)7R&}KC8tpVFPt{ z7r`d-3IIE;sMx5L6xfc<&dG@@C~!z}q6Zqoj{5pfy0}%Q+{01z#$UgFX&D-x1xdG9 zQk-AZ)|O{hY)nhpjq+wQHtPl*6i#o?fH9FRv;Aw)YPV$%WG;_ zG&S2beDlIq(Af3u?Zw|?W#Hfe5Upom0HQGW`?o$|&B>D|k4wKTXR3!N=7j+K=)O8HdU1y1ReXG%hQSoS9t!{+63O0|bOkS73>iEC zU^Xn!;00pzlcWek>{S@@zmPv|PDGqdISb?S?=ge5cwf@f_lYISSq# zmoJ=HYVMmpRGS0uAIo*%3u%+TQCn1|QHiu)45d{s3+LsTCfRdG&PUzb^{mi1xv#1+hoh`w}?))9BqXhF0EkjQk(F CfhT(a literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileAngle__inherit__graph.map b/html/classfFeatures_1_1__ProfileAngle__inherit__graph.map new file mode 100644 index 0000000..f62ce98 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileAngle__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileAngle__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileAngle__inherit__graph.md5 new file mode 100644 index 0000000..96e2e73 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileAngle__inherit__graph.md5 @@ -0,0 +1 @@ +c90cd2367bac42841633696a6c6478b4 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileAngle__inherit__graph.png b/html/classfFeatures_1_1__ProfileAngle__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfc7f8e030973cf33dcc7aa1b3b30a6384f7c75 GIT binary patch literal 4139 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 CfhT(a literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileChannel-members.html b/html/classfFeatures_1_1__ProfileChannel-members.html new file mode 100644 index 0000000..ef63459 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileChannel-members.html @@ -0,0 +1,98 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileChannel Member List
+
+ + + + + diff --git a/html/classfFeatures_1_1__ProfileChannel.html b/html/classfFeatures_1_1__ProfileChannel.html new file mode 100644 index 0000000..15cfcab --- /dev/null +++ b/html/classfFeatures_1_1__ProfileChannel.html @@ -0,0 +1,145 @@ + + + + + + + +Quetzal: fFeatures._ProfileChannel Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileChannel Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileChannel:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileChannel:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+ + + + + + + + + + + + + +

+Public Attributes

label
 
size
 
standard
 
sa
 
s0
 
t2
 
+
The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileChannel__coll__graph.map b/html/classfFeatures_1_1__ProfileChannel__coll__graph.map new file mode 100644 index 0000000..659a82d --- /dev/null +++ b/html/classfFeatures_1_1__ProfileChannel__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileChannel__coll__graph.md5 b/html/classfFeatures_1_1__ProfileChannel__coll__graph.md5 new file mode 100644 index 0000000..996ecbd --- /dev/null +++ b/html/classfFeatures_1_1__ProfileChannel__coll__graph.md5 @@ -0,0 +1 @@ +a7d50e9299b46ac203fdb5a3eb555f7f \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileChannel__coll__graph.png b/html/classfFeatures_1_1__ProfileChannel__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..749b09fb9d157d4fc5d6c4929fc15cc8f66fb2b3 GIT binary patch literal 3998 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 + + + + diff --git a/html/classfFeatures_1_1__ProfileChannel__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileChannel__inherit__graph.md5 new file mode 100644 index 0000000..996ecbd --- /dev/null +++ b/html/classfFeatures_1_1__ProfileChannel__inherit__graph.md5 @@ -0,0 +1 @@ +a7d50e9299b46ac203fdb5a3eb555f7f \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileChannel__inherit__graph.png b/html/classfFeatures_1_1__ProfileChannel__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..749b09fb9d157d4fc5d6c4929fc15cc8f66fb2b3 GIT binary patch literal 3998 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileCircle Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileCircle, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileCircle)fFeatures._ProfileCircle
execute(self, obj) (defined in fFeatures._ProfileCircle)fFeatures._ProfileCircle
+ + + + diff --git a/html/classfFeatures_1_1__ProfileCircle.html b/html/classfFeatures_1_1__ProfileCircle.html new file mode 100644 index 0000000..1bb40f5 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileCircle.html @@ -0,0 +1,127 @@ + + + + + + + +Quetzal: fFeatures._ProfileCircle Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileCircle Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileCircle:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileCircle:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric circular beam profile.
+Profile data:
+  D: diameter
+  t1: thickness (optional; "0" for solid section)

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileCircle__coll__graph.map b/html/classfFeatures_1_1__ProfileCircle__coll__graph.map new file mode 100644 index 0000000..ad9f13f --- /dev/null +++ b/html/classfFeatures_1_1__ProfileCircle__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileCircle__coll__graph.md5 b/html/classfFeatures_1_1__ProfileCircle__coll__graph.md5 new file mode 100644 index 0000000..98a8023 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileCircle__coll__graph.md5 @@ -0,0 +1 @@ +be60cf5e7d6608b578a139109aa8cc8d \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileCircle__coll__graph.png b/html/classfFeatures_1_1__ProfileCircle__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..65e52446bb9f270f6c42da0943bdf16364f8b79a GIT binary patch literal 3972 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 JGIjfie*r8e?=%1a literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileCircle__inherit__graph.map b/html/classfFeatures_1_1__ProfileCircle__inherit__graph.map new file mode 100644 index 0000000..ad9f13f --- /dev/null +++ b/html/classfFeatures_1_1__ProfileCircle__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileCircle__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileCircle__inherit__graph.md5 new file mode 100644 index 0000000..98a8023 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileCircle__inherit__graph.md5 @@ -0,0 +1 @@ +be60cf5e7d6608b578a139109aa8cc8d \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileCircle__inherit__graph.png b/html/classfFeatures_1_1__ProfileCircle__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..65e52446bb9f270f6c42da0943bdf16364f8b79a GIT binary patch literal 3972 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 JGIjfie*r8e?=%1a literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileH-members.html b/html/classfFeatures_1_1__ProfileH-members.html new file mode 100644 index 0000000..23b276e --- /dev/null +++ b/html/classfFeatures_1_1__ProfileH-members.html @@ -0,0 +1,92 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileH Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileH, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileH)fFeatures._ProfileH
execute(self, obj) (defined in fFeatures._ProfileH)fFeatures._ProfileH
+ + + + diff --git a/html/classfFeatures_1_1__ProfileH.html b/html/classfFeatures_1_1__ProfileH.html new file mode 100644 index 0000000..065b58d --- /dev/null +++ b/html/classfFeatures_1_1__ProfileH.html @@ -0,0 +1,124 @@ + + + + + + + +Quetzal: fFeatures._ProfileH Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileH Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileH:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileH:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric omega beam profile. Profile data: [W, H, D, t1,t2,t3]

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileH__coll__graph.map b/html/classfFeatures_1_1__ProfileH__coll__graph.map new file mode 100644 index 0000000..4e5ad21 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileH__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileH__coll__graph.md5 b/html/classfFeatures_1_1__ProfileH__coll__graph.md5 new file mode 100644 index 0000000..4114b2e --- /dev/null +++ b/html/classfFeatures_1_1__ProfileH__coll__graph.md5 @@ -0,0 +1 @@ +63fc39d1bd839c2e3d22c63002ece962 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileH__coll__graph.png b/html/classfFeatures_1_1__ProfileH__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e44f2d0c8375760bfecd4b00d47b0b95fd0b98bf GIT binary patch literal 3562 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 + + + + diff --git a/html/classfFeatures_1_1__ProfileH__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileH__inherit__graph.md5 new file mode 100644 index 0000000..4114b2e --- /dev/null +++ b/html/classfFeatures_1_1__ProfileH__inherit__graph.md5 @@ -0,0 +1 @@ +63fc39d1bd839c2e3d22c63002ece962 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileH__inherit__graph.png b/html/classfFeatures_1_1__ProfileH__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e44f2d0c8375760bfecd4b00d47b0b95fd0b98bf GIT binary patch literal 3562 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileL Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileL, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileL)fFeatures._ProfileL
execute(self, obj) (defined in fFeatures._ProfileL)fFeatures._ProfileL
+ + + + diff --git a/html/classfFeatures_1_1__ProfileL.html b/html/classfFeatures_1_1__ProfileL.html new file mode 100644 index 0000000..0376bf7 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileL.html @@ -0,0 +1,124 @@ + + + + + + + +Quetzal: fFeatures._ProfileL Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileL Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileL:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileL:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric L beam profile. Profile data: [width, height, web thickness]

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileL__coll__graph.map b/html/classfFeatures_1_1__ProfileL__coll__graph.map new file mode 100644 index 0000000..dfdc248 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileL__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileL__coll__graph.md5 b/html/classfFeatures_1_1__ProfileL__coll__graph.md5 new file mode 100644 index 0000000..64045e2 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileL__coll__graph.md5 @@ -0,0 +1 @@ +265478b487b6943a30c6a45d883bd054 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileL__coll__graph.png b/html/classfFeatures_1_1__ProfileL__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..386b31c981f8340a72d84ed2e31fc8b661d389cc GIT binary patch literal 3627 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 DaTzeX literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileL__inherit__graph.map b/html/classfFeatures_1_1__ProfileL__inherit__graph.map new file mode 100644 index 0000000..dfdc248 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileL__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileL__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileL__inherit__graph.md5 new file mode 100644 index 0000000..64045e2 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileL__inherit__graph.md5 @@ -0,0 +1 @@ +265478b487b6943a30c6a45d883bd054 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileL__inherit__graph.png b/html/classfFeatures_1_1__ProfileL__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..386b31c981f8340a72d84ed2e31fc8b661d389cc GIT binary patch literal 3627 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 DaTzeX literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileOmega-members.html b/html/classfFeatures_1_1__ProfileOmega-members.html new file mode 100644 index 0000000..431c578 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileOmega-members.html @@ -0,0 +1,92 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileOmega Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileOmega, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileOmega)fFeatures._ProfileOmega
execute(self, obj) (defined in fFeatures._ProfileOmega)fFeatures._ProfileOmega
+ + + + diff --git a/html/classfFeatures_1_1__ProfileOmega.html b/html/classfFeatures_1_1__ProfileOmega.html new file mode 100644 index 0000000..9084ede --- /dev/null +++ b/html/classfFeatures_1_1__ProfileOmega.html @@ -0,0 +1,124 @@ + + + + + + + +Quetzal: fFeatures._ProfileOmega Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileOmega Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileOmega:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileOmega:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric omega beam profile. Profile data: [W, H, D, t1,t2,t3]

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileOmega__coll__graph.map b/html/classfFeatures_1_1__ProfileOmega__coll__graph.map new file mode 100644 index 0000000..fcbb12e --- /dev/null +++ b/html/classfFeatures_1_1__ProfileOmega__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileOmega__coll__graph.md5 b/html/classfFeatures_1_1__ProfileOmega__coll__graph.md5 new file mode 100644 index 0000000..24cd823 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileOmega__coll__graph.md5 @@ -0,0 +1 @@ +e232be624ff1009a056c27ae01e00e10 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileOmega__coll__graph.png b/html/classfFeatures_1_1__ProfileOmega__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e36d45a91c44ac01d8722a673aa6a1d18e3df966 GIT binary patch literal 4322 zcmc&&g{!$B-Myfj5RuOX3C| zOBZV?P-M(6re_t;8Y+=?llg{;o1K7Q4i_>yAjJO?sRr?2p14YN=mAKhs3@7m8X}POCZ!mGM|;@?=9;)2hPUd zyoW@R)j3EpadUTPX~b^s?}sg^;&8ZB30v~-xjGbttgP@H?G!()T6LcptzN|P^0M#7 zWcqwZigegn$dl7uR91F&0g)KAq#7F=E17z~9gX|e^h(lRG28O(1#ksT(C$jk$)s)5 zbEciO5!}?1<9O_4q3wQcaV8#~o>Xb)d)nIeeOVgHy8}kuSp9Iq=mm@l;dBizmwRGTq3H)o1II6K}LsSUmvcCtk!DJdypRsu=a9nLvE)#Fp| z{U*Xf=i%WoUh|mlsZpNp2lTKQi@0@XLnIx$lmj&qiR4uDeZD^xmU(m(gcq}F2dguy z^5CMOp|Skv9SH`lgMZ0Fq@<+GN**Fe_FwiVgWadTq=VCD78hHi7_Q#a(V0)fG>Ny2 z-HssOLXUq{{rKev#&gRB1O>PE#xNB6#>P##I%)ELYivwROc2To7noRCTl;ggX`s+N z=bnro?sD@hGxPIPcRQWnWvgu0^xTQ88f9k2 z212z5*K3WvmPND4drsd@uV`#&V3ToyUB7-kj!Ov-3fj)jPTqfgJQU5u@f;?fs+(uu zn!pvZH{u)-87cX&4zjmC(UHKV)a$~1()x2@p`|-rY2=f?czu0+9EWU7UEQtHvNA6p zpVe>`*xBBbqvbsFXebX}spF&1;v5N8Tv?+cD{CSqBH}(|ZDAp7Q|*cP60ntJi9#)w zh)PQvb+@(YTc@O?bg2C~Dce>Q71inP>A?&+dw3MRdHwnZ_(iR=sEt+3@&%Mf^(37X zrr9kxM9C%NyVNUJmB=QU)$Et9+d5tU%wn8{gJWg$Xwn8Rt9qdZ<>@H_Vth1oO-4w) zH>#mQ-Ki&IVy3dXS{^TAJ~I~+QN#{rgdv-R_LLh8WnIpm%c0o5$j-uV%b=>;yFH&gF(_M*WOli_ZF{~{ zGfJWDX`F!bl|S<NLEsu~QxV2^1~D!7o`_Bn4q%)iLRmguNb=BGPWJ6XRGb ztZgXFM9%u^u<(5f{Osz%Dj`KOt?Rz8mC1^L`ZT!{CIc@kf3o`-Zi{nRs3r=^Ugq;8 z`_|1#yI!e3aU>#B>%lE zdXeyVT$5!U3mjBOdZ#6Pj-?7&&38HFAbV|bj%chCQHMR-r~0TQ!JRtv^`bg?VSJcE z@eKqRUJG*K|LKx_-29q+CV?=sWq2VM+$JT1KNiNwsxYGh#0_r7)zc5rm$=ZXlQb_aAKS{W<* zZ&CfX%7#~7Pb0=_gHr}csO;fY8b(H^$k+4YG}j2pjqcHW_it+}|x zg@mYhcz8OUe4>xNqjG(0CD=;LM5;f1^3U%nFPFJ5h?810CH({R>4WFb2F6`<*+^SY zPu`a=+_BB!d3ny!N5@J_FJUiVzJ$SG)4i2|u{|a~FZWJXVWxCx>RD|<5bo|GeSLjg z>mBT`yERNqm?I-2@2AO~D~YOarYULA)*Gc!vI352I0X|!~7-#R;+CMMD+YlCtB{G;*kA;Ej0bj01k z(ea$hWH{ozcRl_6^9Te8nBu;mQQBk3OFZ7tzyOiRts=oj4^`3AS)7^sh6@2iM$e^q zCAPWW?UCOnF47>a4Cfq2d~UM>298YjR@x!>JOPVh_20s>xu zX#bp@0wP8K4p^e+Vnk?Z(TXJ>Bj*VyNS znONnsgITRib93`{L~oh1UUG6WSjW4Z9IxZON8K4J9iTdw`?9HkjE0PYxZ!pFK9eIG?1rXzpD8xc02wWtpKi}H&2hJ5;K)hRdw_5@bFca)AsiE zD_JxPtGM;M^75BpTj?)SV7?sYdUyDL&GdJ2666WpVR9-<9UXn3uC5M5-x0`MKww}+ zpt5fiWAww8ICf(c%D!q0c$kF7%FxQVP+rE$#7!on|KGW;h4qn|&g2FYWr11Rkp zDzpgPpYXSM^ZU&k&Y>c!v6+BUkt&77c+_yqv(kdI(_?!Hwram$9HB=$WQ58}JhQMV z;rp_@?-I-=be9>RKaN|41MCej5ek9Za3I#T8$W=pav!UV2ihj6^EyJL1AOUv8&#PQ z-Q9Z~9XciStzy8sCAdvHg0Zh@$vJ|ylwSR<})@i@mlKT zJ2^e&^00b6t&lH-1FB+S#(E=xbVhfA0MN2 z+||IKAVYKWg3rJ)t?6@tJOTPR-&lgJWQ|=jEwHmueJ)LI6^1C(@OqxrBNcdcO0yjT z@96FAy);%O-V5W8*ZjVA-SRwa0c2L#pEJ0SkhJIYE%t-vR z*J5I59Sz2-Rg{!00&Rj5q7%G>sN*!R>8YK{0MT&(AUHTUc#)ae)0chMywaULBO?P; z!IQ&zR)D>>uC95o5Hk^$oW!S3A>D5jo)s611Dt^kIiC>_OSCB|he(V8IAZ$ zKw%RST3TD9%ba`cq*7m&{jPsTbsfM9v>NHEcLj0SSFhMAJto=*3XBShi-9RuiMx7} z5eiMDTHknbOdNDe1NW7#m!s!V4Jm;mrJsd|k4_*B446Q$FJ8cMM8(AuL1Re=`f_7Y1R#!paK*gcD5DKWU z|ND2a3;|{3H?7>kaR5tTpnycWrmD(K8q{)dfIle21I&Z8ajxf$5gU7Y5(xxeaMJly zfX;wl2A#(RnQ=uh=|w1a$kd@LTI?wcnhpxROB(b(I|&2|@*ImjXQp=Zqe+EgfK)ZL z%(k|B5N{u!We~o1NqI#v#M;{Wj)sPTx%oHH8?|+JpJ%(N>CVyq#*|xOd?G2WDCNDW zupkaOGIboU0{GC)&F!9^US3VjYk(hIaH0Y4=dppl%Dh862)R8UivA@$X)tgMm| zcTOcg`dVu}J3D?o<*kVCEv$S?yk#S6oArpF^~mJ&ewIzzDNehEHB9e+P5b}&tA=W6 zH3FPEF?>kXe^7*yBYq)j!eeS=)W4j%VJcNKTVZ{LgAxJz_Z3inqIP35Ux?^A-w6J+ OfFLz=?-Z#&4F3;o1Z@QX literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileOmega__inherit__graph.map b/html/classfFeatures_1_1__ProfileOmega__inherit__graph.map new file mode 100644 index 0000000..fcbb12e --- /dev/null +++ b/html/classfFeatures_1_1__ProfileOmega__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileOmega__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileOmega__inherit__graph.md5 new file mode 100644 index 0000000..24cd823 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileOmega__inherit__graph.md5 @@ -0,0 +1 @@ +e232be624ff1009a056c27ae01e00e10 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileOmega__inherit__graph.png b/html/classfFeatures_1_1__ProfileOmega__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e36d45a91c44ac01d8722a673aa6a1d18e3df966 GIT binary patch literal 4322 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 OfFLz=?-Z#&4F3;o1Z@QX literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileR-members.html b/html/classfFeatures_1_1__ProfileR-members.html new file mode 100644 index 0000000..9dcee1a --- /dev/null +++ b/html/classfFeatures_1_1__ProfileR-members.html @@ -0,0 +1,92 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileR Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileR, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileR)fFeatures._ProfileR
execute(self, obj) (defined in fFeatures._ProfileR)fFeatures._ProfileR
+ + + + diff --git a/html/classfFeatures_1_1__ProfileR.html b/html/classfFeatures_1_1__ProfileR.html new file mode 100644 index 0000000..69ab649 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileR.html @@ -0,0 +1,124 @@ + + + + + + + +Quetzal: fFeatures._ProfileR Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileR Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileR:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileR:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric Rectangular solid beam profile. Profile data: [width, height]

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileRH-members.html b/html/classfFeatures_1_1__ProfileRH-members.html new file mode 100644 index 0000000..c724a2c --- /dev/null +++ b/html/classfFeatures_1_1__ProfileRH-members.html @@ -0,0 +1,92 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileRH Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileRH, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileRH)fFeatures._ProfileRH
execute(self, obj) (defined in fFeatures._ProfileRH)fFeatures._ProfileRH
+ + + + diff --git a/html/classfFeatures_1_1__ProfileRH.html b/html/classfFeatures_1_1__ProfileRH.html new file mode 100644 index 0000000..835d042 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileRH.html @@ -0,0 +1,124 @@ + + + + + + + +Quetzal: fFeatures._ProfileRH Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileRH Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileRH:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileRH:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric Rectangular hollow beam profile. Profile data: [width, height, thickness]

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileRH__coll__graph.map b/html/classfFeatures_1_1__ProfileRH__coll__graph.map new file mode 100644 index 0000000..e5f8643 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileRH__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileRH__coll__graph.md5 b/html/classfFeatures_1_1__ProfileRH__coll__graph.md5 new file mode 100644 index 0000000..a58e159 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileRH__coll__graph.md5 @@ -0,0 +1 @@ +a1983b73290266df139949fddc7fce97 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileRH__coll__graph.png b/html/classfFeatures_1_1__ProfileRH__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..35cfc23241784e408f9dec776e0184e3a3779ad1 GIT binary patch literal 3830 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 literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileRH__inherit__graph.map b/html/classfFeatures_1_1__ProfileRH__inherit__graph.map new file mode 100644 index 0000000..e5f8643 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileRH__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileRH__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileRH__inherit__graph.md5 new file mode 100644 index 0000000..a58e159 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileRH__inherit__graph.md5 @@ -0,0 +1 @@ +a1983b73290266df139949fddc7fce97 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileRH__inherit__graph.png b/html/classfFeatures_1_1__ProfileRH__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..35cfc23241784e408f9dec776e0184e3a3779ad1 GIT binary patch literal 3830 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 literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileR__coll__graph.map b/html/classfFeatures_1_1__ProfileR__coll__graph.map new file mode 100644 index 0000000..b94f8b1 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileR__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileR__coll__graph.md5 b/html/classfFeatures_1_1__ProfileR__coll__graph.md5 new file mode 100644 index 0000000..96f628f --- /dev/null +++ b/html/classfFeatures_1_1__ProfileR__coll__graph.md5 @@ -0,0 +1 @@ +989761efeb5ddc43d873178dad9fdcf1 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileR__coll__graph.png b/html/classfFeatures_1_1__ProfileR__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e0dbf9c395199a431f371d6d4eccd3249c1cdf12 GIT binary patch literal 3722 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 K-BLB1sQ& + + + + diff --git a/html/classfFeatures_1_1__ProfileR__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileR__inherit__graph.md5 new file mode 100644 index 0000000..96f628f --- /dev/null +++ b/html/classfFeatures_1_1__ProfileR__inherit__graph.md5 @@ -0,0 +1 @@ +989761efeb5ddc43d873178dad9fdcf1 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileR__inherit__graph.png b/html/classfFeatures_1_1__ProfileR__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e0dbf9c395199a431f371d6d4eccd3249c1cdf12 GIT binary patch literal 3722 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 K-BLB1sQ& + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileT Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileT, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileT)fFeatures._ProfileT
execute(self, obj) (defined in fFeatures._ProfileT)fFeatures._ProfileT
+ + + + diff --git a/html/classfFeatures_1_1__ProfileT.html b/html/classfFeatures_1_1__ProfileT.html new file mode 100644 index 0000000..f4b3dc0 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileT.html @@ -0,0 +1,124 @@ + + + + + + + +Quetzal: fFeatures._ProfileT Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileT Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileT:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileT:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric T beam profile. Profile data: [width, height, web thickness]

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileT__coll__graph.map b/html/classfFeatures_1_1__ProfileT__coll__graph.map new file mode 100644 index 0000000..af413fb --- /dev/null +++ b/html/classfFeatures_1_1__ProfileT__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileT__coll__graph.md5 b/html/classfFeatures_1_1__ProfileT__coll__graph.md5 new file mode 100644 index 0000000..b956782 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileT__coll__graph.md5 @@ -0,0 +1 @@ +66413ca46266589f86fac1c9f6bf5dd2 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileT__coll__graph.png b/html/classfFeatures_1_1__ProfileT__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..978ae9109320e7ea909971843945f8e756d72ad4 GIT binary patch literal 3650 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 b-~ie| + + + + diff --git a/html/classfFeatures_1_1__ProfileT__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileT__inherit__graph.md5 new file mode 100644 index 0000000..b956782 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileT__inherit__graph.md5 @@ -0,0 +1 @@ +66413ca46266589f86fac1c9f6bf5dd2 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileT__inherit__graph.png b/html/classfFeatures_1_1__ProfileT__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..978ae9109320e7ea909971843945f8e756d72ad4 GIT binary patch literal 3650 zcmcIni96Ko8XhH5G>U{sOxd&4L?wLoZ8De`hM~_)vPEdnXDfSTuWVx*+hTZY#cHP|v1P1E!6%d>{*vC|yGWu` zCR5SE!eSN*2VTwskPVQ=YvaYMA$CR0s^=xBfL%3i|O>Vjef9%*X zW@hH{KigQ$O0BwjRSytWRsv>4gg3a!rYBqpU9+PK$%xzgj2R8%<)eSTOY4Gk#0af0 zDAX5x*LW3O1X^}~om`*qou5mz5xsdcx#~f0d}8AJlpjH21{^3ykYZoH zoHh5MY=2LseQgmEW=@pBy3;iB2jY^G#~yNg^*0L|6qLOY}WcF=gpx(EW zr~UY0-w|~_tlQ3mD5w*2VPa{2adC09&JEVGw|PEB<+nJ*W4`CIxOg~7_Nv>o=BwyI zf;PVMl)#NY{QXtvbUHT=PkdaQ8XljM-QqVD5gFNU5C25GInb}*v+3-ta6Vvnja6P= zes6p$*C5f}!NHA4UpD3rA(2G*Dp|Fhou$i~e@kZT#E6QB91#){%J(nX%y8hlX2-6O z8bz&jompDqs7{MorqdH+VxSSEa+ir)O-)V2-+6{<<11@lTEiO~f&+N=ui1V2!Cf9L z0)r*ra1*htadxYII9~l+0+q-9qnL}2uL~A)Tiwv`)L}Kk!p|5C@18WJ5vME5j+&vx zs<)Mu#~Qt4GyFFB;^N{EDe&hYqe`z8Yk0~&G9xUEmGzXs)Q|q`;Ly-tqqvyU0s^1N zP9v+Ut480B=UDHpwm}W5Dl6X^-Sk=}*7FvQ`_vq41LB z^Dj^9k{(Q2qeqTD49I&kbbZ5a^x(>iZ?ki*?Pg3x#^u53m+);Y?aPZPU!GYd(ECF< z)M5Adj&LR!2+g!uVG|l-g@0yOnx``#IZ)ZE6+cl>TGHv)8B2eac6Vy|t7Uq`+bV-i zwlpaN_j6bAe&zU#K8X_t9J^eS&uVKG*RkkVJ0QSOSD|zseqysANqm&M^(uO3))3$M z`;Uq$1e4{C0uv^yoT2)aExTy(FbKtatz3>R1kaq-@Wz%;gBht;|&M=aYr!c51Io^ z>xK9#FN_kT)mpO?Q(gJBRx@_)##_b<|9r-|ixl!lsQuX!nJl7756p@Cmg^egy=GZ4 zI7F!9dLsI7?ff4c;urCqmxj7x^$PzZuK%|MKR3c8(WO@Pca2|`VU1rXaiR{QOwx}A zV7&+uZSkDbZvaygt6hI?K1l@nakoXpYtWl#_jW6?2dSgzI+>G|wccje$dR0pkx_U| z51QW4&>%ydOZl&SHGXC8D0wZ%#>G7|%!k3@FXz*JT*O0P{na-(sHv^Zf+>03*JqUe z?e zNYWV9Yfpa7GL5ila95_J@COD4630(nxZN3bUXeI1hDegTB)l^nDXXiidr?Nlr4Kg& zU7COENH#Gw)za5Lu|5yoZEfL+Yt%5g3I%=Lq?qy^!4?V;0|Z_qdMF+*MI#Y zRaTx+RaHfZqGAY;!QtW0eSL30+5JE1N7M5+J=_)tB~-R&x$^F$hK@Ne*C;ejM7P^A zjjQMM+cyx`eYmyUny{OM9x|q6K&fwYiOP4~kz2~Fn0K|p6aFK1Zg%$3()jgYPJx^5 z!K0(*I-LzD3yZE&Y-2g5gqNKK$V|I|EahDrRF%eCm6P*MzH6o<3U=iR2gMp`ZGEBE zWkN(%HRI4qJZa`8DAZW9pAs*|s+GcSU+SybDf_W1sZkM>gD<2yoSZvzF6k9=x3b~tZf;n27- zB|O68>A{Q-Qe~V#86A4E9!8lN8@JXxq_V*09r+)3^2k~vP$(|X#44i_?mvF;;+}d<|bO5eujPWBorn9Fva+s^66m#{ zXqso^Ofj{hW_Z|a(tqcnU3W@5Nh=b+zkjy_ zj$h|K_aXCVva(MNt`&>LPT&O9)YR$a^hLZLKlZAsax5)#jgi=`bM9gnlK(?*(ol+4Jk!iD^mrNek2B5KCm(L$=r zgBN&sLML2U$F0d?$n;C%;>W=O@bgpFo|(!J`|AG!82graSie1f?>C)zix45(vKtR5 z2x?TEs{QCAdjl-@_P(+Hz1stGKrUMXga?$$m+JF*K#4}v{Q9XCg?ENx372o&;MFqL zy>sV2m~NssL7k6p34&P%|KLHD!+@x-uP@|=FGDUQBqTb6zPkFT7_|&|16NSERZ~=0 z$YQGF;c*Su@j_Tag3aF2x#eJg2a%y7nB5=VZkv^xo7;>2sElPM;1yC&s~Z6fg4wv9 z*2Fr(Qw-5-|IA^jIqZ`?{MW_+vg#pK;S3iSXkspj6lfE$_lo{=1SiMa=SbcKw}ZpN zP-bS@o}LPJRb%qnMn;?udehr`d!gC=y5{D*s651>Isq_>&7{Dj8&sHGUHwuc?9}OV z=fcX$WVg4s0mkpg<{DR;vukQzUw0a2-xf$lhysNi1IOg#IhhR)|)2B~mzOKMvFgAAf zobvKmFqi@PEGQ@ddhn(Ge7>hd^i=zm%D8s;^Iuh&W-3!!e0V zNx`J0KdnvE7R;$YC-I+>F%I^V^{!bR%tjbJKJ8yYHn0;q#Y@h87=N=28CsTl{@Uo35yag6`zx zq+#v-oSxbFuK)GqQfkP7(U;iQ+OLTqHAXN6CV@)_0(nZ b-~ie| + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileU Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileU, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileU)fFeatures._ProfileU
execute(self, obj) (defined in fFeatures._ProfileU)fFeatures._ProfileU
+ + + + diff --git a/html/classfFeatures_1_1__ProfileU.html b/html/classfFeatures_1_1__ProfileU.html new file mode 100644 index 0000000..665bff9 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileU.html @@ -0,0 +1,124 @@ + + + + + + + +Quetzal: fFeatures._ProfileU Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileU Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileU:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileU:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric U beam profile. Profile data: [W, H, D, t1,t2,t3]

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileU__coll__graph.map b/html/classfFeatures_1_1__ProfileU__coll__graph.map new file mode 100644 index 0000000..be3ed85 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileU__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileU__coll__graph.md5 b/html/classfFeatures_1_1__ProfileU__coll__graph.md5 new file mode 100644 index 0000000..7392c9f --- /dev/null +++ b/html/classfFeatures_1_1__ProfileU__coll__graph.md5 @@ -0,0 +1 @@ +4dcbccea8ce70e8a2db9b169fb3f406a \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileU__coll__graph.png b/html/classfFeatures_1_1__ProfileU__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9479cb0c9031347fab0accda39b98d177bc56253 GIT binary patch literal 3623 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 + + + + diff --git a/html/classfFeatures_1_1__ProfileU__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileU__inherit__graph.md5 new file mode 100644 index 0000000..7392c9f --- /dev/null +++ b/html/classfFeatures_1_1__ProfileU__inherit__graph.md5 @@ -0,0 +1 @@ +4dcbccea8ce70e8a2db9b169fb3f406a \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileU__inherit__graph.png b/html/classfFeatures_1_1__ProfileU__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9479cb0c9031347fab0accda39b98d177bc56253 GIT binary patch literal 3623 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures._ProfileZ Member List
+
+
+ +

This is the complete list of members for fFeatures._ProfileZ, including all inherited members.

+ + + +
__init__(self, obj, profile) (defined in fFeatures._ProfileZ)fFeatures._ProfileZ
execute(self, obj) (defined in fFeatures._ProfileZ)fFeatures._ProfileZ
+ + + + diff --git a/html/classfFeatures_1_1__ProfileZ.html b/html/classfFeatures_1_1__ProfileZ.html new file mode 100644 index 0000000..aa3786b --- /dev/null +++ b/html/classfFeatures_1_1__ProfileZ.html @@ -0,0 +1,124 @@ + + + + + + + +Quetzal: fFeatures._ProfileZ Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures._ProfileZ Class Reference
+
+
+
+Inheritance diagram for fFeatures._ProfileZ:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures._ProfileZ:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, obj, profile)
 
execute (self, obj)
 
+

Detailed Description

+
A parametric Z beam profile. Profile data: [width, height, web thickness, flange thickness]

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1__ProfileZ__coll__graph.map b/html/classfFeatures_1_1__ProfileZ__coll__graph.map new file mode 100644 index 0000000..6f6a70b --- /dev/null +++ b/html/classfFeatures_1_1__ProfileZ__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileZ__coll__graph.md5 b/html/classfFeatures_1_1__ProfileZ__coll__graph.md5 new file mode 100644 index 0000000..47c7de2 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileZ__coll__graph.md5 @@ -0,0 +1 @@ +14e51b43aa6ac1c46292b331af95fb45 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileZ__coll__graph.png b/html/classfFeatures_1_1__ProfileZ__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9121eed14a8cdc283f6392e66d818a74051689 GIT binary patch literal 3731 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 DXbo6% literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1__ProfileZ__inherit__graph.map b/html/classfFeatures_1_1__ProfileZ__inherit__graph.map new file mode 100644 index 0000000..6f6a70b --- /dev/null +++ b/html/classfFeatures_1_1__ProfileZ__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1__ProfileZ__inherit__graph.md5 b/html/classfFeatures_1_1__ProfileZ__inherit__graph.md5 new file mode 100644 index 0000000..47c7de2 --- /dev/null +++ b/html/classfFeatures_1_1__ProfileZ__inherit__graph.md5 @@ -0,0 +1 @@ +14e51b43aa6ac1c46292b331af95fb45 \ No newline at end of file diff --git a/html/classfFeatures_1_1__ProfileZ__inherit__graph.png b/html/classfFeatures_1_1__ProfileZ__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9121eed14a8cdc283f6392e66d818a74051689 GIT binary patch literal 3731 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 DXbo6% literal 0 HcmV?d00001 diff --git a/html/classfFeatures_1_1frameBranchForm-members.html b/html/classfFeatures_1_1frameBranchForm-members.html new file mode 100644 index 0000000..7afc8d7 --- /dev/null +++ b/html/classfFeatures_1_1frameBranchForm-members.html @@ -0,0 +1,141 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures.frameBranchForm Member List
+
+
+ +

This is the complete list of members for fFeatures.frameBranchForm, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
accept (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
accept(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
addBeams (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
addBeams(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
ArchList (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
changeAngle (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
changeAngle(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
changeHeadOffset (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
changeHeadOffset(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
changeProfile (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
changeProfile(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
changeTailOffset (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
changeTailOffset(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
cutMiters (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
cutMiters(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
fillSizes (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
fillSizes(self)fFeatures.frameBranchForm
generateBisectPlanes (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
generateBisectPlanes(self)fFeatures.frameBranchForm
getBeamsFromStructureNames(self, sel)fFeatures.frameBranchForm
getMiterPlanesFaces(self, seldoc)fFeatures.frameBranchForm
getPropsfromlistSizes(self)fFeatures.frameBranchForm
labTail (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
makeSingle (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
makeSingle(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
mouseActionB1(self, CtrlAltShift) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
placementfinal (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
placementrelative (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
placementrotplan (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
refresh (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
refresh(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
reject(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
removeBeams (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
removeBeams(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
removeCutVolume(self, beam) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
rotvector (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
roundVectors(self, vxlist, num) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
sectDictList (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
selectAction (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
selectAction(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
spinAngle (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
spinAngle(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
stretchHead (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
stretchHead(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
stretchTail (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
stretchTail(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
SType (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
targets (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
trim (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
trim(self) (defined in fFeatures.frameBranchForm)fFeatures.frameBranchForm
+ + + + diff --git a/html/classfFeatures_1_1frameBranchForm.html b/html/classfFeatures_1_1frameBranchForm.html new file mode 100644 index 0000000..9341a30 --- /dev/null +++ b/html/classfFeatures_1_1frameBranchForm.html @@ -0,0 +1,527 @@ + + + + + + + +Quetzal: fFeatures.frameBranchForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures.frameBranchForm Class Reference
+
+
+
+Inheritance diagram for fFeatures.frameBranchForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fFeatures.frameBranchForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 getPropsfromlistSizes (self)
 
makeSingle (self)
 
cutMiters (self)
 
removeCutVolume (self, beam)
 
 getBeamsFromStructureNames (self, sel)
 
 getMiterPlanesFaces (self, seldoc)
 
roundVectors (self, vxlist, num)
 
 generateBisectPlanes (self)
 
 accept (self)
 
 reject (self)
 
 selectAction (self)
 
 mouseActionB1 (self, CtrlAltShift)
 
 fillSizes (self)
 
addBeams (self)
 
removeBeams (self)
 
changeProfile (self)
 
changeHeadOffset (self)
 
changeTailOffset (self)
 
changeAngle (self)
 
stretchTail (self)
 
stretchHead (self)
 
spinAngle (self)
 
trim (self)
 
refresh (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

sectDictList
 
changeAngle
 
changeHeadOffset
 
changeTailOffset
 
ArchList
 
fillSizes
 
removeBeams
 
addBeams
 
generateBisectPlanes
 
cutMiters
 
changeProfile
 
refresh
 
selectAction
 
trim
 
makeSingle
 
stretchTail
 
stretchHead
 
spinAngle
 
targets
 
labTail
 
accept
 
SType
 
rotvector
 
placementrotplan
 
placementrelative
 
placementfinal
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fFeatures.frameBranchForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
fFeatures.frameBranchForm.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ fillSizes()

+ +
+
+ + + + + + + + +
fFeatures.frameBranchForm.fillSizes ( self)
+
+
Fill standard beam sizes into a framebeams widget
+
+
+
+ +

◆ generateBisectPlanes()

+ +
+
+ + + + + + + + +
fFeatures.frameBranchForm.generateBisectPlanes ( self)
+
+
Get intersection between lines, generate a plane between lines & do a boolean diferente
+
+
+ +

◆ getBeamsFromStructureNames()

+ +
+
+ + + + + + + + + + + + + + + + + + +
fFeatures.frameBranchForm.getBeamsFromStructureNames ( self,
 sel 
)
+
+
Return a list with beam Structures on a frameBranch object type
+
+
+
+ +

◆ getMiterPlanesFaces()

+ +
+
+ + + + + + + + + + + + + + + + + + +
fFeatures.frameBranchForm.getMiterPlanesFaces ( self,
 seldoc 
)
+
+
Return a list with plane named 'cutplane' from the whole seldoc
+
+
+
+ +

◆ getPropsfromlistSizes()

+ +
+
+ + + + + + + + +
fFeatures.frameBranchForm.getPropsfromlistSizes ( self)
+
+
Check profileslist and return full properties selected on the widget list
+
+
+
+ +

◆ mouseActionB1()

+ +
+
+ + + + + + + + + + + + + + + + + + +
fFeatures.frameBranchForm.mouseActionB1 ( self,
 CtrlAltShift 
)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ reject()

+ +
+
+ + + + + + + + +
fFeatures.frameBranchForm.reject ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
fFeatures.frameBranchForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1frameBranchForm__coll__graph.map b/html/classfFeatures_1_1frameBranchForm__coll__graph.map new file mode 100644 index 0000000..26db7fc --- /dev/null +++ b/html/classfFeatures_1_1frameBranchForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfFeatures_1_1frameBranchForm__coll__graph.md5 b/html/classfFeatures_1_1frameBranchForm__coll__graph.md5 new file mode 100644 index 0000000..bb48c87 --- /dev/null +++ b/html/classfFeatures_1_1frameBranchForm__coll__graph.md5 @@ -0,0 +1 @@ +41634583168753666f376bda44d3c415 \ No newline at end of file diff --git a/html/classfFeatures_1_1frameBranchForm__coll__graph.png b/html/classfFeatures_1_1frameBranchForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e5482eee04811e23276732ff81fbf9022ee9fed5 GIT binary patch literal 6820 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 + + + + + + diff --git a/html/classfFeatures_1_1frameBranchForm__inherit__graph.md5 b/html/classfFeatures_1_1frameBranchForm__inherit__graph.md5 new file mode 100644 index 0000000..bb48c87 --- /dev/null +++ b/html/classfFeatures_1_1frameBranchForm__inherit__graph.md5 @@ -0,0 +1 @@ +41634583168753666f376bda44d3c415 \ No newline at end of file diff --git a/html/classfFeatures_1_1frameBranchForm__inherit__graph.png b/html/classfFeatures_1_1frameBranchForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e5482eee04811e23276732ff81fbf9022ee9fed5 GIT binary patch literal 6820 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures.frameLineForm Member List
+
+
+ +

This is the complete list of members for fFeatures.frameLineForm, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self, winTitle="FrameLine Manager", icon="frameline.svg") (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
btn0 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
btn1 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
btn2 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
btn3 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
btn4 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
cb1 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
cb2 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
clear (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
clear(self) (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
combo (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
current (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
edit1 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
firstCol (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
getPath (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
getPath(self) (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
getProfile (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
getProfile(self) (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
insert (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
insert(self) (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
lab1 (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
mainHL (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
radios (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
redraw (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
redraw(self) (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
secondCol (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
sectList (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
setCurrent(self, flname) (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
setCurrentFL (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
setCurrentFL(self, FLName=None) (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
updateSections(self) (defined in fFeatures.frameLineForm)fFeatures.frameLineForm
+ + + + diff --git a/html/classfFeatures_1_1frameLineForm.html b/html/classfFeatures_1_1frameLineForm.html new file mode 100644 index 0000000..0933001 --- /dev/null +++ b/html/classfFeatures_1_1frameLineForm.html @@ -0,0 +1,228 @@ + + + + + + + +Quetzal: fFeatures.frameLineForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures.frameLineForm Class Reference
+
+
+ +

DIALOGS #############################. + More...

+
+Inheritance diagram for fFeatures.frameLineForm:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures.frameLineForm:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, winTitle="FrameLine Manager", icon="frameline.svg")
 
setCurrentFL (self, FLName=None)
 
updateSections (self)
 
setCurrent (self, flname)
 
insert (self)
 
redraw (self)
 
clear (self)
 
getPath (self)
 
getProfile (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

mainHL
 
firstCol
 
lab1
 
sectList
 
cb1
 
cb2
 
radios
 
secondCol
 
current
 
combo
 
setCurrentFL
 
btn0
 
insert
 
edit1
 
btn1
 
redraw
 
btn2
 
getPath
 
btn3
 
getProfile
 
btn4
 
clear
 
+

Detailed Description

+

DIALOGS #############################.

+
Dialog for fFeatures management.
+From this you can:
+- insert a new Frameline object in the model,
+- select its profile,
+- select its path,
+- redraw it,
+- clear it.
+To select profiles, the 2D objects msut be included insied the "Profiles_set"
+group, either created manually or automatically by "Insert Std. Section"
+

The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1frameLineForm__coll__graph.map b/html/classfFeatures_1_1frameLineForm__coll__graph.map new file mode 100644 index 0000000..00cbb90 --- /dev/null +++ b/html/classfFeatures_1_1frameLineForm__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1frameLineForm__coll__graph.md5 b/html/classfFeatures_1_1frameLineForm__coll__graph.md5 new file mode 100644 index 0000000..790e19d --- /dev/null +++ b/html/classfFeatures_1_1frameLineForm__coll__graph.md5 @@ -0,0 +1 @@ +91edd1f038983103c1db12343e2b3c50 \ No newline at end of file diff --git a/html/classfFeatures_1_1frameLineForm__coll__graph.png b/html/classfFeatures_1_1frameLineForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7553f07a736a14984b6ab4762d3b4e7a116e82f7 GIT binary patch literal 4164 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 + + + + diff --git a/html/classfFeatures_1_1frameLineForm__inherit__graph.md5 b/html/classfFeatures_1_1frameLineForm__inherit__graph.md5 new file mode 100644 index 0000000..790e19d --- /dev/null +++ b/html/classfFeatures_1_1frameLineForm__inherit__graph.md5 @@ -0,0 +1 @@ +91edd1f038983103c1db12343e2b3c50 \ No newline at end of file diff --git a/html/classfFeatures_1_1frameLineForm__inherit__graph.png b/html/classfFeatures_1_1frameLineForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7553f07a736a14984b6ab4762d3b4e7a116e82f7 GIT binary patch literal 4164 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fFeatures.insertSectForm Member List
+
+ + + + + diff --git a/html/classfFeatures_1_1insertSectForm.html b/html/classfFeatures_1_1insertSectForm.html new file mode 100644 index 0000000..dcb46fb --- /dev/null +++ b/html/classfFeatures_1_1insertSectForm.html @@ -0,0 +1,218 @@ + + + + + + + +Quetzal: fFeatures.insertSectForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fFeatures.insertSectForm Class Reference
+
+
+
+Inheritance diagram for fFeatures.insertSectForm:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for fFeatures.insertSectForm:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + +

+Public Member Functions

 __init__ (self, winTitle="Insert section", icon="dodo.svg")
 
fillSizes (self)
 
changeRating (self, item)
 
insert (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

mainHL
 
firstCol
 
SType
 
currentRatingLab
 
sizeList
 
sectDictList
 
fileList
 
PRatingsList
 
secondCol
 
lab1
 
ratingList
 
changeRating
 
btn1
 
insert
 
+

Detailed Description

+
dialog for Arch.makeProfile
+This allows to create in the model the 2D profiles to be used
+for beams objects.
+It creates a group named "Profiles_set where the 2D objects are
+conveniently gathered and retrieved by the Frameline Manager.
+NOTE: It's also possible to create customized 2D profiles and drag-and-drop
+them inside this group."
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
fFeatures.insertSectForm.__init__ ( self,
 winTitle = "Insert section",
 icon = "dodo.svg" 
)
+
+
__init__(self,winTitle='Title',icon='filename.svg')
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • fFeatures.py
  • +
+
+ + + + diff --git a/html/classfFeatures_1_1insertSectForm__coll__graph.map b/html/classfFeatures_1_1insertSectForm__coll__graph.map new file mode 100644 index 0000000..5124232 --- /dev/null +++ b/html/classfFeatures_1_1insertSectForm__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfFeatures_1_1insertSectForm__coll__graph.md5 b/html/classfFeatures_1_1insertSectForm__coll__graph.md5 new file mode 100644 index 0000000..5e7363c --- /dev/null +++ b/html/classfFeatures_1_1insertSectForm__coll__graph.md5 @@ -0,0 +1 @@ +c68b9523f3bbfdce8978aa675af99360 \ No newline at end of file diff --git a/html/classfFeatures_1_1insertSectForm__coll__graph.png b/html/classfFeatures_1_1insertSectForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f5d5a4bf6d4fc29d28811bd62e34d65cc34903 GIT binary patch literal 4613 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 + + + + diff --git a/html/classfFeatures_1_1insertSectForm__inherit__graph.md5 b/html/classfFeatures_1_1insertSectForm__inherit__graph.md5 new file mode 100644 index 0000000..5e7363c --- /dev/null +++ b/html/classfFeatures_1_1insertSectForm__inherit__graph.md5 @@ -0,0 +1 @@ +c68b9523f3bbfdce8978aa675af99360 \ No newline at end of file diff --git a/html/classfFeatures_1_1insertSectForm__inherit__graph.png b/html/classfFeatures_1_1insertSectForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f5d5a4bf6d4fc29d28811bd62e34d65cc34903 GIT binary patch literal 4613 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fForms.alignForm Member List
+
+
+ +

This is the complete list of members for fForms.alignForm, including all inherited members.

+ + + + + + + +
__init__(self) (defined in fForms.alignForm)fForms.alignForm
accept(self) (defined in fForms.alignForm)fForms.alignForm
faceRef (defined in fForms.alignForm)fForms.alignForm
refPlane(self, norm) (defined in fForms.alignForm)fForms.alignForm
selectAction (defined in fForms.alignForm)fForms.alignForm
selectAction(self) (defined in fForms.alignForm)fForms.alignForm
+ + + + diff --git a/html/classfForms_1_1alignForm.html b/html/classfForms_1_1alignForm.html new file mode 100644 index 0000000..d126098 --- /dev/null +++ b/html/classfForms_1_1alignForm.html @@ -0,0 +1,241 @@ + + + + + + + +Quetzal: fForms.alignForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fForms.alignForm Class Reference
+
+
+
+Inheritance diagram for fForms.alignForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fForms.alignForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 selectAction (self)
 
refPlane (self, norm)
 
 accept (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
reject (self)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

faceRef
 
selectAction
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fForms.alignForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
fForms.alignForm.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
fForms.alignForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fForms.py
  • +
+
+ + + + diff --git a/html/classfForms_1_1alignForm__coll__graph.map b/html/classfForms_1_1alignForm__coll__graph.map new file mode 100644 index 0000000..230cc35 --- /dev/null +++ b/html/classfForms_1_1alignForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1alignForm__coll__graph.md5 b/html/classfForms_1_1alignForm__coll__graph.md5 new file mode 100644 index 0000000..5115023 --- /dev/null +++ b/html/classfForms_1_1alignForm__coll__graph.md5 @@ -0,0 +1 @@ +cdf471981689e348f8aef75b8f9195b6 \ No newline at end of file diff --git a/html/classfForms_1_1alignForm__coll__graph.png b/html/classfForms_1_1alignForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a4b284be04c7b66ece1adb274947eeabb426cc GIT binary patch literal 6294 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1alignForm__inherit__graph.map b/html/classfForms_1_1alignForm__inherit__graph.map new file mode 100644 index 0000000..230cc35 --- /dev/null +++ b/html/classfForms_1_1alignForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1alignForm__inherit__graph.md5 b/html/classfForms_1_1alignForm__inherit__graph.md5 new file mode 100644 index 0000000..5115023 --- /dev/null +++ b/html/classfForms_1_1alignForm__inherit__graph.md5 @@ -0,0 +1 @@ +cdf471981689e348f8aef75b8f9195b6 \ No newline at end of file diff --git a/html/classfForms_1_1alignForm__inherit__graph.png b/html/classfForms_1_1alignForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a4b284be04c7b66ece1adb274947eeabb426cc GIT binary patch literal 6294 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1extendForm-members.html b/html/classfForms_1_1extendForm-members.html new file mode 100644 index 0000000..5ab71eb --- /dev/null +++ b/html/classfForms_1_1extendForm-members.html @@ -0,0 +1,95 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fForms.extendForm Member List
+
+
+ +

This is the complete list of members for fForms.extendForm, including all inherited members.

+ + + + + + +
__init__(self) (defined in fForms.extendForm)fForms.extendForm
accept(self) (defined in fForms.extendForm)fForms.extendForm
selectAction (defined in fForms.extendForm)fForms.extendForm
selectAction(self) (defined in fForms.extendForm)fForms.extendForm
target (defined in fForms.extendForm)fForms.extendForm
+ + + + diff --git a/html/classfForms_1_1extendForm.html b/html/classfForms_1_1extendForm.html new file mode 100644 index 0000000..4f8522e --- /dev/null +++ b/html/classfForms_1_1extendForm.html @@ -0,0 +1,238 @@ + + + + + + + +Quetzal: fForms.extendForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fForms.extendForm Class Reference
+
+
+
+Inheritance diagram for fForms.extendForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fForms.extendForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 selectAction (self)
 
 accept (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
reject (self)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

selectAction
 
target
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fForms.extendForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
fForms.extendForm.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
fForms.extendForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fForms.py
  • +
+
+ + + + diff --git a/html/classfForms_1_1extendForm__coll__graph.map b/html/classfForms_1_1extendForm__coll__graph.map new file mode 100644 index 0000000..d0d0296 --- /dev/null +++ b/html/classfForms_1_1extendForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1extendForm__coll__graph.md5 b/html/classfForms_1_1extendForm__coll__graph.md5 new file mode 100644 index 0000000..3a348f4 --- /dev/null +++ b/html/classfForms_1_1extendForm__coll__graph.md5 @@ -0,0 +1 @@ +7753f2268a46519b8c6b6b6ccab41717 \ No newline at end of file diff --git a/html/classfForms_1_1extendForm__coll__graph.png b/html/classfForms_1_1extendForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb12bdd5e3213d8f691028b3b75ddda4b363be6 GIT binary patch literal 6467 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 xkdH&@MQ)VC&M(il72^K=k;C + + + + + + diff --git a/html/classfForms_1_1extendForm__inherit__graph.md5 b/html/classfForms_1_1extendForm__inherit__graph.md5 new file mode 100644 index 0000000..3a348f4 --- /dev/null +++ b/html/classfForms_1_1extendForm__inherit__graph.md5 @@ -0,0 +1 @@ +7753f2268a46519b8c6b6b6ccab41717 \ No newline at end of file diff --git a/html/classfForms_1_1extendForm__inherit__graph.png b/html/classfForms_1_1extendForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb12bdd5e3213d8f691028b3b75ddda4b363be6 GIT binary patch literal 6467 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 xkdH&@MQ)VC&M(il72^K=k;C + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fForms.fillForm Member List
+
+
+ +

This is the complete list of members for fForms.fillForm, including all inherited members.

+ + + + + + +
__init__(self) (defined in fForms.fillForm)fForms.fillForm
accept(self) (defined in fForms.fillForm)fForms.fillForm
beam (defined in fForms.fillForm)fForms.fillForm
selectAction (defined in fForms.fillForm)fForms.fillForm
selectAction(self) (defined in fForms.fillForm)fForms.fillForm
+ + + + diff --git a/html/classfForms_1_1fillForm.html b/html/classfForms_1_1fillForm.html new file mode 100644 index 0000000..840fd27 --- /dev/null +++ b/html/classfForms_1_1fillForm.html @@ -0,0 +1,238 @@ + + + + + + + +Quetzal: fForms.fillForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fForms.fillForm Class Reference
+
+
+
+Inheritance diagram for fForms.fillForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fForms.fillForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 accept (self)
 
 selectAction (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
reject (self)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

beam
 
selectAction
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fForms.fillForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
fForms.fillForm.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
fForms.fillForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fForms.py
  • +
+
+ + + + diff --git a/html/classfForms_1_1fillForm__coll__graph.map b/html/classfForms_1_1fillForm__coll__graph.map new file mode 100644 index 0000000..4a39e5f --- /dev/null +++ b/html/classfForms_1_1fillForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1fillForm__coll__graph.md5 b/html/classfForms_1_1fillForm__coll__graph.md5 new file mode 100644 index 0000000..f282ca7 --- /dev/null +++ b/html/classfForms_1_1fillForm__coll__graph.md5 @@ -0,0 +1 @@ +a96d7702d5fa30e8bfef9d29fa9fbc85 \ No newline at end of file diff --git a/html/classfForms_1_1fillForm__coll__graph.png b/html/classfForms_1_1fillForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d39ab40658bf1e107b1abcd1307caec893787852 GIT binary patch literal 5903 zcmcgwbyQT{+COv&N(e}Uql6+IiuBMar67%jpdbR$AvvHhbO;CxjifIPqjXD1HwZ{c zcMW&*-n;I1zx)69ty!F5?K$VHy`TN;UxjL_E07Y?5kn9}s-y_l0^f7suZj>KTuE}Y zioqAYxrzcDy1e?NqjO^*h`L1yF0JF1vN7$cqce&o*xtH@&nntLNJv4B@FUi9kCnPn z5O{2BW7~KPljpu`_)@0dIlrht$&QFZM2-wb=Gq;ZpQN&on2Wvy>D5vmO#ZzBXEmk9=)oimagz8pcv3 zygkZR=-|X8Bx0~ye2W|^Bfqj3*lPL;9qs}|hDD%xy}rKQ)WLzL_F6!#%Q|&fSQtFP zY@Z56V)_cU0P)|wK@iFJUephnBzdu_p{T4(VT3Pm!-wKGpVP*Kkf5O8{>0}`pTgGG zY+udPkNfGCDForzys+x~96mClhkj)@T5Ob8QqrEImc0K}T=)%x)NKLBUvTv6_0xm( zy!`xu$-}V*M+i^UeHVr~9sQ1~tfaK6NfMM$_f0r^-BgMq6%BG_~CD9;c(Tv#~(; z3-7x>&jJGj)3dU0Ax%BK;4e>0y1X?$KMw8h*Q~CtW)T*qR#Q_WBqWs5)~1A5Zr{df zY-}v8sE|`ty+%h*9~Bu1`TF|yB=X@%NJuCuDoV-7_)8;kEIgv(;^cI7b%#u}bJepq zCab!u*4Ne)v$Y0x7TQA*E8!wDEZ47J|7j!mHm##WF)TEcl?@e6FQTQR6Fc>LYfHoT ze1X~Jko?9CDbJ(LJ8WzwCML?NszWawUcG{`p+siAV)Tj)$G0Zx3JMBPg@yMiywAfK zHKa)q2u%Znu=I2m_auX&;M`pHun!-|nV86+?W3a*nVsfE7%%S)cJ-7MN6!Qv6M0Wh zu?Qw{E}oLSJSin5A_QSjP|#SJMM$s5b#>PyQ3ffTXc&>6o?f-nazyWLZSAAHVcV0# zfDPBpsezZiZ#=sbcod|h{M3_UVklus{su*DV6C1-A)&3Ke)z(^7%#8m`H)=|qRZoU zNlktI(9%-gn!bGP+&8N~??6Yh`}Mw;K0V1ICG8vBhSfJ7K78nQx|$2NG7QvTP(&oN ztc)DGK~DbOb=LbSnTxl#IOe3!7aJ-pDthw#`B_I>*J&G;U};ts4BXt@+KLBu;ThUP zNK0FLXGmM4)BF75qU_DQ%<V(&>wH)s( zM5UyBbX;h|f+`(mBfvk6;BBB!j|Y%GxK2(^P=h}nNn~>Jy^w@kOrXv^0|VsNy(!Xi za(K3Oc6^pyRH=4fM~yv6>B8|T+125Wj(qpIx#!o`xT+}0RaI3NC*$MekM{>P9M2A4 z$Hv7qj*s6WBO`lT2TEq0<{ey6z%^CxPHAjx?Di{^9fAgP)M83##L|Q;gIlqvq@rQf zwY6)wUt;R&>dyDdUk=t*%!1n&+L2q8QzIkPm6es~&B4Y-Y4*faP@Fm=N&e<}h%V}u zfK_^49$`&Q4NAq#qX|op&ARXNO(X0<0UwIst5g4xs0HhVDhnBl1-2s;{%lEn?zi}W zZfVAxwe$gaQnADJh4D)D<-DPZWm4nOkNp4~Q8>ID-r`dc4U4mB+wzAEILEefA&xVp zyXs@NO7m^%bSK2^tj*f1+}tT`JoMHBBNDn;Gnc|UP0=1Y@}RQ zm!1w*=}8|-jIxJUcwRqW_Jz@_xnuHvLfuMpVIM+fDNWx||K%3l7W@x5HYxE7nEgEo zya}bIw~kAtjlVeaqV(hBe%~$1!{V)7e;eKJRl-ymLZkA-U)ds{0qG~-mW9UytsE99 zQ#AHW(9L5jo69y}2?|pfM-zTxGAM_;bvd(knk%vB#*85F71o3W^1q8nP!7;Yw zsaHE_A?EpK`*u1xpGe~ex3Pz}Ibw?tyoPeG@!^(}fDLcfNnL z?YnZ8kfW#dtFwGuD~@%|T(%kM*M?$L>Hof$eXL>9HkL`1Djk9nSczPDG&Z+$`|qmX zqD0_yBuX(zwc-ByA2|MB8}omEOS-);>U4i~@WUOYM;s_xVcuC=MhMd2JT7@ckHcm_ zK~0^rN1z*rb~)VL_1M2z#(FY;ZJfB!|3Kl%lPAb-PttTW`r`Jz;IgQkDri^eKNp6C z`OW%Xio=v-)YQTw4?JVi(vZHFXR{ZZmpuY~EZp2`B|^Lx{D)2x>oL4-i$Akf@`{Rr zU`o6qA|aWXw^LG6>kd>@RAk-UM4OtM@pL%BAz^AmG9$q$Js5xbWtdGwq-yk?QZ%pK z$bIklT#KxfK{N6OQhMRJuDE+|TwN8OKd1k8arm4gPPx$JJJZh2PGr^@kLz7_c9LS9 z!o)<{`ojskXBD=(Y2IRw9z{k*vdliXe?L$wzh$vA1`E1-_pYeR+R*I+=fxClG+t?T zHlCcE+?%&=*UHeDnK;?m*^w|JCMG6Lt~d{)%T^kbmflpcrODOR)o1l?e48`q4@J+b zu&X7F9G#s5!GfT<-KFko?=xX4Vmw1b!?|C-elCli6=c@b+-!XKQcU2o!1~Q)*7!W^w`gCk;%-OE0yu4-j z%TqqHCfu>f$s+@kCr`*Xr|Uv~{W5=HZQTse&d0|G9r1D~?+M_^k%!-GE9hRnd|B;t z@yNiypmsPVIr+otV6JSD-jTi}K;5qH?k6TDNKWmXhN&sT-05e%`Nmgj!%Q%0&Q453lmRGNy!=~B3tTH-N6>xu#U~*<>LR1MN)wB< zazGYg5fOLUP?-wI=zsv6ii(QP4Zuq;%*><@4h}8~zUSp3>e1-V*47{|Z|}~Tna}(J z0^w^ZWN=WHzs1-L&e+I^d~tDc`RhqxHa5WVR5x$lp&18*fElu8&wq>TJ_39A$lb#u zT0ZmE?kOCdR_L_cOAgh(na3t~kvul4C@=5-Gyd1hv%`(uuf-Q<0%SBaG|I}#(d}jC zt;FsOG!G2Z2Qn49UHjwXsVBbs`j)g0PfjM^)%dImW(5@|+I#RVXiBw^S z8C8R#cmyJX;h_v5tD&(mMR=Q|I>E0fylt=vS(+SqH8uLi@d*j+H0~$6me^827eq}u z%+xDED-#uVvc_q7M=>r3Yr5D{fOqboK5L8seXx3dvIi(o4jjaC(?;x?BD>3PYaARL zEI~4?msUP+7=(m`Uf9{GFneud>FVhnx*MX==+#u$nE`!jDk`|xyFZbW08zYaiX_`t z8==F$SE2~tKb&;X1`>~)95iA~Qc{vv%2~np>gq(OA81F8d-qf@)|QrXCO#*3$Zxej zWJJthi!RzVoSu3lCMU1=%nsXDobRQIxu)xInZ10;$wMz-^>J!sYU**;0rT%sKc}Unj4iAiC-z{o9(2t*w7e&BLCa9uJ0)q9X1G#`TDcvm=X* zi3$!Lo_3(Tx4TU+Uq?^tif7&H))VWDwMl=Ak}i!E>;Hux8XC&M&D{!w0KTiMD=r@1 z!57S@PjrgWfk!i*8oAS>qcn_+jMt~P7M#@&%sNVNJlx#U0S*DRw)?f@+o>|f{b!a^ zzimZFcXvzzSOb}IHpS-VrmXRI5rZP?t@=GOY;0@~FY{%vE5|FDNKGv*|N8pJi;Ih< z11LEb6jRk`nxnIEq3a`GO#Qi&tSrtIz^Ww+&jU3m`eqIqDbx>`m@t5@R3b4kvGd`$ z%SC0SFclS*X;&;~K*4oLRZT5pzy`lu-Jval@dFUGSy@>uLP9se^lYmn(8F7+t3*LE z?-v(e05s~p{5d$tXVLc2_~@iMRok0(_jWosZF)rpL3dQ*P1i??s$I93Fxw%L9UF&- zhtK}9B1NH4k%@_jhzPP*<6rR{9UV(6D}yU44kAakocDgKftO~Y(TtXsmSa^8%v|^G zMI|MTTTBCtv$C>MR8ngEcuOD>Fb`7VlrZM5+FF^fZ`;mpH;+YU^qu4BEuUNgGNovM zFd;vZMJ$F3bQ5{autDEr6A%!bR5@sAQ2;n}++9?1PYWSq^amh)ety2)$)0AqzcPUM z_>n=!yWv7?D(bcZz;kSRdivv&lY{lK!@Iyi^huoEk5#^7?6I0{zkwc>v>oEOT7u-| zNne>+Grs7HUcGT10HEf`kKpyO2UJA(7Mv<>SW(e z*X|9Cj#@POo<66Og#b7?j!8*j$jZrSYHueHub<>}*T+eqi3Ij66kzj-hxOJB8i7F2 z4pjm(GCwz$zD#_uyiqk993D$|#_a+o!`6-Y!%Iy|XPOTYT{ufIIc z)oC%0|5Hi!RZTEfL(GpmxpJdTr#YG&T+D_!X(Hu(0iFjWZ%1r2$soF>7H`S8u2#Jk{D2ay z@L2hPY>IwXEXKPOrnb1RDQH=Y;B|j(AvMM8+jv z>e_e-t@!W34}wxueuob}OjJVp zk~6vWJsl5yq?e&V%_ zxwL4j4&`p)1xKTQVuGvo8k$ZI3l}0GA*rqjN1QDnoGwle%xI*(;s4t%-lDW=At(h0 zT1iO>5gy)}o94q+n<8D~dGuh$b4$DsNUBNNt7wLjGT?cY{efF@sL-F!fw%JdBrh2( z+9O&)LS$xc&IX?8?C9`IO=TP@dQLz|N%_Lc3RPWA3oss~V&P4@gH>2q*rMUHOPRWT zvG(-4jDkXl`ga6^uqRD&wtwkB1(@(FWZ>&b6{7(lKpx9U{;Av7hXHWK) z$?54y#Kgn|g@mvmAQW%V&|For{t|QMwq8_KYBRugU;isEpoc3i1V%4I?~CK+)Wg{L zcyo|7042l0#nlum$HYj(x3{+&QXV>ar1-CW=-7#PaU0{(@Saw{ z>YA;strUFs>)$O%z(5R)qUYhOS7W7E>!T$Kc6RrGamXC?-Ve!W6N`3)2pRyEgZC?H zXec;22>|wpii&yt0*QKsbVPw3SPcBq^o zc_dT#@v$3&gcmK4p`f;eL`02XYWuZmAemzj_n=ZhGRXl~`q^WRv+!9NczETyY`80o zUXQuMdnxWI8S<9EZ#j(U&u!<6QJAcaNJ&l| JUMyqk{}19-Q1Ac% literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1fillForm__inherit__graph.map b/html/classfForms_1_1fillForm__inherit__graph.map new file mode 100644 index 0000000..4a39e5f --- /dev/null +++ b/html/classfForms_1_1fillForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1fillForm__inherit__graph.md5 b/html/classfForms_1_1fillForm__inherit__graph.md5 new file mode 100644 index 0000000..f282ca7 --- /dev/null +++ b/html/classfForms_1_1fillForm__inherit__graph.md5 @@ -0,0 +1 @@ +a96d7702d5fa30e8bfef9d29fa9fbc85 \ No newline at end of file diff --git a/html/classfForms_1_1fillForm__inherit__graph.png b/html/classfForms_1_1fillForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d39ab40658bf1e107b1abcd1307caec893787852 GIT binary patch literal 5903 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 JUMyqk{}19-Q1Ac% literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1profEdit-members.html b/html/classfForms_1_1profEdit-members.html new file mode 100644 index 0000000..64e1827 --- /dev/null +++ b/html/classfForms_1_1profEdit-members.html @@ -0,0 +1,99 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fForms.profEdit Member List
+
+
+ +

This is the complete list of members for fForms.profEdit, including all inherited members.

+ + + + + + + + + + +
__init__(self) (defined in fForms.profEdit)fForms.profEdit
accept(self) (defined in fForms.profEdit)fForms.profEdit
apply (defined in fForms.profEdit)fForms.profEdit
apply(self) (defined in fForms.profEdit)fForms.profEdit
label (defined in fForms.profEdit)fForms.profEdit
mouseActionB1(self, CtrlAltShift) (defined in fForms.profEdit)fForms.profEdit
setProfile(self, typeS) (defined in fForms.profEdit)fForms.profEdit
shiftProfile(self, sect=None) (defined in fForms.profEdit)fForms.profEdit
type (defined in fForms.profEdit)fForms.profEdit
+ + + + diff --git a/html/classfForms_1_1profEdit.html b/html/classfForms_1_1profEdit.html new file mode 100644 index 0000000..9bc09a2 --- /dev/null +++ b/html/classfForms_1_1profEdit.html @@ -0,0 +1,263 @@ + + + + + + + +Quetzal: fForms.profEdit Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fForms.profEdit Class Reference
+
+
+
+Inheritance diagram for fForms.profEdit:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fForms.profEdit:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
setProfile (self, typeS)
 
 accept (self)
 
apply (self)
 
 mouseActionB1 (self, CtrlAltShift)
 
shiftProfile (self, sect=None)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
selectAction (self)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
reject (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

apply
 
type
 
label
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
selectAction
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fForms.profEdit.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
fForms.profEdit.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ mouseActionB1()

+ +
+
+ + + + + + + + + + + + + + + + + + +
fForms.profEdit.mouseActionB1 ( self,
 CtrlAltShift 
)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fForms.py
  • +
+
+ + + + diff --git a/html/classfForms_1_1profEdit__coll__graph.map b/html/classfForms_1_1profEdit__coll__graph.map new file mode 100644 index 0000000..fd30d45 --- /dev/null +++ b/html/classfForms_1_1profEdit__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1profEdit__coll__graph.md5 b/html/classfForms_1_1profEdit__coll__graph.md5 new file mode 100644 index 0000000..f7827e3 --- /dev/null +++ b/html/classfForms_1_1profEdit__coll__graph.md5 @@ -0,0 +1 @@ +c73229c4dd148ac465f1e5bb99a59b79 \ No newline at end of file diff --git a/html/classfForms_1_1profEdit__coll__graph.png b/html/classfForms_1_1profEdit__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5066306f3accb7d4953b4ab48dc9ba84c415f7 GIT binary patch literal 6219 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 literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1profEdit__inherit__graph.map b/html/classfForms_1_1profEdit__inherit__graph.map new file mode 100644 index 0000000..fd30d45 --- /dev/null +++ b/html/classfForms_1_1profEdit__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1profEdit__inherit__graph.md5 b/html/classfForms_1_1profEdit__inherit__graph.md5 new file mode 100644 index 0000000..f7827e3 --- /dev/null +++ b/html/classfForms_1_1profEdit__inherit__graph.md5 @@ -0,0 +1 @@ +c73229c4dd148ac465f1e5bb99a59b79 \ No newline at end of file diff --git a/html/classfForms_1_1profEdit__inherit__graph.png b/html/classfForms_1_1profEdit__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5066306f3accb7d4953b4ab48dc9ba84c415f7 GIT binary patch literal 6219 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 literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1rotateAroundForm-members.html b/html/classfForms_1_1rotateAroundForm-members.html new file mode 100644 index 0000000..c29b36a --- /dev/null +++ b/html/classfForms_1_1rotateAroundForm-members.html @@ -0,0 +1,101 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fForms.rotateAroundForm Member List
+
+
+ +

This is the complete list of members for fForms.rotateAroundForm, including all inherited members.

+ + + + + + + + + + + + +
__init__(self) (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
accept(self, ang=None) (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
arrow (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
Axis (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
deleteArrow(self) (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
getPrincipalAx(self, ax="Z") (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
reject(self) (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
reverse (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
reverse(self) (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
selectAction (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
selectAction(self) (defined in fForms.rotateAroundForm)fForms.rotateAroundForm
+ + + + diff --git a/html/classfForms_1_1rotateAroundForm.html b/html/classfForms_1_1rotateAroundForm.html new file mode 100644 index 0000000..7a66fd3 --- /dev/null +++ b/html/classfForms_1_1rotateAroundForm.html @@ -0,0 +1,285 @@ + + + + + + + +Quetzal: fForms.rotateAroundForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fForms.rotateAroundForm Class Reference
+
+
+
+Inheritance diagram for fForms.rotateAroundForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fForms.rotateAroundForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 accept (self, ang=None)
 
reverse (self)
 
getPrincipalAx (self, ax="Z")
 
 selectAction (self)
 
deleteArrow (self)
 
 reject (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

selectAction
 
reverse
 
Axis
 
arrow
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Detailed Description

+
Dialog for rotateTheBeamAround().
+It allows to rotate one object around one edge or the axis of a circular edge (or one principal axis.)
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fForms.rotateAroundForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + + + + + + + + + + + +
fForms.rotateAroundForm.accept ( self,
 ang = None 
)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ reject()

+ +
+
+ + + + + + + + +
fForms.rotateAroundForm.reject ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
fForms.rotateAroundForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fForms.py
  • +
+
+ + + + diff --git a/html/classfForms_1_1rotateAroundForm__coll__graph.map b/html/classfForms_1_1rotateAroundForm__coll__graph.map new file mode 100644 index 0000000..b0df166 --- /dev/null +++ b/html/classfForms_1_1rotateAroundForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1rotateAroundForm__coll__graph.md5 b/html/classfForms_1_1rotateAroundForm__coll__graph.md5 new file mode 100644 index 0000000..8cc561f --- /dev/null +++ b/html/classfForms_1_1rotateAroundForm__coll__graph.md5 @@ -0,0 +1 @@ +2fb1779e57017697af4517cf41815f66 \ No newline at end of file diff --git a/html/classfForms_1_1rotateAroundForm__coll__graph.png b/html/classfForms_1_1rotateAroundForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b695e50043370f75e642a9896541b6a566e61624 GIT binary patch literal 6742 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 Hp1%7p7pmZ` literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1rotateAroundForm__inherit__graph.map b/html/classfForms_1_1rotateAroundForm__inherit__graph.map new file mode 100644 index 0000000..b0df166 --- /dev/null +++ b/html/classfForms_1_1rotateAroundForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1rotateAroundForm__inherit__graph.md5 b/html/classfForms_1_1rotateAroundForm__inherit__graph.md5 new file mode 100644 index 0000000..8cc561f --- /dev/null +++ b/html/classfForms_1_1rotateAroundForm__inherit__graph.md5 @@ -0,0 +1 @@ +2fb1779e57017697af4517cf41815f66 \ No newline at end of file diff --git a/html/classfForms_1_1rotateAroundForm__inherit__graph.png b/html/classfForms_1_1rotateAroundForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b695e50043370f75e642a9896541b6a566e61624 GIT binary patch literal 6742 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 Hp1%7p7pmZ` literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1stretchForm-members.html b/html/classfForms_1_1stretchForm-members.html new file mode 100644 index 0000000..f7162b9 --- /dev/null +++ b/html/classfForms_1_1stretchForm-members.html @@ -0,0 +1,102 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fForms.stretchForm Member List
+
+
+ +

This is the complete list of members for fForms.stretchForm, including all inherited members.

+ + + + + + + + + + + + + +
__init__(self) (defined in fForms.stretchForm)fForms.stretchForm
accept(self) (defined in fForms.stretchForm)fForms.stretchForm
changeL (defined in fForms.stretchForm)fForms.stretchForm
changeL(self) (defined in fForms.stretchForm)fForms.stretchForm
edit12L (defined in fForms.stretchForm)fForms.stretchForm
edit12L(self) (defined in fForms.stretchForm)fForms.stretchForm
L (defined in fForms.stretchForm)fForms.stretchForm
labTail (defined in fForms.stretchForm)fForms.stretchForm
mouseActionB1(self, CtrlAltShift) (defined in fForms.stretchForm)fForms.stretchForm
reject(self) (defined in fForms.stretchForm)fForms.stretchForm
selectAction (defined in fForms.stretchForm)fForms.stretchForm
selectAction(self) (defined in fForms.stretchForm)fForms.stretchForm
+ + + + diff --git a/html/classfForms_1_1stretchForm.html b/html/classfForms_1_1stretchForm.html new file mode 100644 index 0000000..c076bb5 --- /dev/null +++ b/html/classfForms_1_1stretchForm.html @@ -0,0 +1,307 @@ + + + + + + + +Quetzal: fForms.stretchForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fForms.stretchForm Class Reference
+
+
+
+Inheritance diagram for fForms.stretchForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fForms.stretchForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
edit12L (self)
 
changeL (self)
 
 selectAction (self)
 
 accept (self)
 
 reject (self)
 
 mouseActionB1 (self, CtrlAltShift)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

L
 
edit12L
 
selectAction
 
changeL
 
labTail
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Detailed Description

+
dialog for stretchTheBeam()
+[Get Length] measures the min. distance of the selected objects or
+  the length of the selected edge or
+  the Height of the selected beam
+[ Stretch ] changes the Height of the selected beams
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fForms.stretchForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
fForms.stretchForm.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ mouseActionB1()

+ +
+
+ + + + + + + + + + + + + + + + + + +
fForms.stretchForm.mouseActionB1 ( self,
 CtrlAltShift 
)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ reject()

+ +
+
+ + + + + + + + +
fForms.stretchForm.reject ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
fForms.stretchForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fForms.py
  • +
+
+ + + + diff --git a/html/classfForms_1_1stretchForm__coll__graph.map b/html/classfForms_1_1stretchForm__coll__graph.map new file mode 100644 index 0000000..fb8c5ee --- /dev/null +++ b/html/classfForms_1_1stretchForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1stretchForm__coll__graph.md5 b/html/classfForms_1_1stretchForm__coll__graph.md5 new file mode 100644 index 0000000..3f46f61 --- /dev/null +++ b/html/classfForms_1_1stretchForm__coll__graph.md5 @@ -0,0 +1 @@ +20ff6d41c7e26c0966c9fc54c18c4980 \ No newline at end of file diff --git a/html/classfForms_1_1stretchForm__coll__graph.png b/html/classfForms_1_1stretchForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..868ff71c012d8f9a30cb626b15f695dd5d258c60 GIT binary patch literal 6340 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 VysR}e7yMfSLMo`p=iN8){};t~2i5=p literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1stretchForm__inherit__graph.map b/html/classfForms_1_1stretchForm__inherit__graph.map new file mode 100644 index 0000000..fb8c5ee --- /dev/null +++ b/html/classfForms_1_1stretchForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1stretchForm__inherit__graph.md5 b/html/classfForms_1_1stretchForm__inherit__graph.md5 new file mode 100644 index 0000000..3f46f61 --- /dev/null +++ b/html/classfForms_1_1stretchForm__inherit__graph.md5 @@ -0,0 +1 @@ +20ff6d41c7e26c0966c9fc54c18c4980 \ No newline at end of file diff --git a/html/classfForms_1_1stretchForm__inherit__graph.png b/html/classfForms_1_1stretchForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..868ff71c012d8f9a30cb626b15f695dd5d258c60 GIT binary patch literal 6340 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 VysR}e7yMfSLMo`p=iN8){};t~2i5=p literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1translateForm-members.html b/html/classfForms_1_1translateForm-members.html new file mode 100644 index 0000000..b496bf1 --- /dev/null +++ b/html/classfForms_1_1translateForm-members.html @@ -0,0 +1,99 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fForms.translateForm Member List
+
+
+ +

This is the complete list of members for fForms.translateForm, including all inherited members.

+ + + + + + + + + + +
__init__(self) (defined in fForms.translateForm)fForms.translateForm
accept(self) (defined in fForms.translateForm)fForms.translateForm
arrow (defined in fForms.translateForm)fForms.translateForm
deleteArrow(self) (defined in fForms.translateForm)fForms.translateForm
getDistance(self) (defined in fForms.translateForm)fForms.translateForm
getLength(self) (defined in fForms.translateForm)fForms.translateForm
reject(self) (defined in fForms.translateForm)fForms.translateForm
selectAction (defined in fForms.translateForm)fForms.translateForm
selectAction(self) (defined in fForms.translateForm)fForms.translateForm
+ + + + diff --git a/html/classfForms_1_1translateForm.html b/html/classfForms_1_1translateForm.html new file mode 100644 index 0000000..31b2d52 --- /dev/null +++ b/html/classfForms_1_1translateForm.html @@ -0,0 +1,266 @@ + + + + + + + +Quetzal: fForms.translateForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fForms.translateForm Class Reference
+
+
+
+Inheritance diagram for fForms.translateForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fForms.translateForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
getDistance (self)
 
getLength (self)
 
 selectAction (self)
 
 accept (self)
 
deleteArrow (self)
 
 reject (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

selectAction
 
arrow
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fForms.translateForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
fForms.translateForm.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ reject()

+ +
+
+ + + + + + + + +
fForms.translateForm.reject ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
fForms.translateForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fForms.py
  • +
+
+ + + + diff --git a/html/classfForms_1_1translateForm__coll__graph.map b/html/classfForms_1_1translateForm__coll__graph.map new file mode 100644 index 0000000..f7645cb --- /dev/null +++ b/html/classfForms_1_1translateForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1translateForm__coll__graph.md5 b/html/classfForms_1_1translateForm__coll__graph.md5 new file mode 100644 index 0000000..a13069d --- /dev/null +++ b/html/classfForms_1_1translateForm__coll__graph.md5 @@ -0,0 +1 @@ +01a117b8d6cb3a9491cb7c861c49dce8 \ No newline at end of file diff --git a/html/classfForms_1_1translateForm__coll__graph.png b/html/classfForms_1_1translateForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c1a442606dad38b2b8951e97f441cd9361cbba GIT binary patch literal 6307 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 literal 0 HcmV?d00001 diff --git a/html/classfForms_1_1translateForm__inherit__graph.map b/html/classfForms_1_1translateForm__inherit__graph.map new file mode 100644 index 0000000..f7645cb --- /dev/null +++ b/html/classfForms_1_1translateForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfForms_1_1translateForm__inherit__graph.md5 b/html/classfForms_1_1translateForm__inherit__graph.md5 new file mode 100644 index 0000000..a13069d --- /dev/null +++ b/html/classfForms_1_1translateForm__inherit__graph.md5 @@ -0,0 +1 @@ +01a117b8d6cb3a9491cb7c861c49dce8 \ No newline at end of file diff --git a/html/classfForms_1_1translateForm__inherit__graph.png b/html/classfForms_1_1translateForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c1a442606dad38b2b8951e97f441cd9361cbba GIT binary patch literal 6307 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 literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1adjustAngleObserver-members.html b/html/classfObservers_1_1adjustAngleObserver-members.html new file mode 100644 index 0000000..ab5c38f --- /dev/null +++ b/html/classfObservers_1_1adjustAngleObserver-members.html @@ -0,0 +1,94 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.adjustAngleObserver Member List
+
+
+ +

This is the complete list of members for fObservers.adjustAngleObserver, including all inherited members.

+ + + + + +
__init__(self) (defined in fObservers.adjustAngleObserver)fObservers.adjustAngleObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.adjustAngleObserver)fObservers.adjustAngleObserver
beams (defined in fObservers.adjustAngleObserver)fObservers.adjustAngleObserver
edges (defined in fObservers.adjustAngleObserver)fObservers.adjustAngleObserver
+ + + + diff --git a/html/classfObservers_1_1adjustAngleObserver.html b/html/classfObservers_1_1adjustAngleObserver.html new file mode 100644 index 0000000..0774581 --- /dev/null +++ b/html/classfObservers_1_1adjustAngleObserver.html @@ -0,0 +1,171 @@ + + + + + + + +Quetzal: fObservers.adjustAngleObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.adjustAngleObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.adjustAngleObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.adjustAngleObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + + + +

+Public Attributes

edges
 
beams
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.adjustAngleObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1adjustAngleObserver__coll__graph.map b/html/classfObservers_1_1adjustAngleObserver__coll__graph.map new file mode 100644 index 0000000..455ef5c --- /dev/null +++ b/html/classfObservers_1_1adjustAngleObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1adjustAngleObserver__coll__graph.md5 b/html/classfObservers_1_1adjustAngleObserver__coll__graph.md5 new file mode 100644 index 0000000..aa88232 --- /dev/null +++ b/html/classfObservers_1_1adjustAngleObserver__coll__graph.md5 @@ -0,0 +1 @@ +e8cc01a84976d8eb4431dfc977fc627f \ No newline at end of file diff --git a/html/classfObservers_1_1adjustAngleObserver__coll__graph.png b/html/classfObservers_1_1adjustAngleObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae18dfb452dcadf928970fb5a251f2626139095 GIT binary patch literal 8238 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 literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1adjustAngleObserver__inherit__graph.map b/html/classfObservers_1_1adjustAngleObserver__inherit__graph.map new file mode 100644 index 0000000..455ef5c --- /dev/null +++ b/html/classfObservers_1_1adjustAngleObserver__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1adjustAngleObserver__inherit__graph.md5 b/html/classfObservers_1_1adjustAngleObserver__inherit__graph.md5 new file mode 100644 index 0000000..aa88232 --- /dev/null +++ b/html/classfObservers_1_1adjustAngleObserver__inherit__graph.md5 @@ -0,0 +1 @@ +e8cc01a84976d8eb4431dfc977fc627f \ No newline at end of file diff --git a/html/classfObservers_1_1adjustAngleObserver__inherit__graph.png b/html/classfObservers_1_1adjustAngleObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae18dfb452dcadf928970fb5a251f2626139095 GIT binary patch literal 8238 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 literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1alignEdgeObserver-members.html b/html/classfObservers_1_1alignEdgeObserver-members.html new file mode 100644 index 0000000..55da875 --- /dev/null +++ b/html/classfObservers_1_1alignEdgeObserver-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + + +
+
fObservers.alignEdgeObserver Member List
+
+
+ +

This is the complete list of members for fObservers.alignEdgeObserver, including all inherited members.

+ + + + +
__init__(self) (defined in fObservers.alignEdgeObserver)fObservers.alignEdgeObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.alignEdgeObserver)fObservers.alignEdgeObserver
edges (defined in fObservers.alignEdgeObserver)fObservers.alignEdgeObserver
+ + + + diff --git a/html/classfObservers_1_1alignEdgeObserver.html b/html/classfObservers_1_1alignEdgeObserver.html new file mode 100644 index 0000000..13be1d8 --- /dev/null +++ b/html/classfObservers_1_1alignEdgeObserver.html @@ -0,0 +1,168 @@ + + + + + + + +Quetzal: fObservers.alignEdgeObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.alignEdgeObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.alignEdgeObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.alignEdgeObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + +

+Public Attributes

edges
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.alignEdgeObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1alignEdgeObserver__coll__graph.map b/html/classfObservers_1_1alignEdgeObserver__coll__graph.map new file mode 100644 index 0000000..b18c34a --- /dev/null +++ b/html/classfObservers_1_1alignEdgeObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1alignEdgeObserver__coll__graph.md5 b/html/classfObservers_1_1alignEdgeObserver__coll__graph.md5 new file mode 100644 index 0000000..a5b3ed2 --- /dev/null +++ b/html/classfObservers_1_1alignEdgeObserver__coll__graph.md5 @@ -0,0 +1 @@ +ae7b8b0474773cf8303fdfce211bbf3c \ No newline at end of file diff --git a/html/classfObservers_1_1alignEdgeObserver__coll__graph.png b/html/classfObservers_1_1alignEdgeObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe20349b4520fe2935e95fbaef281d1756fcb5c GIT binary patch literal 7890 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 IMT_wN0o5QVO8@`> literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1alignEdgeObserver__inherit__graph.map b/html/classfObservers_1_1alignEdgeObserver__inherit__graph.map new file mode 100644 index 0000000..b18c34a --- /dev/null +++ b/html/classfObservers_1_1alignEdgeObserver__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1alignEdgeObserver__inherit__graph.md5 b/html/classfObservers_1_1alignEdgeObserver__inherit__graph.md5 new file mode 100644 index 0000000..a5b3ed2 --- /dev/null +++ b/html/classfObservers_1_1alignEdgeObserver__inherit__graph.md5 @@ -0,0 +1 @@ +ae7b8b0474773cf8303fdfce211bbf3c \ No newline at end of file diff --git a/html/classfObservers_1_1alignEdgeObserver__inherit__graph.png b/html/classfObservers_1_1alignEdgeObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe20349b4520fe2935e95fbaef281d1756fcb5c GIT binary patch literal 7890 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 IMT_wN0o5QVO8@`> literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1alignFlangeObserver-members.html b/html/classfObservers_1_1alignFlangeObserver-members.html new file mode 100644 index 0000000..2b11704 --- /dev/null +++ b/html/classfObservers_1_1alignFlangeObserver-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.alignFlangeObserver Member List
+
+
+ +

This is the complete list of members for fObservers.alignFlangeObserver, including all inherited members.

+ + + + +
__init__(self) (defined in fObservers.alignFlangeObserver)fObservers.alignFlangeObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.alignFlangeObserver)fObservers.alignFlangeObserver
faceBase (defined in fObservers.alignFlangeObserver)fObservers.alignFlangeObserver
+ + + + diff --git a/html/classfObservers_1_1alignFlangeObserver.html b/html/classfObservers_1_1alignFlangeObserver.html new file mode 100644 index 0000000..3b8c455 --- /dev/null +++ b/html/classfObservers_1_1alignFlangeObserver.html @@ -0,0 +1,168 @@ + + + + + + + +Quetzal: fObservers.alignFlangeObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.alignFlangeObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.alignFlangeObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.alignFlangeObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + +

+Public Attributes

faceBase
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.alignFlangeObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1alignFlangeObserver__coll__graph.map b/html/classfObservers_1_1alignFlangeObserver__coll__graph.map new file mode 100644 index 0000000..01212d4 --- /dev/null +++ b/html/classfObservers_1_1alignFlangeObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1alignFlangeObserver__coll__graph.md5 b/html/classfObservers_1_1alignFlangeObserver__coll__graph.md5 new file mode 100644 index 0000000..79bcfa1 --- /dev/null +++ b/html/classfObservers_1_1alignFlangeObserver__coll__graph.md5 @@ -0,0 +1 @@ +3d1c68bc1ac72fbfa2b933732c2d3e70 \ No newline at end of file diff --git a/html/classfObservers_1_1alignFlangeObserver__coll__graph.png b/html/classfObservers_1_1alignFlangeObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcbdf8a6117a76b7fbe8660005de015d38b80ef GIT binary patch literal 7805 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 + + + + + + diff --git a/html/classfObservers_1_1alignFlangeObserver__inherit__graph.md5 b/html/classfObservers_1_1alignFlangeObserver__inherit__graph.md5 new file mode 100644 index 0000000..79bcfa1 --- /dev/null +++ b/html/classfObservers_1_1alignFlangeObserver__inherit__graph.md5 @@ -0,0 +1 @@ +3d1c68bc1ac72fbfa2b933732c2d3e70 \ No newline at end of file diff --git a/html/classfObservers_1_1alignFlangeObserver__inherit__graph.png b/html/classfObservers_1_1alignFlangeObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcbdf8a6117a76b7fbe8660005de015d38b80ef GIT binary patch literal 7805 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.extendObserver Member List
+
+
+ +

This is the complete list of members for fObservers.extendObserver, including all inherited members.

+ + + + +
__init__(self) (defined in fObservers.extendObserver)fObservers.extendObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.extendObserver)fObservers.extendObserver
target (defined in fObservers.extendObserver)fObservers.extendObserver
+ + + + diff --git a/html/classfObservers_1_1extendObserver.html b/html/classfObservers_1_1extendObserver.html new file mode 100644 index 0000000..ce57224 --- /dev/null +++ b/html/classfObservers_1_1extendObserver.html @@ -0,0 +1,168 @@ + + + + + + + +Quetzal: fObservers.extendObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.extendObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.extendObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.extendObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + +

+Public Attributes

target
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.extendObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1extendObserver__coll__graph.map b/html/classfObservers_1_1extendObserver__coll__graph.map new file mode 100644 index 0000000..01bb3e6 --- /dev/null +++ b/html/classfObservers_1_1extendObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1extendObserver__coll__graph.md5 b/html/classfObservers_1_1extendObserver__coll__graph.md5 new file mode 100644 index 0000000..2abeb44 --- /dev/null +++ b/html/classfObservers_1_1extendObserver__coll__graph.md5 @@ -0,0 +1 @@ +ae32df91497486b9f7b875b6dce1309b \ No newline at end of file diff --git a/html/classfObservers_1_1extendObserver__coll__graph.png b/html/classfObservers_1_1extendObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4761305c4be9ad0aa1ec97988c62a017a2dc061a GIT binary patch literal 7569 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 C19?;c literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1extendObserver__inherit__graph.map b/html/classfObservers_1_1extendObserver__inherit__graph.map new file mode 100644 index 0000000..01bb3e6 --- /dev/null +++ b/html/classfObservers_1_1extendObserver__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1extendObserver__inherit__graph.md5 b/html/classfObservers_1_1extendObserver__inherit__graph.md5 new file mode 100644 index 0000000..2abeb44 --- /dev/null +++ b/html/classfObservers_1_1extendObserver__inherit__graph.md5 @@ -0,0 +1 @@ +ae32df91497486b9f7b875b6dce1309b \ No newline at end of file diff --git a/html/classfObservers_1_1extendObserver__inherit__graph.png b/html/classfObservers_1_1extendObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4761305c4be9ad0aa1ec97988c62a017a2dc061a GIT binary patch literal 7569 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 C19?;c literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1fillFrameObserver-members.html b/html/classfObservers_1_1fillFrameObserver-members.html new file mode 100644 index 0000000..9a86451 --- /dev/null +++ b/html/classfObservers_1_1fillFrameObserver-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.fillFrameObserver Member List
+
+
+ +

This is the complete list of members for fObservers.fillFrameObserver, including all inherited members.

+ + + + +
__init__(self) (defined in fObservers.fillFrameObserver)fObservers.fillFrameObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.fillFrameObserver)fObservers.fillFrameObserver
beam (defined in fObservers.fillFrameObserver)fObservers.fillFrameObserver
+ + + + diff --git a/html/classfObservers_1_1fillFrameObserver.html b/html/classfObservers_1_1fillFrameObserver.html new file mode 100644 index 0000000..97ce1f4 --- /dev/null +++ b/html/classfObservers_1_1fillFrameObserver.html @@ -0,0 +1,168 @@ + + + + + + + +Quetzal: fObservers.fillFrameObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.fillFrameObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.fillFrameObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.fillFrameObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + +

+Public Attributes

beam
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.fillFrameObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1fillFrameObserver__coll__graph.map b/html/classfObservers_1_1fillFrameObserver__coll__graph.map new file mode 100644 index 0000000..ac98c21 --- /dev/null +++ b/html/classfObservers_1_1fillFrameObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1fillFrameObserver__coll__graph.md5 b/html/classfObservers_1_1fillFrameObserver__coll__graph.md5 new file mode 100644 index 0000000..8894f64 --- /dev/null +++ b/html/classfObservers_1_1fillFrameObserver__coll__graph.md5 @@ -0,0 +1 @@ +3c7dc562969ee533a4798ee2cf26d383 \ No newline at end of file diff --git a/html/classfObservers_1_1fillFrameObserver__coll__graph.png b/html/classfObservers_1_1fillFrameObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..423213ec4b046d02c5c4c4ddc4c54a2d2ec72d9b GIT binary patch literal 7550 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 Q4pb4vyQ=c#vPJ>_1+lXi@&Et; literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1fillFrameObserver__inherit__graph.map b/html/classfObservers_1_1fillFrameObserver__inherit__graph.map new file mode 100644 index 0000000..ac98c21 --- /dev/null +++ b/html/classfObservers_1_1fillFrameObserver__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1fillFrameObserver__inherit__graph.md5 b/html/classfObservers_1_1fillFrameObserver__inherit__graph.md5 new file mode 100644 index 0000000..8894f64 --- /dev/null +++ b/html/classfObservers_1_1fillFrameObserver__inherit__graph.md5 @@ -0,0 +1 @@ +3c7dc562969ee533a4798ee2cf26d383 \ No newline at end of file diff --git a/html/classfObservers_1_1fillFrameObserver__inherit__graph.png b/html/classfObservers_1_1fillFrameObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..423213ec4b046d02c5c4c4ddc4c54a2d2ec72d9b GIT binary patch literal 7550 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 Q4pb4vyQ=c#vPJ>_1+lXi@&Et; literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1frameItObserver-members.html b/html/classfObservers_1_1frameItObserver-members.html new file mode 100644 index 0000000..961db82 --- /dev/null +++ b/html/classfObservers_1_1frameItObserver-members.html @@ -0,0 +1,94 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.frameItObserver Member List
+
+
+ +

This is the complete list of members for fObservers.frameItObserver, including all inherited members.

+ + + + + +
__init__(self) (defined in fObservers.frameItObserver)fObservers.frameItObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.frameItObserver)fObservers.frameItObserver
beam (defined in fObservers.frameItObserver)fObservers.frameItObserver
edge (defined in fObservers.frameItObserver)fObservers.frameItObserver
+ + + + diff --git a/html/classfObservers_1_1frameItObserver.html b/html/classfObservers_1_1frameItObserver.html new file mode 100644 index 0000000..03672d6 --- /dev/null +++ b/html/classfObservers_1_1frameItObserver.html @@ -0,0 +1,171 @@ + + + + + + + +Quetzal: fObservers.frameItObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.frameItObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.frameItObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.frameItObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + + + +

+Public Attributes

beam
 
edge
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.frameItObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1frameItObserver__coll__graph.map b/html/classfObservers_1_1frameItObserver__coll__graph.map new file mode 100644 index 0000000..ebee8cb --- /dev/null +++ b/html/classfObservers_1_1frameItObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1frameItObserver__coll__graph.md5 b/html/classfObservers_1_1frameItObserver__coll__graph.md5 new file mode 100644 index 0000000..50eec11 --- /dev/null +++ b/html/classfObservers_1_1frameItObserver__coll__graph.md5 @@ -0,0 +1 @@ +815914cfbf1d33d6a8fbc45e1616781a \ No newline at end of file diff --git a/html/classfObservers_1_1frameItObserver__coll__graph.png b/html/classfObservers_1_1frameItObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6f03dc6b4b69990f14461c2beb85ef4ef8f9c715 GIT binary patch literal 7536 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 + + + + + + diff --git a/html/classfObservers_1_1frameItObserver__inherit__graph.md5 b/html/classfObservers_1_1frameItObserver__inherit__graph.md5 new file mode 100644 index 0000000..50eec11 --- /dev/null +++ b/html/classfObservers_1_1frameItObserver__inherit__graph.md5 @@ -0,0 +1 @@ +815914cfbf1d33d6a8fbc45e1616781a \ No newline at end of file diff --git a/html/classfObservers_1_1frameItObserver__inherit__graph.png b/html/classfObservers_1_1frameItObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6f03dc6b4b69990f14461c2beb85ef4ef8f9c715 GIT binary patch literal 7536 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.frameObserverPrototype Member List
+
+ + + + + diff --git a/html/classfObservers_1_1frameObserverPrototype.html b/html/classfObservers_1_1frameObserverPrototype.html new file mode 100644 index 0000000..19a17e2 --- /dev/null +++ b/html/classfObservers_1_1frameObserverPrototype.html @@ -0,0 +1,156 @@ + + + + + + + +Quetzal: fObservers.frameObserverPrototype Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.frameObserverPrototype Class Reference
+
+
+
+Inheritance diagram for fObservers.frameObserverPrototype:
+
+
Inheritance graph
+ + + + + + + + + + + + + + + + + + + + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.frameObserverPrototype:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + +

+Public Member Functions

__init__ (self, msg)
 
goOut (self, info)
 
+ + + + + + + +

+Public Attributes

beam
 
av
 
stop
 
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1frameObserverPrototype__coll__graph.map b/html/classfObservers_1_1frameObserverPrototype__coll__graph.map new file mode 100644 index 0000000..353b0c6 --- /dev/null +++ b/html/classfObservers_1_1frameObserverPrototype__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classfObservers_1_1frameObserverPrototype__coll__graph.md5 b/html/classfObservers_1_1frameObserverPrototype__coll__graph.md5 new file mode 100644 index 0000000..c57c78f --- /dev/null +++ b/html/classfObservers_1_1frameObserverPrototype__coll__graph.md5 @@ -0,0 +1 @@ +1b2183095a616b3b0e57a66d1c5c3a09 \ No newline at end of file diff --git a/html/classfObservers_1_1frameObserverPrototype__coll__graph.png b/html/classfObservers_1_1frameObserverPrototype__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6882bcc9f36f021f02535c95ce5d3c440e09d2f2 GIT binary patch literal 5000 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 ALjV8( literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1frameObserverPrototype__inherit__graph.map b/html/classfObservers_1_1frameObserverPrototype__inherit__graph.map new file mode 100644 index 0000000..7b98c65 --- /dev/null +++ b/html/classfObservers_1_1frameObserverPrototype__inherit__graph.map @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/classfObservers_1_1frameObserverPrototype__inherit__graph.md5 b/html/classfObservers_1_1frameObserverPrototype__inherit__graph.md5 new file mode 100644 index 0000000..abb84bc --- /dev/null +++ b/html/classfObservers_1_1frameObserverPrototype__inherit__graph.md5 @@ -0,0 +1 @@ +08743e1f0b06b7801934b8615ce7a513 \ No newline at end of file diff --git a/html/classfObservers_1_1frameObserverPrototype__inherit__graph.png b/html/classfObservers_1_1frameObserverPrototype__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..81c5e96244a146d35a707076892bbd388ce048a0 GIT binary patch literal 47577 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

lAi<%3FN=tkQRHld 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 lejaz1y#D|E$K=qjAWgBmoRekYm2CK + + + + + + +Quetzal: Member List + + + + + + + + + +

+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.levelBeamObserver Member List
+
+
+ +

This is the complete list of members for fObservers.levelBeamObserver, including all inherited members.

+ + + + +
__init__(self) (defined in fObservers.levelBeamObserver)fObservers.levelBeamObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.levelBeamObserver)fObservers.levelBeamObserver
targetFace (defined in fObservers.levelBeamObserver)fObservers.levelBeamObserver
+ + + + diff --git a/html/classfObservers_1_1levelBeamObserver.html b/html/classfObservers_1_1levelBeamObserver.html new file mode 100644 index 0000000..647dc6a --- /dev/null +++ b/html/classfObservers_1_1levelBeamObserver.html @@ -0,0 +1,168 @@ + + + + + + + +Quetzal: fObservers.levelBeamObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.levelBeamObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.levelBeamObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.levelBeamObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + +

+Public Attributes

targetFace
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.levelBeamObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1levelBeamObserver__coll__graph.map b/html/classfObservers_1_1levelBeamObserver__coll__graph.map new file mode 100644 index 0000000..dcf0129 --- /dev/null +++ b/html/classfObservers_1_1levelBeamObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1levelBeamObserver__coll__graph.md5 b/html/classfObservers_1_1levelBeamObserver__coll__graph.md5 new file mode 100644 index 0000000..c589950 --- /dev/null +++ b/html/classfObservers_1_1levelBeamObserver__coll__graph.md5 @@ -0,0 +1 @@ +3cd358f4092dbd6905cbbd662bb07754 \ No newline at end of file diff --git a/html/classfObservers_1_1levelBeamObserver__coll__graph.png b/html/classfObservers_1_1levelBeamObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c77e6acea365415c5322558a5e7256e53ccf1c33 GIT binary patch literal 7741 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 N)-^r#a#gD*{{tt2%O?N; literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1levelBeamObserver__inherit__graph.map b/html/classfObservers_1_1levelBeamObserver__inherit__graph.map new file mode 100644 index 0000000..dcf0129 --- /dev/null +++ b/html/classfObservers_1_1levelBeamObserver__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1levelBeamObserver__inherit__graph.md5 b/html/classfObservers_1_1levelBeamObserver__inherit__graph.md5 new file mode 100644 index 0000000..c589950 --- /dev/null +++ b/html/classfObservers_1_1levelBeamObserver__inherit__graph.md5 @@ -0,0 +1 @@ +3cd358f4092dbd6905cbbd662bb07754 \ No newline at end of file diff --git a/html/classfObservers_1_1levelBeamObserver__inherit__graph.png b/html/classfObservers_1_1levelBeamObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..c77e6acea365415c5322558a5e7256e53ccf1c33 GIT binary patch literal 7741 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 N)-^r#a#gD*{{tt2%O?N; literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1rotjoinObserver-members.html b/html/classfObservers_1_1rotjoinObserver-members.html new file mode 100644 index 0000000..ab4c01a --- /dev/null +++ b/html/classfObservers_1_1rotjoinObserver-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.rotjoinObserver Member List
+
+
+ +

This is the complete list of members for fObservers.rotjoinObserver, including all inherited members.

+ + + + +
__init__(self) (defined in fObservers.rotjoinObserver)fObservers.rotjoinObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.rotjoinObserver)fObservers.rotjoinObserver
edges (defined in fObservers.rotjoinObserver)fObservers.rotjoinObserver
+ + + + diff --git a/html/classfObservers_1_1rotjoinObserver.html b/html/classfObservers_1_1rotjoinObserver.html new file mode 100644 index 0000000..1ced0c7 --- /dev/null +++ b/html/classfObservers_1_1rotjoinObserver.html @@ -0,0 +1,168 @@ + + + + + + + +Quetzal: fObservers.rotjoinObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.rotjoinObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.rotjoinObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.rotjoinObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + +

+Public Attributes

edges
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.rotjoinObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1rotjoinObserver__coll__graph.map b/html/classfObservers_1_1rotjoinObserver__coll__graph.map new file mode 100644 index 0000000..7c06400 --- /dev/null +++ b/html/classfObservers_1_1rotjoinObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1rotjoinObserver__coll__graph.md5 b/html/classfObservers_1_1rotjoinObserver__coll__graph.md5 new file mode 100644 index 0000000..8598e86 --- /dev/null +++ b/html/classfObservers_1_1rotjoinObserver__coll__graph.md5 @@ -0,0 +1 @@ +3603c00166abdca48a32fbd05bc3cd13 \ No newline at end of file diff --git a/html/classfObservers_1_1rotjoinObserver__coll__graph.png b/html/classfObservers_1_1rotjoinObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab111207258c0eb976c3a56671d6ad5b3eb6d01 GIT binary patch literal 7602 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 E2aDj4(f|Me literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1rotjoinObserver__inherit__graph.map b/html/classfObservers_1_1rotjoinObserver__inherit__graph.map new file mode 100644 index 0000000..7c06400 --- /dev/null +++ b/html/classfObservers_1_1rotjoinObserver__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1rotjoinObserver__inherit__graph.md5 b/html/classfObservers_1_1rotjoinObserver__inherit__graph.md5 new file mode 100644 index 0000000..8598e86 --- /dev/null +++ b/html/classfObservers_1_1rotjoinObserver__inherit__graph.md5 @@ -0,0 +1 @@ +3603c00166abdca48a32fbd05bc3cd13 \ No newline at end of file diff --git a/html/classfObservers_1_1rotjoinObserver__inherit__graph.png b/html/classfObservers_1_1rotjoinObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab111207258c0eb976c3a56671d6ad5b3eb6d01 GIT binary patch literal 7602 zcmc(khdS4k(H56 z=DF_g@0|1ao%08rQ;&?hd%Qo_`+C2w*YouWSHGh~eunW3f*|C#ZeldxdoTQJAvpzK zzxmKTgm0%FDl1`-6WrgowK;JJ!fbg9Bd6(+yfXGgoyKyXc+HXWQWH4=56PKl&v@if z>$1&Zr^8>}Aa$Xqt5MH5t5I)vq5S7pBQlfEAF61+zE zwX94mcfh80MMOkoZz_~Eq=cP|D72mAhLV!${?;OaC^m%rT+GXtVr-_RMb2T7JzI``PYm-lhumh{3y_rg-p4&D-p`oS+J1bTW4p{5w&z?2*Whp!Ft(hPVtjBA_zvkv1 zZq9X)P*5nUsC2T`=(e6`B!o2%eRkt-Y-&Q&(uNETY1eFizplH4`zkCVBIoKVcIM0( z6b(&Kb~YE%Fx!!MS4)el=-^=Dgr)v?yBN*H6j^RNI33FB+wklxfAfy&n=4aM;^PgS zNtbX7V!HmAtSy?ksY9rqjE;^D*2i(>3T`lW?7RzLlO3W zTW5j;`uh7@w)6AzZ{=xf$jRZ|*VK&B7tHx+*=;j$S5HqFgE>AvcAac^YB)G?_wnN^ z7r43o>=&*HKlc9FjdXN$1gdZ~!Gc@NUFJIFl$A*x#y%7I`S~FY1v(#_A7^QVTlZ&A zwMLzjm>H{dCg|$w@;F%eRGvT@;6FO5udSyS7$)q#s$ck+lr-Y0w@$%1rVPAnjl7<| zzJS-S8Ha|35aj*)_stcL2L=XokKX6!mk*Ep93GZO5!M{6RtsOc)Nix7v!nRr$u(U) zz4f&zg`ts=r7b$bI(5I2b&+0Vb89Q8y83#B{Ro%f$Om&$F11uLcXxN^pU@J`Y+3K# zO~O8VtX9o`X6o+fAkE9mdnMy19S|6ZhJDL_P~3>c(#CPA1|%lZU9ley!eX_MhV7-n z*w?SmycGzFkB<-h`yy0|q8GWxLv!=y&4w?5#8Zol;o;QW(+7X*mE`5|%|4viuYQf= zZi2UmQj(lL{Ut#_PuT6ZX3DyXippA-_{1bUH8ek;-=gbv@ZC(s^xRw$E-o(Up)ZL> zzTqzO-@gnDob~nf)voitrWnn18VL&vleM$E7!VM!w>-)=HC82uqNfi#JoNrGJ1d7G zRCz6S`qAH$D{lJwO!@`}Cf3&BQ0&Na;uP@b;dS(v=4OnyqJo~bm>T%nCg~XQ5)d|&u3XrEJ$OU*9a46< zo6aQbp(3io@PP|^nIaagdqDXi#9tUiv(iB*+dC9?A*3L}ElR;Gi11PkkE?{sZTpGp zA~8)>6&ZLkd*f~Lp1=HB)KAw&-{1SyW6o_M3?D}wf0KiVO&d{hWh9dQ`7Du4op$LI zl%w6O=cGkYj?H)gmC)q*RKd(FtmMpo9U&bX2b-`&Y%7`l{etW8`VYsPRj2VS-oAN) z_NR5-wQdPv3T+Q7tC&t)Sk!<9a$k%j4Q;O^Bnj$^K9Tjfh+4H3Ah7dDj4n0QO~jO4 z2~S}7Op(p%M}^yk|Ca5CD(n(`ux6bKP<+{$w_8*O;Pn* zg(z*4{r9cK^=5e^rfZJ~1qB6f-noOdwzadv+_^*X`pp}VfYb4}FUP1IH7`2oF_5Ny z9B1fJ%LoX-S4qBl*YYn2z~sV07@Tef&~vB9k6S^f)gL?%k5N0p^nNOgB$zRFfRp+?`C1@oPOXbLu$G*+Z`mHXy1uha^GUF= zu_^maLQa0+!Gi}IySv=M@^aPgf3izTgg4gL(@Ra;`hMiyTLjxs3m0wu{Z5+n*zBQe zLQ0D2*RNlVC_O=)$314qhf7QX_pS;EL?Jx``46h~C%%1q_IPFZLY=Idn%et<0#5b} zzmtOr&cqJh>(}2D=~u}oBqVIX2xGT-vk(+S$j)wKZ=aQu>iKNk>yK2Ql^6!&y0vik z(W6Hh!^67H%ZvRv5svS0v)#$*t>4j-(L(`H&m7PO-{(IKqH2F?8AScmQBWWV4hrg- z>v~hZFL|`puleAC5(YE!$&nkGK37pymE`U1ZPlGBRqJUF*W#I z*T`#jLyT93%S%3fBtQs>h)m`>ldeA5;KYp;3yY9IV#;ag8{x~B&${zFjMs#BcB&8( z5>A52xau-Trpb5q_tH{qeEfyzT5vQl?g@~Ww=b}Ba5zsk;32X;K2p(4*Vt1pEOoyc z8yKQvZnJx!qZ1A$P`}a%Z+v{b(rGF{%gfA+v$LxU55dF3i|LrvF1I<0$Otyu23t&ariMUE$#G)s)~xS zjm?=V{i5=M+SOFU5vSK5<-}3dE*Q+yr%$&IH@olI+U8?7qRxrGxSd6{Yw6?T!z&@7 zYv*WZ#|ei=!h26x%J)$FFpP`+TW2Sy94a>>BY=;Ouf4fB2pXZRwKy*ieXs|uKcD7T zbnj1@b-&f_>KF|bm3(Pw>GZ~NBy<7>BknNzHZn5O;nV$j5y$bGTcSykFs$>-$KYTU ze(DY;rEBl&)36ll4TGkHqua3U;rNV1CJ~}8h{(>JA6vW2IcLv%N z=grqz=!_=YV>wF7%g+uT{mw5Iw&oQU-?m{`SXd;em%*Mvmr5Qif82vbm$?5i92y>mmLyP4xQHHnBVu}r zf<-cHZq8zPteVcWExHBdD_xUM#P8U9d8m|tPROvi$e`L7x`l(0We`&-t|O8^OZC@oXC^H7y_Bm#|Q~>G>78k-ug^?S62(}l9isbn82BQCGGQhT>8qDE3d>IQ@=C09^QGMGk8UR&hG7& z$2~(Qr!{{WUQ@Lfpx!SN6PIdvp9{&F|L@71Vd#1McOJ(YM5MHn@ed5Yq@5hj3koeS z7w+$S5)u>Rs3~wbl)O&vBz0kadbG-AsM47Otfjh!M!>}J&ZnEIsw=yy)`f+ISG{%$ zzQ?x`jD?a*Q`}|s@bbz$dReb8*!C@+A5BLWnvg&n6dY`_ge}BbVQA{L*+e7xbai9E zm`d-zqKc99PcPeICl_}f#5lLVO-hR z+J0?o3r+PqezLz>{l}^!LBPz!L=Gw?6CSnza!=?_!78l+`u;L4O~}xBEKxd?k~Q0T zrq$XYb zPLf-rnU$e^7S-)_GsWM1l0Qs#qv!>;ZEtA_4m;jeTp2nBd5Q}R4D?`-zB^KGdC8)a zEu+GA1yMIKNq;8|Blp*@UzqUlZ~!?C4SC>&m+|pg_x0LrTZfBH`2_^B{?wnOg3D>q z;|&X=qNe`Z)m1n#@_W8@a`5|6GAJeby8CK#%5`^jkV%D53hQ#UH&;{-PjK7zjT*8w}TyURFi} z^omOWoScNceSBiyyvg5Ic)Hkjo{=+-TdkEl%{ze3$Quou=H%`kT2*yTdVhffu}|Zx zKb#d>ZzL5mK0f?ARPF9qzh4#+9{vTq848WY12dN5DaJ_N`keJS$k{_swyPd%Y%nHA z$Hrn~V*KI67=L@oySBL*`00~)XJ==Kg~CztdN`52Wp`@U#>R%=2v|;B7c(+4x(>rJ zQn9wS*3{JeVLk!aC*ieoadv)Q`S(3dO$@>#C1qecwnI(&$#H_KTvv5*aZ#5WEm0S8 zPTT=!QviVTI_8;+_L>_J>yx5v{zp|z`wk4HA3g-s*Vm8N0Sot473a$M9Pba-v$L_u zE*WNihc4Sbj;E~BrvPVD>yzZml)*g;(FU$#_#YIp@$!D{nI%((N0Wi0H8eD~D)Ke? zP`xNEvBR}+qW^-tf7n4Wn$j|o6$mGVZ;Fkfnx*@D$~6}Yl5fTa=kcR2cgx*BzI^o? z3*%>|?9g%4>3|q{OfiMIh>BiztB(zHQeE2cwDShtGi7I~UE{zTKzi80?A=6h(I&lJ zpO^o1ua|n=-Whrj8!ROEaqj z`#t>Ew`3J$MzPcoQ!u@a;CS8zEjHzDaPp&BJ|&tYT!f@$eW6g9)qHjC((GGB(yHwtEHw zz+o@M*0Qk?8hD2)`O5}no#Kgb!#zx*t@v*K;CcXCoXIRIvDvfXyr`(C@r5m)(}J?u zc&UbNk&2Z6342s-$@-V^=K%I%t$W_9PtKmd7_sfIV1_Yk$PcJ9s5#1Po=qQs*B(n1^@BMF2NB`&H|HiS5F(?3qsiWNq zoaTgq!`;dIL(J;!A3-NXfnjL6ee2d~7HRLRR!h6I-4jSKkAMJqMMVW}XlfN377kz` zx_a?~iiVapqo~M%E!AO&7eFji>3LZK*l#tE!^LfSAA@@4Zlmrk@T?KUlq?Osy+DN! zmBhY!MZ(X|&l7(eCb}uOCS2t6^7gE(|0t|fB^!Nk{G^y z`v&nGzKe?s$gfqD^X8mtB#RUy7+xQi{_$}ZEEWrZ6rE3oLU9iPYd-vWmHzugJmN^^y|DC zCVUSB?Ck8E{)|gqH26#dv+E-0EG`!YLbxg+k&%&sKQ%S=>bkq2e}%X<5GufmiHXTm zfd2x$PZamERqzm;+u%@&#sDZVF)`sRu9=zHWae{estIEvBBG&kTRI3AvBe@yjg3w_ z%R04}A7iUdzzKq7EOnfaZl8UGLL@=s ze}^;FYOya1sNP>OQw})EzoJZBOe`$eUCgAB5O$JXM#d;P=)(um=GIp5Pxzl4#u}l9 z!sg#-%An@M<+iv88-@xlaoyT-MeJqlr>CcJ4#4E=iwh`1JO~Yj>iuMn_u6EhRi8V1 z_H0;G)Y${0&#tEji;ddA8sQ)9>}S^(e0y$oSb$-8^8j#M$XM` zyX1BKQ(-o4S_u~?C#2^}Rf-U+4a7o_$AkGjFSsPB1MAMs&kqDZ!Uf78D$@}{bq(Lo|?Is`~CQc^v`;D&VTsysV(Rfsl9CcG2Ls_P zDJu(l^F}YNZ6SY3)Q{lHyG?vQzmvQGwwk`bVh`O{C+aD|@I|u980uR<{C&-3?rlW{ z?O>6C0tgH&y~JjKPvw=coPIGV8KmyH@88SAU6=nPr-so{CW!EzoSo$?EVyvZ4mw$& zU5c-zrG+41z9N~fQNgiPa&QoY$^lrNUp1tmqcc6+TL+bVr&Svr9o_!*>lZk-ZqY{n zVCee+8_*^sBx9ZVWQx5Vd<^ zqP|mSE&rmcB(bu2%B{^a53@Apb>386J=ISR@v zD8N9E0j8Hzq$W+RaraVNY%TP9%tVQk8Jt@3m-+V*j(4k_pmn<}bJxP?ia zfAQ7q(`Cjk@qOPmTGOT^6|QRI1;&4FanhT1zB-gqDZGC=YiPO|Zo(qBZrs5X$r}g! E2aDj4(f|Me literal 0 HcmV?d00001 diff --git a/html/classfObservers_1_1stretchBeamObserver-members.html b/html/classfObservers_1_1stretchBeamObserver-members.html new file mode 100644 index 0000000..74ab03c --- /dev/null +++ b/html/classfObservers_1_1stretchBeamObserver-members.html @@ -0,0 +1,94 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fObservers.stretchBeamObserver Member List
+
+
+ +

This is the complete list of members for fObservers.stretchBeamObserver, including all inherited members.

+ + + + + +
__init__(self) (defined in fObservers.stretchBeamObserver)fObservers.stretchBeamObserver
addSelection(self, doc, obj, sub, pnt) (defined in fObservers.stretchBeamObserver)fObservers.stretchBeamObserver
beam (defined in fObservers.stretchBeamObserver)fObservers.stretchBeamObserver
stop (defined in fObservers.stretchBeamObserver)fObservers.stretchBeamObserver
+ + + + diff --git a/html/classfObservers_1_1stretchBeamObserver.html b/html/classfObservers_1_1stretchBeamObserver.html new file mode 100644 index 0000000..1481b03 --- /dev/null +++ b/html/classfObservers_1_1stretchBeamObserver.html @@ -0,0 +1,171 @@ + + + + + + + +Quetzal: fObservers.stretchBeamObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
fObservers.stretchBeamObserver Class Reference
+
+
+
+Inheritance diagram for fObservers.stretchBeamObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for fObservers.stretchBeamObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
addSelection (self, doc, obj, sub, pnt)
 
- Public Member Functions inherited from fObservers.frameObserverPrototype
goOut (self, info)
 
+ + + + + + + + + + + + +

+Public Attributes

beam
 
stop
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
fObservers.stretchBeamObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • fObservers.py
  • +
+
+ + + + diff --git a/html/classfObservers_1_1stretchBeamObserver__coll__graph.map b/html/classfObservers_1_1stretchBeamObserver__coll__graph.map new file mode 100644 index 0000000..0bfe620 --- /dev/null +++ b/html/classfObservers_1_1stretchBeamObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classfObservers_1_1stretchBeamObserver__coll__graph.md5 b/html/classfObservers_1_1stretchBeamObserver__coll__graph.md5 new file mode 100644 index 0000000..b1d19cf --- /dev/null +++ b/html/classfObservers_1_1stretchBeamObserver__coll__graph.md5 @@ -0,0 +1 @@ +8d8bb865eef049e1030456c2b193c3a4 \ No newline at end of file diff --git a/html/classfObservers_1_1stretchBeamObserver__coll__graph.png b/html/classfObservers_1_1stretchBeamObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..865e5de67fd0e17eb6a04636f43c6d552a9039db GIT binary patch literal 8115 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 + + + + + + diff --git a/html/classfObservers_1_1stretchBeamObserver__inherit__graph.md5 b/html/classfObservers_1_1stretchBeamObserver__inherit__graph.md5 new file mode 100644 index 0000000..b1d19cf --- /dev/null +++ b/html/classfObservers_1_1stretchBeamObserver__inherit__graph.md5 @@ -0,0 +1 @@ +8d8bb865eef049e1030456c2b193c3a4 \ No newline at end of file diff --git a/html/classfObservers_1_1stretchBeamObserver__inherit__graph.png b/html/classfObservers_1_1stretchBeamObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..865e5de67fd0e17eb6a04636f43c6d552a9039db GIT binary patch literal 8115 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pCmd.ViewProvider Member List
+
+
+ +

This is the complete list of members for pCmd.ViewProvider, including all inherited members.

+ + + + + +
__init__(self, obj, icon_fn) (defined in pCmd.ViewProvider)pCmd.ViewProvider
_check_attr(self)pCmd.ViewProviderprotected
getIcon(self)pCmd.ViewProvider
icon_fn (defined in pCmd.ViewProvider)pCmd.ViewProvider
+ + + + diff --git a/html/classpCmd_1_1ViewProvider.html b/html/classpCmd_1_1ViewProvider.html new file mode 100644 index 0000000..67e9f64 --- /dev/null +++ b/html/classpCmd_1_1ViewProvider.html @@ -0,0 +1,165 @@ + + + + + + + +Quetzal: pCmd.ViewProvider Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +
+ +

COMMANDS ########################. + More...

+ + + + + + +

+Public Member Functions

__init__ (self, obj, icon_fn)
 
 getIcon (self)
 
+ + + +

+Public Attributes

icon_fn
 
+ + + +

+Protected Member Functions

 _check_attr (self)
 
+

Detailed Description

+

COMMANDS ########################.

+

Member Function Documentation

+ +

◆ _check_attr()

+ +
+
+ + + + + +
+ + + + + + + + +
pCmd.ViewProvider._check_attr ( self)
+
+protected
+
+
Check for missing attributes.
+
+
+ +

◆ getIcon()

+ +
+
+ + + + + + + + +
pCmd.ViewProvider.getIcon ( self)
+
+
Returns the path to the SVG icon.
+
+
+
The documentation for this class was generated from the following file:
    +
  • pCmd.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Cap-members.html b/html/classpFeatures_1_1Cap-members.html new file mode 100644 index 0000000..c926ded --- /dev/null +++ b/html/classpFeatures_1_1Cap-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.Cap Member List
+
+
+ +

This is the complete list of members for pFeatures.Cap, including all inherited members.

+ + + + +
__init__(self, obj, DN="DN50", OD=60.3, thk=3) (defined in pFeatures.Cap)pFeatures.Cap
execute(self, fp) (defined in pFeatures.Cap)pFeatures.Cap
onChanged(self, fp, prop) (defined in pFeatures.Cap)pFeatures.Cap
+ + + + diff --git a/html/classpFeatures_1_1Cap.html b/html/classpFeatures_1_1Cap.html new file mode 100644 index 0000000..59533ac --- /dev/null +++ b/html/classpFeatures_1_1Cap.html @@ -0,0 +1,224 @@ + + + + + + + +Quetzal: pFeatures.Cap Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.Cap Class Reference
+
+
+
+Inheritance diagram for pFeatures.Cap:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.Cap:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, DN="DN50", OD=60.3, thk=3)
 
onChanged (self, fp, prop)
 
 execute (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + +

+Additional Inherited Members

- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object PType="Cap"
+Cap(obj,[PSize="DN50",OD=60.3,thk=3])
+  obj: the "App::FeaturePython object"
+  PSize (string): nominal diameter
+  OD (float): outside diameter
+  thk (float): shell thickness

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pFeatures.Cap.__init__ ( self,
 obj,
 DN = "DN50",
 OD = 60.3,
 thk = 3 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.Cap.execute ( self,
 fp 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Cap__coll__graph.map b/html/classpFeatures_1_1Cap__coll__graph.map new file mode 100644 index 0000000..f49c95b --- /dev/null +++ b/html/classpFeatures_1_1Cap__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Cap__coll__graph.md5 b/html/classpFeatures_1_1Cap__coll__graph.md5 new file mode 100644 index 0000000..105522b --- /dev/null +++ b/html/classpFeatures_1_1Cap__coll__graph.md5 @@ -0,0 +1 @@ +ba64367b3f19df50a53cc85ac302cc08 \ No newline at end of file diff --git a/html/classpFeatures_1_1Cap__coll__graph.png b/html/classpFeatures_1_1Cap__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..72f37e999026ac8fd2a0727d177cc354bc8248d3 GIT binary patch literal 5520 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 literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1Cap__inherit__graph.map b/html/classpFeatures_1_1Cap__inherit__graph.map new file mode 100644 index 0000000..f49c95b --- /dev/null +++ b/html/classpFeatures_1_1Cap__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Cap__inherit__graph.md5 b/html/classpFeatures_1_1Cap__inherit__graph.md5 new file mode 100644 index 0000000..105522b --- /dev/null +++ b/html/classpFeatures_1_1Cap__inherit__graph.md5 @@ -0,0 +1 @@ +ba64367b3f19df50a53cc85ac302cc08 \ No newline at end of file diff --git a/html/classpFeatures_1_1Cap__inherit__graph.png b/html/classpFeatures_1_1Cap__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..72f37e999026ac8fd2a0727d177cc354bc8248d3 GIT binary patch literal 5520 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 literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1Elbow-members.html b/html/classpFeatures_1_1Elbow-members.html new file mode 100644 index 0000000..b1fe399 --- /dev/null +++ b/html/classpFeatures_1_1Elbow-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.Elbow Member List
+
+
+ +

This is the complete list of members for pFeatures.Elbow, including all inherited members.

+ + + + +
__init__(self, obj, DN="DN50", OD=60.3, thk=3, BA=90, BR=45.225) (defined in pFeatures.Elbow)pFeatures.Elbow
execute(self, fp) (defined in pFeatures.Elbow)pFeatures.Elbow
onChanged(self, fp, prop) (defined in pFeatures.Elbow)pFeatures.Elbow
+ + + + diff --git a/html/classpFeatures_1_1Elbow.html b/html/classpFeatures_1_1Elbow.html new file mode 100644 index 0000000..71fb2bd --- /dev/null +++ b/html/classpFeatures_1_1Elbow.html @@ -0,0 +1,238 @@ + + + + + + + +Quetzal: pFeatures.Elbow Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.Elbow Class Reference
+
+
+
+Inheritance diagram for pFeatures.Elbow:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.Elbow:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, DN="DN50", OD=60.3, thk=3, BA=90, BR=45.225)
 
onChanged (self, fp, prop)
 
 execute (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + +

+Additional Inherited Members

- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object PType="Elbow"
+Elbow(obj,[PSize="DN50",OD=60.3,thk=3,BA=90,BR=45.225])
+  obj: the "App::FeaturePython" object
+  PSize (string): nominal diameter
+  OD (float): outside diameter
+  thk (float): shell thickness
+  BA (float): bend angle
+  BR (float): bend radius

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pFeatures.Elbow.__init__ ( self,
 obj,
 DN = "DN50",
 OD = 60.3,
 thk = 3,
 BA = 90,
 BR = 45.225 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.Elbow.execute ( self,
 fp 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Elbow__coll__graph.map b/html/classpFeatures_1_1Elbow__coll__graph.map new file mode 100644 index 0000000..7ba7ff7 --- /dev/null +++ b/html/classpFeatures_1_1Elbow__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Elbow__coll__graph.md5 b/html/classpFeatures_1_1Elbow__coll__graph.md5 new file mode 100644 index 0000000..98a0279 --- /dev/null +++ b/html/classpFeatures_1_1Elbow__coll__graph.md5 @@ -0,0 +1 @@ +1094cbf670f14f63886fd32bcd496988 \ No newline at end of file diff --git a/html/classpFeatures_1_1Elbow__coll__graph.png b/html/classpFeatures_1_1Elbow__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..36b36f5bd5505cca1a60961534d413d606998f2a GIT binary patch literal 5690 zcmc&&byQT*x<7Q6QqrXo5(5KBilic?A|g@)NJ>dcNi#}FNOul3AWDaHiHJB7(%mT_ zL%+>^vF^L~@3-EXwa-~6XP^Cj-!HzmI$CNJq)em`1X0|-r~C-)bHS(~CInkQfh`KK zBQ$%UrVL$N{<4}-aS%keeP8*mu4mfj4YfvME^&V>w{(l)Px8{f^1#USigIf$IAL@-(X+)c2mfn9H>~k#4Jd56 zzD0hj`{;`Kv3=G)`ZUibWh=qOddh_ENyehgw6}bw{DX4HJOb9mXr4e~#xO%15)$I9 znhU$PA>F}6+~(2S+dE`7f)K77CAf`CbC$?KY-2XUNzau+#i6z#y|GA(z=upsOoGG0 z!i`ij1#aD)KpYX4%fKXBCA`=w

PsI#c@mOn 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 literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1Elbow__inherit__graph.map b/html/classpFeatures_1_1Elbow__inherit__graph.map new file mode 100644 index 0000000..7ba7ff7 --- /dev/null +++ b/html/classpFeatures_1_1Elbow__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Elbow__inherit__graph.md5 b/html/classpFeatures_1_1Elbow__inherit__graph.md5 new file mode 100644 index 0000000..98a0279 --- /dev/null +++ b/html/classpFeatures_1_1Elbow__inherit__graph.md5 @@ -0,0 +1 @@ +1094cbf670f14f63886fd32bcd496988 \ No newline at end of file diff --git a/html/classpFeatures_1_1Elbow__inherit__graph.png b/html/classpFeatures_1_1Elbow__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..36b36f5bd5505cca1a60961534d413d606998f2a GIT binary patch literal 5690 zcmc&&byQT*x<7Q6QqrXo5(5KBilic?A|g@)NJ>dcNi#}FNOul3AWDaHiHJB7(%mT_ zL%+>^vF^L~@3-EXwa-~6XP^Cj-!HzmI$CNJq)em`1X0|-r~C-)bHS(~CInkQfh`KK zBQ$%UrVL$N{<4}-aS%keeP8*mu4mfj4YfvME^&V>w{(l)Px8{f^1#USigIf$IAL@-(X+)c2mfn9H>~k#4Jd56 zzD0hj`{;`Kv3=G)`ZUibWh=qOddh_ENyehgw6}bw{DX4HJOb9mXr4e~#xO%15)$I9 znhU$PA>F}6+~(2S+dE`7f)K77CAf`CbC$?KY-2XUNzau+#i6z#y|GA(z=upsOoGG0 z!i`ij1#aD)KpYX4%fKXBCA`=w

PsI#c@mOn z>_sAG^}S=MKNb8lWy`6}n5hVdnAla}#vNRGAwwh{5vA)`LaS*@g5YzJH|IXLo_)ff zesduQnGWWtK>h?|^c;MAB+s5b)3!}~X2Q$Mi~Td#8EzpM)T%Jw6`A|t1MTrzN%_iV z&GZdPNy)DR12?&Hy1G0Op|M?k-^iXF5KazR*%uW@Tml5FM>hQBhIpI4ys?@p*t(UOr=OeSHS2mWGM&RGg0xK?rkoDZ*I669d_~1df%~^XG6-I18R!Ld;0^5D3r>`%3 zYogBFU}|_+)!yFT6|63sk*4kq;QbS?xqA+gHh@enP)_4B?5Qwzv zvjQF7EWMJ4CMJ&6^mm=!Noq-T_%{Y5OS|z488;&5yWitMDXFOyZtKHZY7)@srx#=q zs@%|J?At>rl=SuW6F229PWK9niUL|q6+n{4#>P_9&;;})3M&aEnji14)_NWAU#|7z z)YDTRxP(Moe?NtK{uK%e3T>zN&oWmx#kpw)qgZ8nFqk+lZtmWZk;K@zxT3PMGK~0q zAOYFE+(8|Eea508Tj|$-cxc?30yw!qhM>R~Fo{``tEj3zQc!?=_XpJq7EcbhZ?dzq zlai2R&&-&nh}+Sx9(Zwa8C1W#c64&`SWyvo6D&)Mv6wW$^R|1+ml5IT8Z3}d0AN~2eHvo-{Py_;9%GB z%tu8XqZQ`;LS&Sbs!mQ$!iOz&^4-$n!8X6i#7jMVo_*ztU#$JE$ z(W3WCMW2(pkA+2SE8?GrtH0RAl?L498Mp_gs;Vl-C$u&|*7+-S=&*oQ`uw_-@&YY_ z7Jt?^cMzM;==;Wzv8nbg;e~eyr>Rm>ySo|-*h1=gJ?Wsi0zv-kI8qHW0MZ{Jy=wk z(R`dC&@F0w-Z!Z){K?5w1dB80MaGb8Fp8FFHA_DHw#Extji8R=qGoWq$GU^7$JEo6 z4QC52s=-iFa30le9VC9C%%vLtN9pQYu{0g9PCx^+HxHh>hz( zxWX;g@<<565elSvd@;}bXWgCEl0K{=5&4l=@x5?veI=gDNgl_|HpE8Ael9J7x=M$8|>B|NM0@0QNK-_G|wQ&Hq1p*CWE=p^~QqSMg`bVDDBFLkR-|%{UFe z(KW>ST^A52dGNRXtZ5b8ap$*fnkLKpMDa4ChR~}wwUUg6?HSF@%rf-vzBFAIity?0 z;R$O0-y?Ut!A31b-dFk(03PP5CNFh%b$NB*{RQ2(ZU3gVjWUQ^Nt*fWU#mh_V=jTVi4*6%k zIlorpIIU`J%_}P_`;zHBK>HO}X~4H0wk~VG_#)Wvu<^%#E#8GcEqPR=j6fhzu%|`3 zqfOp5Mbq6_cg$s+KqY zdH1`Tj*gBN+{6?adU<_d;C&REoUOt6m|gipGc&Hv?(R5%2y%xLF28>LQdU-WY}_S$ z?dhp=?;i2>8#jK|yR9RU)}tR0t{bB;jD*8f<9(>GqGC{Yd*khR2j+Qp*90-r1+}xn9_w3rt5-&M&2k$8>zkdCCVS8JZnMW7B!Nz7ec;gby>?~#Sw(tfAAYOg#zB+pQ*uF}W*7;Sr|_fb)lKds>( z;^NE=E;<=Z@&LW-Pfm@&yx|ePzss*Dw5@z(PTJph#n`~)<=L7~Cbyj~*X9opBOKh^ z?fa-9TjztdCm-VD5r8Fm`S}$Q2u@voIv{%<0)Vz1|M9~=HuefF1B3a-Xa&fW>V~No zeF?1?%vH#%lpEv;pcyQ7{{2HEqsY5Kga{y4BqGB!ZnTe8*;SZ#Q$h+xMy#(~TpAir z$Bew~x;LE74#t@&8v-5{=^7Pm19nf5@aXqE-nStR^!J$dt-+iY7V=is)ZjtJen&5S z04p)ddBH*MIjs*1VoaZfe>+`S%^gv6b919#-}(EuD};<;XBCxc21uvYd7f~%+~ocK z{=UOWC7i8958cM>*cbprz)VT`m$t%(xzr2{R!>ecY^#(@{m_daMb3BHsq{ZvQuq^j zxaH^P>({#$bxLGsXGiy1jDGQzX=`iK*h@`Kon2ZA&Gb7a8Lzfi0)>|0cWeW-td}=W zts+Zwcz=MRvT5Lt2Lg+tzy_^n_movrQ2yj^3wn`Z<>kUaDh9F2xO3dO!!F!>`YJJ{-fsFaIsrLUUd2M+m6pbWPe{lmEzJZn zf^%YW5@z+CCEWg(t+<541TtC7YEJmg5g9HXp7ZL@>l>2|4B#7digX#_*3|ABqXE5f zH|I}}_C~AinFE7@G{=bnT^bv+0dN3s$jQy!op2dIUmA`Qp|2`T0K;HK9A!4mlrqV0{0OlCPH*77_z}j*N&NoL7elNXB(txN;TS>I}{OaF3g*7WJ3oVjVKsLnRY050i+UoaOW>&2r>+JUn5c4D;WfrN2IWF@>i-f`2~JNOQZQRWIF@u3G0hVQuM z$U2TDv)H~9QQ7*{Jc*nms}C1Pomf91=B{j+#LV5#IM@0!a@hZzNzq>nCm!4;13Kgd zZS-l)x{8Wq2_rrZ*~zCHR;`GQ{8TRuf*%KQ8W-A}#QHmmlyceHd{V-c=G%hGhbU_Z zBH3XP#c$ru^-3cQt6)fAh%SM?sa{_3SD?oKQnDp}?rJJryE3a9+}(`fp~M{y64@S1 z=E=&ZdSFg|?~dZ09vf`$g?#A<7T*7F)c&tj|9^GdzGd>nsLAUfF^V^D`lsy42j`7a z-rw05=LQ>(I(XuG-+63J*o>5a9Xso<3gpNG9H=0~o@El~U5<+_!`=C#ezk$NqO!75 zp?qY#i8YL;XJmxIwkn?;GW}j!T>O<2v0$fq;~LBVjJJLL{hd=y-kKOGDJkqioVIf5 zO7E#$6%M5Ko~<(gj|hS?GBSv%sJa1?UE=U#l-4W||B(OO zoEg+IjD8-Io=)NDxUHp@9my=o1=JC6?*(4K&4DtdrlSi13}H~J1gzr4`5E?L#AJ4U zKIod5C5ME>Fv5IvZ0sF?lT_Abz@;qGuEbW~)9wO48A`<-b+ot4&A|ZyEXVF;UPRPP zd65B-H$c;~`|RKVrydIMwcQ$Sc6NNA-|Qy`9@+Zng}(kZW*1CVzt)M9Uf4L|k~RP^ z0BF0bubFXb;UUEhWDs6;)Nj#>U3z*w{eeLH_rL& z*saGx)EdqdHZ;bZGtm;kB6a2M+qXbnc7ipBInOEk98P)^EDj9~={LBeSA}ohB!VvI zkylV)20#>mIP&e=)|J6r=h?OpAz#neuQ|oV=>RRckH}blW7J52laPkA6-(2S5*Qj8 zaVGZ7E-#1e?{~jB`SiK_&;#@;ZiD_u&H8huW(-Pup6U%2FEB802E<*;WeI}5_VwXF zfS(IXOYxygsR~{W0-_xJ^{YCth6>ahetm(O%2J}o$H(r;LIMI}nyC$;TwH)-%m*^$ zMn79=qh0_$gZxt^9p_pC@GjdFKPDz#8cYoi;xI5Uq^|q!=WE%mVdvQ|kRXSdKtl@1 z3{^uz7GSO$CjA`CuQf2=;c82l@t9d&wlcU8*E_Sh85tT%2vM==XZrjhF)%RDdHy_n zWyN}7c{#Vfo+&;)o>DIGFo73QT2ituihfjdtC|KM$F_>e#>NKu?wx4EcTjvl5(LBx zJZ+ntWEB?|$F7@Pkme2&gDHJ}?-`;PP+cv7fzxCc74?=$~Gmp6YYttCX_h;B>%6~-i^yyPjxk(O|Y)sOwybhD~L#rxhSy>z(5)yLC$|wZ|1$+AY zRqX6a`rSakZDXSD>Ya;IF>*pYB(ZAl;IHNObt!Lsrshkn0@^TzWn~hZR8R!7BxOqw z(R5D?xAXqW!{E?RTu-MpdB4-!p!qVkS~xZWVyvpB2FjWXC={SVlfht%vRUsN3Vu0@YJRl!Fn5%{d(F+;`3xC1l5>c@QgVq%A1DYdhkO;_X!&)bt z@-N5yU|Q7jd7_ z?ZQN&y)yurSN80>Uhgd(xFwcm&Tw_8c1@XZ^$)7Q744Bx;oW hKO3zPu;DwW>}hY_nd*+VfYvVr-B;04E>koO{15q=-p~L5 literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1Flange-members.html b/html/classpFeatures_1_1Flange-members.html new file mode 100644 index 0000000..3d72d0d --- /dev/null +++ b/html/classpFeatures_1_1Flange-members.html @@ -0,0 +1,94 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +

+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.Flange Member List
+
+
+ +

This is the complete list of members for pFeatures.Flange, including all inherited members.

+ + + + + +
__init__(self, obj, DN="DN50", FlangeType="SO", D=160, d=60.3, df=132, f=14, t=15, n=4, trf=0, drf=0, twn=0, dwn=0, ODp=0, R=0, T1=0, B2=0, Y=0) (defined in pFeatures.Flange)pFeatures.Flange
execute(self, fp)pFeatures.Flange
onChanged(self, fp, prop) (defined in pFeatures.Flange)pFeatures.Flange
Type (defined in pFeatures.Flange)pFeatures.Flange
+ + + + diff --git a/html/classpFeatures_1_1Flange.html b/html/classpFeatures_1_1Flange.html new file mode 100644 index 0000000..0fa53b7 --- /dev/null +++ b/html/classpFeatures_1_1Flange.html @@ -0,0 +1,323 @@ + + + + + + + +Quetzal: pFeatures.Flange Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.Flange Class Reference
+
+
+
+Inheritance diagram for pFeatures.Flange:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.Flange:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, DN="DN50", FlangeType="SO", D=160, d=60.3, df=132, f=14, t=15, n=4, trf=0, drf=0, twn=0, dwn=0, ODp=0, R=0, T1=0, B2=0, Y=0)
 
onChanged (self, fp, prop)
 
 execute (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + + + +

+Public Attributes

Type
 
- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object PType="Flange"
+Flange(obj,[PSize="DN50",FlangeType="SO", D=160, d=60.3,df=132, f=14 t=15,n=4, trf=0, drf=0, twn=0, dwn=0, ODp=0])
+  obj: the "App::FeaturePython" object
+  PSize (string): nominal diameter
+  FlangeType (string): type of Flange
+  D (float): flange diameter
+  d (float): bore diameter
+  df (float): bolts holes distance
+  f (float): bolts holes diameter
+  t (float): flange thickness
+  n (int): nr. of bolts
+  trf (float): raised-face thickness - OPTIONAL -
+  drf (float): raised-face diameter - OPTIONAL -
+  twn (float): welding-neck thickness - OPTIONAL -
+  dwn (float): welding-neck diameter - OPTIONAL -
+  ODp (float): outside diameter of pipe for wn flanges - OPTIONAL -
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pFeatures.Flange.__init__ ( self,
 obj,
 DN = "DN50",
 FlangeType = "SO",
 D = 160,
 d = 60.3,
 df = 132,
 f = 14,
 t = 15,
 n = 4,
 trf = 0,
 drf = 0,
 twn = 0,
 dwn = 0,
 ODp = 0,
 R = 0,
 T1 = 0,
 B2 = 0,
 Y = 0 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.Flange.execute ( self,
 fp 
)
+
+
 
+

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Flange__coll__graph.map b/html/classpFeatures_1_1Flange__coll__graph.map new file mode 100644 index 0000000..6d82167 --- /dev/null +++ b/html/classpFeatures_1_1Flange__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Flange__coll__graph.md5 b/html/classpFeatures_1_1Flange__coll__graph.md5 new file mode 100644 index 0000000..a581778 --- /dev/null +++ b/html/classpFeatures_1_1Flange__coll__graph.md5 @@ -0,0 +1 @@ +b331093336e454dcce2222192beba99f \ No newline at end of file diff --git a/html/classpFeatures_1_1Flange__coll__graph.png b/html/classpFeatures_1_1Flange__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e78a947b7b3a9483840a757573f479cee3d8fe4c GIT binary patch literal 5631 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 S7=Pa0g|syE5fyi=qW%YYpPlXi literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1Flange__inherit__graph.map b/html/classpFeatures_1_1Flange__inherit__graph.map new file mode 100644 index 0000000..6d82167 --- /dev/null +++ b/html/classpFeatures_1_1Flange__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Flange__inherit__graph.md5 b/html/classpFeatures_1_1Flange__inherit__graph.md5 new file mode 100644 index 0000000..a581778 --- /dev/null +++ b/html/classpFeatures_1_1Flange__inherit__graph.md5 @@ -0,0 +1 @@ +b331093336e454dcce2222192beba99f \ No newline at end of file diff --git a/html/classpFeatures_1_1Flange__inherit__graph.png b/html/classpFeatures_1_1Flange__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e78a947b7b3a9483840a757573f479cee3d8fe4c GIT binary patch literal 5631 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 S7=Pa0g|syE5fyi=qW%YYpPlXi literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1Pipe-members.html b/html/classpFeatures_1_1Pipe-members.html new file mode 100644 index 0000000..baa92b2 --- /dev/null +++ b/html/classpFeatures_1_1Pipe-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.Pipe Member List
+
+
+ +

This is the complete list of members for pFeatures.Pipe, including all inherited members.

+ + + + +
__init__(self, obj, DN="DN50", OD=60.3, thk=3, H=100) (defined in pFeatures.Pipe)pFeatures.Pipe
execute(self, fp) (defined in pFeatures.Pipe)pFeatures.Pipe
onChanged(self, fp, prop) (defined in pFeatures.Pipe)pFeatures.Pipe
+ + + + diff --git a/html/classpFeatures_1_1Pipe.html b/html/classpFeatures_1_1Pipe.html new file mode 100644 index 0000000..330d2c2 --- /dev/null +++ b/html/classpFeatures_1_1Pipe.html @@ -0,0 +1,231 @@ + + + + + + + +Quetzal: pFeatures.Pipe Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.Pipe Class Reference
+
+
+
+Inheritance diagram for pFeatures.Pipe:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.Pipe:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, DN="DN50", OD=60.3, thk=3, H=100)
 
onChanged (self, fp, prop)
 
 execute (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + +

+Additional Inherited Members

- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object PType="Pipe"
+Pipe(obj,[PSize="DN50",OD=60.3,thk=3, H=100])
+  obj: the "App::FeaturePython object"
+  PSize (string): nominal diameter
+  OD (float): outside diameter
+  thk (float): shell thickness
+  H (float): length of pipe

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pFeatures.Pipe.__init__ ( self,
 obj,
 DN = "DN50",
 OD = 60.3,
 thk = 3,
 H = 100 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.Pipe.execute ( self,
 fp 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Pipe__coll__graph.map b/html/classpFeatures_1_1Pipe__coll__graph.map new file mode 100644 index 0000000..840568f --- /dev/null +++ b/html/classpFeatures_1_1Pipe__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Pipe__coll__graph.md5 b/html/classpFeatures_1_1Pipe__coll__graph.md5 new file mode 100644 index 0000000..a9aa34b --- /dev/null +++ b/html/classpFeatures_1_1Pipe__coll__graph.md5 @@ -0,0 +1 @@ +c979ed370661f063b00643eb7ab09d45 \ No newline at end of file diff --git a/html/classpFeatures_1_1Pipe__coll__graph.png b/html/classpFeatures_1_1Pipe__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0b26865cbae86f6ef9ec90279a1a1f20627052c0 GIT binary patch literal 5454 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 O6jHmdtyHCejQkf0U~r=V literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1Pipe__inherit__graph.map b/html/classpFeatures_1_1Pipe__inherit__graph.map new file mode 100644 index 0000000..840568f --- /dev/null +++ b/html/classpFeatures_1_1Pipe__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Pipe__inherit__graph.md5 b/html/classpFeatures_1_1Pipe__inherit__graph.md5 new file mode 100644 index 0000000..a9aa34b --- /dev/null +++ b/html/classpFeatures_1_1Pipe__inherit__graph.md5 @@ -0,0 +1 @@ +c979ed370661f063b00643eb7ab09d45 \ No newline at end of file diff --git a/html/classpFeatures_1_1Pipe__inherit__graph.png b/html/classpFeatures_1_1Pipe__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0b26865cbae86f6ef9ec90279a1a1f20627052c0 GIT binary patch literal 5454 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 O6jHmdtyHCejQkf0U~r=V literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1PypeBranch2-members.html b/html/classpFeatures_1_1PypeBranch2-members.html new file mode 100644 index 0000000..a22fba6 --- /dev/null +++ b/html/classpFeatures_1_1PypeBranch2-members.html @@ -0,0 +1,95 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + + +
+
pFeatures.PypeBranch2 Member List
+
+
+ +

This is the complete list of members for pFeatures.PypeBranch2, including all inherited members.

+ + + + + + +
__init__(self, obj, base, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None) (defined in pFeatures.PypeBranch2)pFeatures.PypeBranch2
execute(self, fp) (defined in pFeatures.PypeBranch2)pFeatures.PypeBranch2
onChanged(self, fp, prop) (defined in pFeatures.PypeBranch2)pFeatures.PypeBranch2
purge(self, fp) (defined in pFeatures.PypeBranch2)pFeatures.PypeBranch2
redraw(self, fp) (defined in pFeatures.PypeBranch2)pFeatures.PypeBranch2
+ + + + diff --git a/html/classpFeatures_1_1PypeBranch2.html b/html/classpFeatures_1_1PypeBranch2.html new file mode 100644 index 0000000..8e8cafb --- /dev/null +++ b/html/classpFeatures_1_1PypeBranch2.html @@ -0,0 +1,248 @@ + + + + + + + +Quetzal: pFeatures.PypeBranch2 Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.PypeBranch2 Class Reference
+
+
+
+Inheritance diagram for pFeatures.PypeBranch2:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.PypeBranch2:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, base, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None)
 
onChanged (self, fp, prop)
 
 execute (self, fp)
 
redraw (self, fp)
 
purge (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + +

+Additional Inherited Members

- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object PType="PypeBranch2"
+Single-line pipe branch linked to its center-line using AttachExtensionPython
+ex: a=PypeBranch2(obj,base,DN="DN50",PRating="SCH-STD",OD=60.3,thk=3,BR=None)
+  type(obj)=FeaturePython
+  type(base)=DWire or SketchObject
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pFeatures.PypeBranch2.__init__ ( self,
 obj,
 base,
 DN = "DN50",
 PRating = "SCH-STD",
 OD = 60.3,
 thk = 3,
 BR = None 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.PypeBranch2.execute ( self,
 fp 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1PypeBranch2__coll__graph.map b/html/classpFeatures_1_1PypeBranch2__coll__graph.map new file mode 100644 index 0000000..bccc122 --- /dev/null +++ b/html/classpFeatures_1_1PypeBranch2__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1PypeBranch2__coll__graph.md5 b/html/classpFeatures_1_1PypeBranch2__coll__graph.md5 new file mode 100644 index 0000000..ff2ded8 --- /dev/null +++ b/html/classpFeatures_1_1PypeBranch2__coll__graph.md5 @@ -0,0 +1 @@ +651ebbe92a10159470d313c7229d31cc \ No newline at end of file diff --git a/html/classpFeatures_1_1PypeBranch2__coll__graph.png b/html/classpFeatures_1_1PypeBranch2__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..1f46a8b62d4e4ea971196825b5fb1fdddcde8e03 GIT binary patch literal 6182 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 + + + + + + diff --git a/html/classpFeatures_1_1PypeBranch2__inherit__graph.md5 b/html/classpFeatures_1_1PypeBranch2__inherit__graph.md5 new file mode 100644 index 0000000..ff2ded8 --- /dev/null +++ b/html/classpFeatures_1_1PypeBranch2__inherit__graph.md5 @@ -0,0 +1 @@ +651ebbe92a10159470d313c7229d31cc \ No newline at end of file diff --git a/html/classpFeatures_1_1PypeBranch2__inherit__graph.png b/html/classpFeatures_1_1PypeBranch2__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..1f46a8b62d4e4ea971196825b5fb1fdddcde8e03 GIT binary patch literal 6182 zcmc(jhc}$xy2nTFU9{*V5<)~5oe4n_QiSNeL>*-iy|+XSQGy^MLX;?j88s4uAR-7e zdat98e)jy%y=$F&|AE7L&06pB&g|LydA{Gz_leVgphZK;K?#9CXteJ_AA#3Ka3RP^ z!QTfZ7dOBQskN>a6mo(8eb-!)27$0nXhYSW_`Ti01Uz}NKTd|-%A5JX8xhLE%h^aA zNkJJ_dX4$RQOlp5#8GU=f~wD|;|GU2qhG%ig|mcic2Q5MCM{(yk~~g*odfTPBv(r_ z;f{a(E2=;_fB?ds|2 z>G*7d81}qj*3M^0z%cV$PvslB(TjnNEp}{djP_)BbW}h>g0T{{L;1AaC~N}Zo?w$J zYM98a6#woW@4b9wE}mcxa@@mT8-s;$dK5 zIK#RW$7oc9$HtPojMq~9F461Kz1bZ3@#D2}6|HR0Y$6A}_~!=#>?f`Y=R)-gqno1Hyw)I5M@a&nTKlCooa zt_yaGgZ1SpT^<=3$y5%yU07I1&&gSyMOroW=Jo5>jisff??3JAc&7fa-NX1!#Z9E9 zrry=lOWH&?YCxgf+}yQ+N1iZLb#+R4dAZ}o`56={1z$IckBj5uFI-)HJ~TR7QeJ)o zcA?az}(2Jux#gv*qABHD3OEnc@W)Tw55?pQBoD$`}-xy}iAoo7;B`(%0(w zb4tj^(o%*lV@#u02?hmLT6@{OSpOO?IpIk8Ga>L(;3HvzhnDlYJ3TNrmU>2pTED=&is$D z2AF_mBIn;3KhH+a7+S85I3^)WXJ;y~VT#+GOxHw3qfEtOOvSpE@RaUlSA4w6fwORtv4Ek=)x0cE)UC zkXGPrZES4tTiqGUP*qh$-xWvh*=QQLzPcL!@+I}_^z;H0ic?HXj7`chSx))+@U{8* z`FFLo%=`QM9$sEdOE*D*-fY3~SC}@26A+O)PXE0)hjkmgudJL}NoR-T`7g3>x0+1F z*7NhD8(>6VqiNQ}2f%{s>+5s5A74!aZCmjBmb0_7k%>u}aZ~@?f{sd)-!?xQjkdJ5 z4hLV+d}3kwMoa2p(ZeE5zMD7oChV3KTT&%|%q9QlP)>X3Vu<=`yMk1^H-sPn~ zSI_U}kdg=uu@Fv%hk8zURVBtVz8>Va!*)EiE0QzA%VC z9Zy~|MdUXQVQnE;_Xz{TVp&xVgn%g{m;Zb};3`coQ(VTCAye1U0$rR=zhIKafA6Y1 zxp}Ow=IH3SWO3Yi`;Oi~q<#j$u=#KJ_14Q!W;P}!uPVgu{_sPnsw#w&lXDn$4I}QB zT`z*e#Ky&~?A{t?^duuAQ{3&7T$N+C+4v|hkGkrR+Qs*OuaXR;$ZDYF@K8n(!r}0Z1DL0$y0NkGo34)^Kei31Tu=)M31wzw z#ZC0~^yr(KQmfI6doSxN9?ho>{tmz~yQ3SzzI>4w9vO-6%9C?j zG>{)tR3vaiRP@^mE-tQzPo5Arn$kKrEV->gLV=+by?;+Ep!u?Gus|c=PtvDP!t+Z@ zHXV@^8;hW;RSWd-A|Sk9Q)YazofHx~2cGDfx;XcJUtAow6eKmhdV6c@furL!JA3=o zPm_VW_p`;V2<7GFQ%XvNva+*>fB*q4j*E>wKR~pm#KdToc!eA-ux3j-&}QZ2q#+Qp z*O@8DYn{^M&X1Pz(}0d19UY~B1a) z1|4GHOE7Qm_rNOZ%SQkFNe>JRblhG1sWegzPDbL^Ek2-)U#hDM1_uYt_lv%KNu{Qt zxh^Yfh`sfQAZ%sPyX?~D_5>a`C+HU z26))nwSf#4;`|nR(t(@~yYU#PyScdBBOxJ~_0#hKHgSs@3Pt*EZThINh#EryCd{5A z;T!y*1|JEh3;#5%b8ywD__2Ec<>DLdxjYaW3VF$`!~qd^856%@j$(_8i<`v(fC0*W z<=lx&ArL2idU~3ik`h*1D`ndJ;!=_3D|JuLFLH>20s_{X=AFQzr>>8{* zbEx&1Jb#xio0nAav#+nuW2v8O8|L8b$*&GLAdyo({QY}D7?PJ<{MIc3$mwqWMQ4tC z3x$Y?2ryZ^m)F(RIl8z+78Dfp>@(C|^kp?R9@+eX?aXVRu321k9Ph8CHQl+^I?slzo?RM3uAT5S1n=@c_U=ouNqlauMCWMn$p+X(=g;MuCDw>Kp}pH4+Z zCH;hfn>$fY`G^=0l;6?98!JGrk5s^J`PTZF`~24F291kdEvvMiMET@pA9hRoOio2jqRpPQ1RmKmf6b6EIJsrt$M)jl>@Yy76#**v>1qRV$KsGl zZ^YcqO^lI=>7kKPEEenWBOjsSs5t-N0T4CE!9Ax7=l$WNpp%1{orPXG&w27_YWAJ6 z-2h#ar4730M_dD-D9(TKj@$$Zn|@ANwKsz0aa|6Vl6XO$b2-bu!r6@o%S0wN;1 zTrsJra3S;XAUjHGW2uWdSF=A$$xOcrW@oK^hWUf8YLH#qa6Mm|Z7z^+@Wu(bzS#}n zOZ(AtEYUiEpwC(jXL7niz@x4@a&i9>F0U*aFh~Ts5jCMI)-(fpy0z*=4)`NOD3uA4 zWMQF@V<(zfiHY|n12^xssgpY%?-wXDWH{Dvn|1Jw(uY-%>ntPw&NBz5qU)X})6OJ2 zt71pzN!nIY5J&fQu&H;Lt5m!lq*B{^B%#Cc%3WfG@pYz0az4F zr76D##GNZo13w1;-|st7+$vnqK{9bK zZDDq&!mDPT&h5ca!h;Bpa*QScnc5hk>Zuk7MJS4ahyXq667_OFVj&LN%czaKV6IM_ zS)fc)q?P}#TqxS92znM4nFpm$Dh4%gHK`u8{`zhEX0`^lKVdRnaVOqZ;%_79lAvL@ zNsN28zHoYdIB%bfq~vc?yC%UPB?!(MYw2ppFMqg+(Etq}vtbsT8(&mp)5_AB*>s7O z)tAH5JncWJSMrq+5-!@GuTq)rAV!%AhQ2LDb^Aw?tsy+y+uOju$woe##HdA( zI_;eTH8rd-Z3j23+}sjDjCnqPnzU9{+0rpw`j~-(BOZjz&dyFt5IupaIprsP&Pc8_ zL$ctl?BPR(3NvIhpGLIh`RS1`#@XG)1q$>-%(NjiI+_$DC@XLuL>36dWvYb>I9??1 zAz9g&%F3HSJW18)>6w@!$_y*52lAB0Y8>d+H#Vy6e{z(YH*@G_+-QHSr$mB}j_ujf z&Q*53EYzHG`sIj*1~$V=^KY}?5@t3xCtbO&U%!4=M@QYvjB9;;ot}-2TtNZJou3bO z!@mD*9B^Kcv)|R%vj9Nw+iE`S3=$R=#!d!oSz(%dz}l9p^Og3?ML`7C($X56n3w|w zz;)g~elUG{v}<%8gd5Q>v2K(5R$ffb%0WAjy$MnKNl)Tqs+u$HQ z#A9tlG;r^iR&IaL+Gj-Pc=_kg_zVgbzR}Kq@}F@l>m=!2S-rlwe$dWvWcW8Ca7#ZzYS3>eKHGt7`OLZ&&tV(0)SLxWaPUq zU%nXjrn|SEv4ot?@mRUL(`DU@2A=o6_cr*39?OG#<))2{fM2hPh-lc`f6(Cz83tz$ z!(pwMSy>YblmZTJ*why0c5&Ug;mT{_5OXDFEusQe%sbY#>O4p z-Q+d)Kh^E*?2u)&SZutlvva~yUH~ls*`SKU#-+RnK%}-3&ysw)7d)3&R@%V>AiaBd zc(j#2t9f#J;OyiOwzvF{jf10Oa*`V~lHb8!2iRgCJ4DsXOLFMehnO7#igtBzft-%G z|3iVZv$ItW19@;~biESf-J{Bh7KydBH6jSNqF*SOwshM{P_s+C@6Gd;MtmL~ej+F+ zI6V+@?uF=j!TFrZ-+6aJ`2dSuh9^cvk$`hw{F!6r;)1q1ePa>a4%nRm6o;XqA=qpF zD_2Oeva)8CbDM|R+1TEdmTCu@8XAsT<=5}N_yigUg8?l|%df7fNm^J`#K6TxLqrtu z;Bag6RegH;CD8pTd3lKd@bQ4@*@(g@o9#bNH|7b-`>dO&5kp%?S1f6l^Uf_ z;wPf%coM<92@kFY1_l5??&hy{_x5T4(E~jj|eR+rfBEP@DYdS&x00ULzFlZE=jP_-7}ED99_)Z}2JZfp?f&`G zz$qBKaetmtf>sZb9jlx>u!NY%wmKfL3e{IK-b>2<|IS70}(jY-uV$yGG3~ zq(MHN0kwrfq0C3O=hO6N!IbAah|2npA4gbyjpmb*dV+Euyo{e|fvhq;J3F+JUWp8b z8#!g(oZl+KWxl4NuD(ba?$OrUtGf_U4jkw4hkNZnzfMe(EAXR5g)LOX(e6@$ zue32tC7=Yj0yy9pYisMpT1>yn$S5H{i0mAD`};F1E2SHrf_gS8+qSL#bFXCa2TV*t z;^X)A$FQC#pF1+qT4|ysC;%~s*4v-`e{g~loAP^VXz2Wf_WN;pO+Jng6L|_MA=-ByKr7TO!~X? + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.PypeLine2 Member List
+
+
+ +

This is the complete list of members for pFeatures.PypeLine2, including all inherited members.

+ + + + + + +
__init__(self, obj, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None, lab=None) (defined in pFeatures.PypeLine2)pFeatures.PypeLine2
execute(self, fp) (defined in pFeatures.PypeLine2)pFeatures.PypeLine2
onChanged(self, fp, prop) (defined in pFeatures.PypeLine2)pFeatures.PypeLine2
purge(self, fp) (defined in pFeatures.PypeLine2)pFeatures.PypeLine2
update(self, fp, edges=None) (defined in pFeatures.PypeLine2)pFeatures.PypeLine2
+ + + + diff --git a/html/classpFeatures_1_1PypeLine2.html b/html/classpFeatures_1_1PypeLine2.html new file mode 100644 index 0000000..59f2ac5 --- /dev/null +++ b/html/classpFeatures_1_1PypeLine2.html @@ -0,0 +1,260 @@ + + + + + + + +Quetzal: pFeatures.PypeLine2 Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.PypeLine2 Class Reference
+
+
+
+Inheritance diagram for pFeatures.PypeLine2:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.PypeLine2:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None, lab=None)
 
onChanged (self, fp, prop)
 
purge (self, fp)
 
update (self, fp, edges=None)
 
 execute (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + +

+Additional Inherited Members

- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object PType="PypeLine2"
+This object represent a collection of objects "PType" that are updated with the
+methods defined in the Python class.
+At present time it creates, with the method obj.Proxy.update(,obj,[edges]), pipes and curves over
+the given edges and collect them in a group named according the object's .Label.
+PypeLine2 features also the optional attribute ".Base":
+- Base can be a Wire or a Sketch or any object which has edges in its Shape.
+- Running "obj.Proxy.update(obj)", without any [edges], the class attempts to render the pypeline
+(Pipe and Elbow objects) on the "obj.Base" edges: for well defined geometries
+and open paths, this usually leads to acceptable results.
+- Running "obj.Proxy.purge(obj)" deletes from the model all Pipes and Elbows
+that belongs to the pype-line.
+- It's possible to add other objects afterwards (such as Flange, Reduct...)
+using the relevant insertion dialogs but remember that these won't be updated
+when the .Base is changed and won't be deleted if the pype-line is purged.
+- If Base is None, PypeLine2 behaves like a bare container of objects,
+with possibility to group them automatically and extract the part-list.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pFeatures.PypeLine2.__init__ ( self,
 obj,
 DN = "DN50",
 PRating = "SCH-STD",
 OD = 60.3,
 thk = 3,
 BR = None,
 lab = None 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.PypeLine2.execute ( self,
 fp 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1PypeLine2__coll__graph.map b/html/classpFeatures_1_1PypeLine2__coll__graph.map new file mode 100644 index 0000000..0f52be9 --- /dev/null +++ b/html/classpFeatures_1_1PypeLine2__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1PypeLine2__coll__graph.md5 b/html/classpFeatures_1_1PypeLine2__coll__graph.md5 new file mode 100644 index 0000000..34a63f5 --- /dev/null +++ b/html/classpFeatures_1_1PypeLine2__coll__graph.md5 @@ -0,0 +1 @@ +4b2ca7d572aec54dbeec7a93b63eebd8 \ No newline at end of file diff --git a/html/classpFeatures_1_1PypeLine2__coll__graph.png b/html/classpFeatures_1_1PypeLine2__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..84f89b62f9be70bea3447b744eb4f66039a66b06 GIT binary patch literal 5839 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 + + + + + + diff --git a/html/classpFeatures_1_1PypeLine2__inherit__graph.md5 b/html/classpFeatures_1_1PypeLine2__inherit__graph.md5 new file mode 100644 index 0000000..34a63f5 --- /dev/null +++ b/html/classpFeatures_1_1PypeLine2__inherit__graph.md5 @@ -0,0 +1 @@ +4b2ca7d572aec54dbeec7a93b63eebd8 \ No newline at end of file diff --git a/html/classpFeatures_1_1PypeLine2__inherit__graph.png b/html/classpFeatures_1_1PypeLine2__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..84f89b62f9be70bea3447b744eb4f66039a66b06 GIT binary patch literal 5839 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.Reduct Member List
+
+
+ +

This is the complete list of members for pFeatures.Reduct, including all inherited members.

+ + + + +
__init__(self, obj, DN="DN50", OD=60.3, OD2=48.3, thk=3, thk2=None, H=None, conc=True) (defined in pFeatures.Reduct)pFeatures.Reduct
execute(self, fp) (defined in pFeatures.Reduct)pFeatures.Reduct
onChanged(self, fp, prop) (defined in pFeatures.Reduct)pFeatures.Reduct
+ + + + diff --git a/html/classpFeatures_1_1Reduct.html b/html/classpFeatures_1_1Reduct.html new file mode 100644 index 0000000..cfbaab3 --- /dev/null +++ b/html/classpFeatures_1_1Reduct.html @@ -0,0 +1,255 @@ + + + + + + + +Quetzal: pFeatures.Reduct Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.Reduct Class Reference
+
+
+
+Inheritance diagram for pFeatures.Reduct:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.Reduct:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, DN="DN50", OD=60.3, OD2=48.3, thk=3, thk2=None, H=None, conc=True)
 
onChanged (self, fp, prop)
 
 execute (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + +

+Additional Inherited Members

- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object PType="Reduct"
+Reduct(obj,[PSize="DN50",OD=60.3, OD2= 48.3, thk=3, thk2=None, H=None, conc=True])
+  obj: the "App::FeaturePython object"
+  PSize (string): nominal diameter (major)
+  OD (float): major outside diameter
+  OD2 (float): minor outside diameter
+  thk (float): major shell thickness
+  thk2 (float): minor shell thickness
+  H (float): length of reduction
+  conc (bool): True for a concentric reduction, False for eccentric
+If thk2 is None or 0, the same thickness is used at both ends.
+If H is None or 0, the length of the reduction is calculated as 3x(OD-OD2).
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pFeatures.Reduct.__init__ ( self,
 obj,
 DN = "DN50",
 OD = 60.3,
 OD2 = 48.3,
 thk = 3,
 thk2 = None,
 H = None,
 conc = True 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.Reduct.execute ( self,
 fp 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Reduct__coll__graph.map b/html/classpFeatures_1_1Reduct__coll__graph.map new file mode 100644 index 0000000..f5389cb --- /dev/null +++ b/html/classpFeatures_1_1Reduct__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Reduct__coll__graph.md5 b/html/classpFeatures_1_1Reduct__coll__graph.md5 new file mode 100644 index 0000000..50b2c87 --- /dev/null +++ b/html/classpFeatures_1_1Reduct__coll__graph.md5 @@ -0,0 +1 @@ +6ff044edeccabfc671bbd86ebdfb39bf \ No newline at end of file diff --git a/html/classpFeatures_1_1Reduct__coll__graph.png b/html/classpFeatures_1_1Reduct__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b659fc17fe087e8b2bacff840ab6f5501872e467 GIT binary patch literal 5839 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 + + + + + + diff --git a/html/classpFeatures_1_1Reduct__inherit__graph.md5 b/html/classpFeatures_1_1Reduct__inherit__graph.md5 new file mode 100644 index 0000000..50b2c87 --- /dev/null +++ b/html/classpFeatures_1_1Reduct__inherit__graph.md5 @@ -0,0 +1 @@ +6ff044edeccabfc671bbd86ebdfb39bf \ No newline at end of file diff --git a/html/classpFeatures_1_1Reduct__inherit__graph.png b/html/classpFeatures_1_1Reduct__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b659fc17fe087e8b2bacff840ab6f5501872e467 GIT binary patch literal 5839 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.Shell Member List
+
+
+ +

This is the complete list of members for pFeatures.Shell, including all inherited members.

+ + + + +
__init__(self, obj, L=800, W=400, H=500, thk1=6, thk2=8) (defined in pFeatures.Shell)pFeatures.Shell
execute(self, fp) (defined in pFeatures.Shell)pFeatures.Shell
onChanged(self, fp, prop) (defined in pFeatures.Shell)pFeatures.Shell
+ + + + diff --git a/html/classpFeatures_1_1Shell.html b/html/classpFeatures_1_1Shell.html new file mode 100644 index 0000000..e923499 --- /dev/null +++ b/html/classpFeatures_1_1Shell.html @@ -0,0 +1,115 @@ + + + + + + + +Quetzal: pFeatures.Shell Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.Shell Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

__init__ (self, obj, L=800, W=400, H=500, thk1=6, thk2=8)
 
onChanged (self, fp, prop)
 
execute (self, fp)
 
+

Detailed Description

+
Class for a lateral-shell-of-tank object
+Shell(obj[,L=800,W=400,H=500,thk=6])
+  obj: the "App::FeaturePython" object
+  L (float): the length
+  W (float): the width
+  H (float): the height
+  thk1 (float): the shell thickness
+  thk2 (float): the top thickness
+

The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Ubolt-members.html b/html/classpFeatures_1_1Ubolt-members.html new file mode 100644 index 0000000..9894ab0 --- /dev/null +++ b/html/classpFeatures_1_1Ubolt-members.html @@ -0,0 +1,93 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.Ubolt Member List
+
+
+ +

This is the complete list of members for pFeatures.Ubolt, including all inherited members.

+ + + + +
__init__(self, obj, DN="DN50", ClampType="DIN-UBolt", C=76, H=109, d=10) (defined in pFeatures.Ubolt)pFeatures.Ubolt
execute(self, fp) (defined in pFeatures.Ubolt)pFeatures.Ubolt
onChanged(self, fp, prop) (defined in pFeatures.Ubolt)pFeatures.Ubolt
+ + + + diff --git a/html/classpFeatures_1_1Ubolt.html b/html/classpFeatures_1_1Ubolt.html new file mode 100644 index 0000000..304c51d --- /dev/null +++ b/html/classpFeatures_1_1Ubolt.html @@ -0,0 +1,115 @@ + + + + + + + +Quetzal: pFeatures.Ubolt Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.Ubolt Class Reference
+
+
+ + + + + + + + +

+Public Member Functions

__init__ (self, obj, DN="DN50", ClampType="DIN-UBolt", C=76, H=109, d=10)
 
onChanged (self, fp, prop)
 
execute (self, fp)
 
+

Detailed Description

+
Class for object PType="Clamp"
+UBolt(obj,[PSize="DN50",ClampType="U-bolt", C=76, H=109, d=10])
+  obj: the "App::FeaturePython" object
+  PSize (string): nominal diameter
+  ClampType (string): the clamp type or standard
+  C (float): the diameter of the U-bolt
+  H (float): the total height of the U-bolt
+  d (float): the rod diameter
+

The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Valve-members.html b/html/classpFeatures_1_1Valve-members.html new file mode 100644 index 0000000..9b9c389 --- /dev/null +++ b/html/classpFeatures_1_1Valve-members.html @@ -0,0 +1,92 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.Valve Member List
+
+
+ +

This is the complete list of members for pFeatures.Valve, including all inherited members.

+ + + +
__init__(self, obj, DN="DN50", VType="ball", OD=72, ID=50, H=40, Kv=150) (defined in pFeatures.Valve)pFeatures.Valve
execute(self, fp) (defined in pFeatures.Valve)pFeatures.Valve
+ + + + diff --git a/html/classpFeatures_1_1Valve.html b/html/classpFeatures_1_1Valve.html new file mode 100644 index 0000000..05060f2 --- /dev/null +++ b/html/classpFeatures_1_1Valve.html @@ -0,0 +1,240 @@ + + + + + + + +Quetzal: pFeatures.Valve Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.Valve Class Reference
+
+
+
+Inheritance diagram for pFeatures.Valve:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.Valve:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + +

+Public Member Functions

 __init__ (self, obj, DN="DN50", VType="ball", OD=72, ID=50, H=40, Kv=150)
 
 execute (self, fp)
 
- Public Member Functions inherited from pFeatures.pypeType
 nearestPort (self, point=None)
 
+ + + + +

+Additional Inherited Members

- Public Attributes inherited from pFeatures.pypeType
Name
 
+

Detailed Description

+
Class for object PType="Valve"
+Pipe(obj,[PSize="DN50",VType="ball", OD=60.3, H=100])
+  obj: the "App::FeaturePython object"
+  PSize (string): nominal diameter
+  PRating (string): ! the valve's type !
+  OD (float): outside diameter
+  H (float): length of valve

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pFeatures.Valve.__init__ ( self,
 obj,
 DN = "DN50",
 VType = "ball",
 OD = 72,
 ID = 50,
 H = 40,
 Kv = 150 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.Valve.execute ( self,
 fp 
)
+
+ +

Reimplemented from pFeatures.pypeType.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1Valve__coll__graph.map b/html/classpFeatures_1_1Valve__coll__graph.map new file mode 100644 index 0000000..8e66331 --- /dev/null +++ b/html/classpFeatures_1_1Valve__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpFeatures_1_1Valve__coll__graph.md5 b/html/classpFeatures_1_1Valve__coll__graph.md5 new file mode 100644 index 0000000..0893470 --- /dev/null +++ b/html/classpFeatures_1_1Valve__coll__graph.md5 @@ -0,0 +1 @@ +96a8a536093137a444515837b2a27acb \ No newline at end of file diff --git a/html/classpFeatures_1_1Valve__coll__graph.png b/html/classpFeatures_1_1Valve__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd987cdadd6cd9bfbfacf65164ca804f58834e8 GIT binary patch literal 5660 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 + + + + + + diff --git a/html/classpFeatures_1_1Valve__inherit__graph.md5 b/html/classpFeatures_1_1Valve__inherit__graph.md5 new file mode 100644 index 0000000..0893470 --- /dev/null +++ b/html/classpFeatures_1_1Valve__inherit__graph.md5 @@ -0,0 +1 @@ +96a8a536093137a444515837b2a27acb \ No newline at end of file diff --git a/html/classpFeatures_1_1Valve__inherit__graph.png b/html/classpFeatures_1_1Valve__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd987cdadd6cd9bfbfacf65164ca804f58834e8 GIT binary patch literal 5660 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.ViewProviderPypeBranch Member List
+
+ + + + + diff --git a/html/classpFeatures_1_1ViewProviderPypeBranch.html b/html/classpFeatures_1_1ViewProviderPypeBranch.html new file mode 100644 index 0000000..57b2fa2 --- /dev/null +++ b/html/classpFeatures_1_1ViewProviderPypeBranch.html @@ -0,0 +1,140 @@ + + + + + + + +Quetzal: pFeatures.ViewProviderPypeBranch Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.ViewProviderPypeBranch Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, vobj)
 
getIcon (self)
 
attach (self, vobj)
 
setEdit (self, vobj, mode)
 
unsetEdit (self, vobj, mode)
 
__getstate__ (self)
 
__setstate__ (self, state)
 
dumps (self)
 
loads (self, state)
 
claimChildren (self)
 
onDelete (self, feature, subelements)
 
+ + + + + +

+Public Attributes

ViewObject
 
Object
 
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1ViewProviderPypeLine-members.html b/html/classpFeatures_1_1ViewProviderPypeLine-members.html new file mode 100644 index 0000000..8ffb455 --- /dev/null +++ b/html/classpFeatures_1_1ViewProviderPypeLine-members.html @@ -0,0 +1,97 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.ViewProviderPypeLine Member List
+
+
+ +

This is the complete list of members for pFeatures.ViewProviderPypeLine, including all inherited members.

+ + + + + + + + +
__getstate__(self) (defined in pFeatures.ViewProviderPypeLine)pFeatures.ViewProviderPypeLine
__init__(self, vobj) (defined in pFeatures.ViewProviderPypeLine)pFeatures.ViewProviderPypeLine
__setstate__(self, data) (defined in pFeatures.ViewProviderPypeLine)pFeatures.ViewProviderPypeLine
attach(self, vobj) (defined in pFeatures.ViewProviderPypeLine)pFeatures.ViewProviderPypeLine
getIcon(self) (defined in pFeatures.ViewProviderPypeLine)pFeatures.ViewProviderPypeLine
Object (defined in pFeatures.ViewProviderPypeLine)pFeatures.ViewProviderPypeLine
ViewObject (defined in pFeatures.ViewProviderPypeLine)pFeatures.ViewProviderPypeLine
+ + + + diff --git a/html/classpFeatures_1_1ViewProviderPypeLine.html b/html/classpFeatures_1_1ViewProviderPypeLine.html new file mode 100644 index 0000000..fb63ebf --- /dev/null +++ b/html/classpFeatures_1_1ViewProviderPypeLine.html @@ -0,0 +1,122 @@ + + + + + + + +Quetzal: pFeatures.ViewProviderPypeLine Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.ViewProviderPypeLine Class Reference
+
+
+ + + + + + + + + + + + +

+Public Member Functions

__getstate__ (self)
 
__setstate__ (self, data)
 
__init__ (self, vobj)
 
getIcon (self)
 
attach (self, vobj)
 
+ + + + + +

+Public Attributes

ViewObject
 
Object
 
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1pypeType-members.html b/html/classpFeatures_1_1pypeType-members.html new file mode 100644 index 0000000..fd24833 --- /dev/null +++ b/html/classpFeatures_1_1pypeType-members.html @@ -0,0 +1,94 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pFeatures.pypeType Member List
+
+
+ +

This is the complete list of members for pFeatures.pypeType, including all inherited members.

+ + + + + +
__init__(self, obj) (defined in pFeatures.pypeType)pFeatures.pypeType
execute(self, fp) (defined in pFeatures.pypeType)pFeatures.pypeType
Name (defined in pFeatures.pypeType)pFeatures.pypeType
nearestPort(self, point=None)pFeatures.pypeType
+ + + + diff --git a/html/classpFeatures_1_1pypeType.html b/html/classpFeatures_1_1pypeType.html new file mode 100644 index 0000000..32d8f59 --- /dev/null +++ b/html/classpFeatures_1_1pypeType.html @@ -0,0 +1,217 @@ + + + + + + + +Quetzal: pFeatures.pypeType Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pFeatures.pypeType Class Reference
+
+
+ +

CLASSES ###########################. + More...

+
+Inheritance diagram for pFeatures.pypeType:
+
+
Inheritance graph
+ + + + + + + + + + + + + + + + + + + + + + + +
[legend]
+
+Collaboration diagram for pFeatures.pypeType:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + +

+Public Member Functions

__init__ (self, obj)
 
 execute (self, fp)
 
 nearestPort (self, point=None)
 
+ + + +

+Public Attributes

Name
 
+

Detailed Description

+

CLASSES ###########################.

+

Member Function Documentation

+ +

◆ execute()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.pypeType.execute ( self,
 fp 
)
+
+ +

Reimplemented in pFeatures.Flange.

+ +
+
+ +

◆ nearestPort()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pFeatures.pypeType.nearestPort ( self,
 point = None 
)
+
+
nearestPort (point=None)
+  Returns the Port nearest to  point
+  or to the selected geometry.
+  (<portNr>, <portPos>, <portDir>)
+
+
+
+
The documentation for this class was generated from the following file:
    +
  • pFeatures.py
  • +
+
+ + + + diff --git a/html/classpFeatures_1_1pypeType__coll__graph.map b/html/classpFeatures_1_1pypeType__coll__graph.map new file mode 100644 index 0000000..39738be --- /dev/null +++ b/html/classpFeatures_1_1pypeType__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classpFeatures_1_1pypeType__coll__graph.md5 b/html/classpFeatures_1_1pypeType__coll__graph.md5 new file mode 100644 index 0000000..5138ce0 --- /dev/null +++ b/html/classpFeatures_1_1pypeType__coll__graph.md5 @@ -0,0 +1 @@ +f4ee6fd35b99f97a3c84d4c48de9807c \ No newline at end of file diff --git a/html/classpFeatures_1_1pypeType__coll__graph.png b/html/classpFeatures_1_1pypeType__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1089f36bd15710b8754852ee1a24678a61b19a GIT binary patch literal 3667 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 literal 0 HcmV?d00001 diff --git a/html/classpFeatures_1_1pypeType__inherit__graph.map b/html/classpFeatures_1_1pypeType__inherit__graph.map new file mode 100644 index 0000000..4f58c85 --- /dev/null +++ b/html/classpFeatures_1_1pypeType__inherit__graph.map @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/classpFeatures_1_1pypeType__inherit__graph.md5 b/html/classpFeatures_1_1pypeType__inherit__graph.md5 new file mode 100644 index 0000000..dc33043 --- /dev/null +++ b/html/classpFeatures_1_1pypeType__inherit__graph.md5 @@ -0,0 +1 @@ +16ab88a29dd926d7ef8e1a9516b666e7 \ No newline at end of file diff --git a/html/classpFeatures_1_1pypeType__inherit__graph.png b/html/classpFeatures_1_1pypeType__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0681dfc3a77a09e43f8f802b2c541f7c76a75169 GIT binary patch literal 37652 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 D)ufyX literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1breakForm-members.html b/html/classpForms_1_1breakForm-members.html new file mode 100644 index 0000000..364221d --- /dev/null +++ b/html/classpForms_1_1breakForm-members.html @@ -0,0 +1,120 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +

+
+
pForms.breakForm Member List
+
+
+ +

This is the complete list of members for pForms.breakForm, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self, winTitle=translate("breakForm", "Break the pipes"), PType="Pipe", PRating="SCH-STD", icon="break.svg") (defined in pForms.breakForm)pForms.breakForm
breakPipe (defined in pForms.breakForm)pForms.breakForm
breakPipe(self) (defined in pForms.breakForm)pForms.breakForm
btn0 (defined in pForms.breakForm)pForms.breakForm
btn1 (defined in pForms.breakForm)pForms.breakForm
btn2 (defined in pForms.breakForm)pForms.breakForm
calcGapPercent (defined in pForms.breakForm)pForms.breakForm
calcGapPercent(self) (defined in pForms.breakForm)pForms.breakForm
changeGap (defined in pForms.breakForm)pForms.breakForm
changeGap(self) (defined in pForms.breakForm)pForms.breakForm
changePoint (defined in pForms.breakForm)pForms.breakForm
changePoint(self) (defined in pForms.breakForm)pForms.breakForm
combo (defined in pForms.breakForm)pForms.breakForm
edit1 (defined in pForms.breakForm)pForms.breakForm
edit2 (defined in pForms.breakForm)pForms.breakForm
getL (defined in pForms.breakForm)pForms.breakForm
getL(self) (defined in pForms.breakForm)pForms.breakForm
grid (defined in pForms.breakForm)pForms.breakForm
lab0 (defined in pForms.breakForm)pForms.breakForm
lab1 (defined in pForms.breakForm)pForms.breakForm
lab2 (defined in pForms.breakForm)pForms.breakForm
lab3 (defined in pForms.breakForm)pForms.breakForm
PRating (defined in pForms.breakForm)pForms.breakForm
PType (defined in pForms.breakForm)pForms.breakForm
refL (defined in pForms.breakForm)pForms.breakForm
setCurrentPL (defined in pForms.breakForm)pForms.breakForm
setCurrentPL(self, PLName=None) (defined in pForms.breakForm)pForms.breakForm
slider (defined in pForms.breakForm)pForms.breakForm
updateSlider (defined in pForms.breakForm)pForms.breakForm
updateSlider(self) (defined in pForms.breakForm)pForms.breakForm
+ + + + diff --git a/html/classpForms_1_1breakForm.html b/html/classpForms_1_1breakForm.html new file mode 100644 index 0000000..5c5f38a --- /dev/null +++ b/html/classpForms_1_1breakForm.html @@ -0,0 +1,213 @@ + + + + + + + +Quetzal: pForms.breakForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.breakForm Class Reference
+
+
+
+Inheritance diagram for pForms.breakForm:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for pForms.breakForm:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, winTitle=translate("breakForm", "Break the pipes"), PType="Pipe", PRating="SCH-STD", icon="break.svg")
 
setCurrentPL (self, PLName=None)
 
getL (self)
 
changePoint (self)
 
changeGap (self)
 
updateSlider (self)
 
calcGapPercent (self)
 
breakPipe (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

refL
 
PType
 
PRating
 
grid
 
btn0
 
getL
 
lab0
 
lab1
 
combo
 
setCurrentPL
 
edit1
 
updateSlider
 
edit2
 
calcGapPercent
 
lab2
 
btn1
 
breakPipe
 
lab3
 
btn2
 
changeGap
 
slider
 
changePoint
 
+

Detailed Description

+
Dialog to break one pipe and create a gap.
+

The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1breakForm__coll__graph.map b/html/classpForms_1_1breakForm__coll__graph.map new file mode 100644 index 0000000..38700e8 --- /dev/null +++ b/html/classpForms_1_1breakForm__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classpForms_1_1breakForm__coll__graph.md5 b/html/classpForms_1_1breakForm__coll__graph.md5 new file mode 100644 index 0000000..28cfe15 --- /dev/null +++ b/html/classpForms_1_1breakForm__coll__graph.md5 @@ -0,0 +1 @@ +314f4546d8836c75bb2fd394d06f60d8 \ No newline at end of file diff --git a/html/classpForms_1_1breakForm__coll__graph.png b/html/classpForms_1_1breakForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..905d3361c5064284d835c97da11809c7a3b27f51 GIT binary patch literal 3750 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1breakForm__inherit__graph.map b/html/classpForms_1_1breakForm__inherit__graph.map new file mode 100644 index 0000000..38700e8 --- /dev/null +++ b/html/classpForms_1_1breakForm__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classpForms_1_1breakForm__inherit__graph.md5 b/html/classpForms_1_1breakForm__inherit__graph.md5 new file mode 100644 index 0000000..28cfe15 --- /dev/null +++ b/html/classpForms_1_1breakForm__inherit__graph.md5 @@ -0,0 +1 @@ +314f4546d8836c75bb2fd394d06f60d8 \ No newline at end of file diff --git a/html/classpForms_1_1breakForm__inherit__graph.png b/html/classpForms_1_1breakForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..905d3361c5064284d835c97da11809c7a3b27f51 GIT binary patch literal 3750 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertBranchForm-members.html b/html/classpForms_1_1insertBranchForm-members.html new file mode 100644 index 0000000..2232e37 --- /dev/null +++ b/html/classpForms_1_1insertBranchForm-members.html @@ -0,0 +1,98 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertBranchForm Member List
+
+
+ +

This is the complete list of members for pForms.insertBranchForm, including all inherited members.

+ + + + + + + + + +
__init__(self)pForms.insertBranchForm
color (defined in pForms.insertBranchForm)pForms.insertBranchForm
edit1 (defined in pForms.insertBranchForm)pForms.insertBranchForm
edit2 (defined in pForms.insertBranchForm)pForms.insertBranchForm
insert (defined in pForms.insertBranchForm)pForms.insertBranchForm
insert(self) (defined in pForms.insertBranchForm)pForms.insertBranchForm
summary (defined in pForms.insertBranchForm)pForms.insertBranchForm
summary(self, pl=None) (defined in pForms.insertBranchForm)pForms.insertBranchForm
+ + + + diff --git a/html/classpForms_1_1insertBranchForm.html b/html/classpForms_1_1insertBranchForm.html new file mode 100644 index 0000000..25c1796 --- /dev/null +++ b/html/classpForms_1_1insertBranchForm.html @@ -0,0 +1,247 @@ + + + + + + + +Quetzal: pForms.insertBranchForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertBranchForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertBranchForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertBranchForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
summary (self, pl=None)
 
insert (self)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

insert
 
summary
 
edit1
 
edit2
 
color
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert branches.
+Note: Elbow created within this dialog have a standard bending radius of
+3/4 x OD, corresponding to a 3D curve.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertBranchForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertBranchForm__coll__graph.map b/html/classpForms_1_1insertBranchForm__coll__graph.map new file mode 100644 index 0000000..f65115f --- /dev/null +++ b/html/classpForms_1_1insertBranchForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertBranchForm__coll__graph.md5 b/html/classpForms_1_1insertBranchForm__coll__graph.md5 new file mode 100644 index 0000000..cbf1204 --- /dev/null +++ b/html/classpForms_1_1insertBranchForm__coll__graph.md5 @@ -0,0 +1 @@ +c274cfa9a9bdae4ee51041ea2dd9f5e4 \ No newline at end of file diff --git a/html/classpForms_1_1insertBranchForm__coll__graph.png b/html/classpForms_1_1insertBranchForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..44e2ba348d67b159e19ada5de5dc5775694209f8 GIT binary patch literal 7349 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 yU + + + + + + diff --git a/html/classpForms_1_1insertBranchForm__inherit__graph.md5 b/html/classpForms_1_1insertBranchForm__inherit__graph.md5 new file mode 100644 index 0000000..cbf1204 --- /dev/null +++ b/html/classpForms_1_1insertBranchForm__inherit__graph.md5 @@ -0,0 +1 @@ +c274cfa9a9bdae4ee51041ea2dd9f5e4 \ No newline at end of file diff --git a/html/classpForms_1_1insertBranchForm__inherit__graph.png b/html/classpForms_1_1insertBranchForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..44e2ba348d67b159e19ada5de5dc5775694209f8 GIT binary patch literal 7349 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 yU + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertCapForm Member List
+
+
+ +

This is the complete list of members for pForms.insertCapForm, including all inherited members.

+ + + + + + + + + + + + +
__init__(self)pForms.insertCapForm
apply (defined in pForms.insertCapForm)pForms.insertCapForm
apply(self) (defined in pForms.insertCapForm)pForms.insertCapForm
btn2 (defined in pForms.insertCapForm)pForms.insertCapForm
btn3 (defined in pForms.insertCapForm)pForms.insertCapForm
insert (defined in pForms.insertCapForm)pForms.insertCapForm
insert(self) (defined in pForms.insertCapForm)pForms.insertCapForm
lastCap (defined in pForms.insertCapForm)pForms.insertCapForm
lastPipe (defined in pForms.insertCapForm)pForms.insertCapForm
reverse (defined in pForms.insertCapForm)pForms.insertCapForm
reverse(self) (defined in pForms.insertCapForm)pForms.insertCapForm
+ + + + diff --git a/html/classpForms_1_1insertCapForm.html b/html/classpForms_1_1insertCapForm.html new file mode 100644 index 0000000..2ce1c0c --- /dev/null +++ b/html/classpForms_1_1insertCapForm.html @@ -0,0 +1,259 @@ + + + + + + + +Quetzal: pForms.insertCapForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertCapForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertCapForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertCapForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
reverse (self)
 
insert (self)
 
apply (self)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

insert
 
btn2
 
reverse
 
btn3
 
apply
 
lastPipe
 
lastCap
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert caps.
+For position and orientation you can select
+  - one or more curved edges (axis and origin across the center)
+  - one or more vertexes
+  - nothing
+Available one button to reverse the orientation of the last or selected tubes.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertCapForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertCapForm__coll__graph.map b/html/classpForms_1_1insertCapForm__coll__graph.map new file mode 100644 index 0000000..32b240a --- /dev/null +++ b/html/classpForms_1_1insertCapForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertCapForm__coll__graph.md5 b/html/classpForms_1_1insertCapForm__coll__graph.md5 new file mode 100644 index 0000000..c10787a --- /dev/null +++ b/html/classpForms_1_1insertCapForm__coll__graph.md5 @@ -0,0 +1 @@ +39b5bb06efc57acfdb9c5ec9c7dfe355 \ No newline at end of file diff --git a/html/classpForms_1_1insertCapForm__coll__graph.png b/html/classpForms_1_1insertCapForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..91ef271450c15bba8b85761cb920ee3334135c15 GIT binary patch literal 7195 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertCapForm__inherit__graph.map b/html/classpForms_1_1insertCapForm__inherit__graph.map new file mode 100644 index 0000000..32b240a --- /dev/null +++ b/html/classpForms_1_1insertCapForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertCapForm__inherit__graph.md5 b/html/classpForms_1_1insertCapForm__inherit__graph.md5 new file mode 100644 index 0000000..c10787a --- /dev/null +++ b/html/classpForms_1_1insertCapForm__inherit__graph.md5 @@ -0,0 +1 @@ +39b5bb06efc57acfdb9c5ec9c7dfe355 \ No newline at end of file diff --git a/html/classpForms_1_1insertCapForm__inherit__graph.png b/html/classpForms_1_1insertCapForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..91ef271450c15bba8b85761cb920ee3334135c15 GIT binary patch literal 7195 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertElbowForm-members.html b/html/classpForms_1_1insertElbowForm-members.html new file mode 100644 index 0000000..e0a2747 --- /dev/null +++ b/html/classpForms_1_1insertElbowForm-members.html @@ -0,0 +1,111 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertElbowForm Member List
+
+ + + + + diff --git a/html/classpForms_1_1insertElbowForm.html b/html/classpForms_1_1insertElbowForm.html new file mode 100644 index 0000000..080a067 --- /dev/null +++ b/html/classpForms_1_1insertElbowForm.html @@ -0,0 +1,294 @@ + + + + + + + +Quetzal: pForms.insertElbowForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertElbowForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertElbowForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertElbowForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
insert (self)
 
trim (self)
 
rotatePort (self)
 
apply (self)
 
reverse (self)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

insert
 
edit1
 
edit2
 
btn2
 
trim
 
btn3
 
reverse
 
btn4
 
apply
 
screenDial
 
dial
 
lab
 
rotatePort
 
lastElbow
 
lastAngle
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert one elbow.
+For position and orientation you can select
+  - one vertex,
+  - one circular edge
+  - a pair of edges or pipes or beams
+  - one pipe at one of its ends
+  - nothing.
+In case one pipe is selected, its properties are applied to the elbow and
+the tube or tubes are trimmed or extended automatically.
+Also available one button to trim/extend one selected pipe to the selected
+edges, if necessary.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertElbowForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertElbowForm__coll__graph.map b/html/classpForms_1_1insertElbowForm__coll__graph.map new file mode 100644 index 0000000..74095a5 --- /dev/null +++ b/html/classpForms_1_1insertElbowForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertElbowForm__coll__graph.md5 b/html/classpForms_1_1insertElbowForm__coll__graph.md5 new file mode 100644 index 0000000..85353d5 --- /dev/null +++ b/html/classpForms_1_1insertElbowForm__coll__graph.md5 @@ -0,0 +1 @@ +9fd1c3a643604091f5772aa3dd7b381e \ No newline at end of file diff --git a/html/classpForms_1_1insertElbowForm__coll__graph.png b/html/classpForms_1_1insertElbowForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..287166a9d50d51aa8c5827b9a11c9afe2ec0764c GIT binary patch literal 7171 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertElbowForm__inherit__graph.map b/html/classpForms_1_1insertElbowForm__inherit__graph.map new file mode 100644 index 0000000..74095a5 --- /dev/null +++ b/html/classpForms_1_1insertElbowForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertElbowForm__inherit__graph.md5 b/html/classpForms_1_1insertElbowForm__inherit__graph.md5 new file mode 100644 index 0000000..85353d5 --- /dev/null +++ b/html/classpForms_1_1insertElbowForm__inherit__graph.md5 @@ -0,0 +1 @@ +9fd1c3a643604091f5772aa3dd7b381e \ No newline at end of file diff --git a/html/classpForms_1_1insertElbowForm__inherit__graph.png b/html/classpForms_1_1insertElbowForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..287166a9d50d51aa8c5827b9a11c9afe2ec0764c GIT binary patch literal 7171 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertFlangeForm-members.html b/html/classpForms_1_1insertFlangeForm-members.html new file mode 100644 index 0000000..cc2f9be --- /dev/null +++ b/html/classpForms_1_1insertFlangeForm-members.html @@ -0,0 +1,102 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertFlangeForm Member List
+
+ + + + + diff --git a/html/classpForms_1_1insertFlangeForm.html b/html/classpForms_1_1insertFlangeForm.html new file mode 100644 index 0000000..534247b --- /dev/null +++ b/html/classpForms_1_1insertFlangeForm.html @@ -0,0 +1,264 @@ + + + + + + + +Quetzal: pForms.insertFlangeForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertFlangeForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertFlangeForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertFlangeForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
reverse (self)
 
insert (self)
 
apply (self)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

insert
 
btn2
 
reverse
 
btn3
 
btn4
 
apply
 
lastFlange
 
offsetoption
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert flanges.
+For position and orientation you can select
+  - one or more circular edges,
+  - one or more vertexes,
+  - nothing.
+In case one pipe is selected, its properties are applied to the flange.
+Available one button to reverse the orientation of the last or selected
+flanges.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertFlangeForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertFlangeForm__coll__graph.map b/html/classpForms_1_1insertFlangeForm__coll__graph.map new file mode 100644 index 0000000..b728fb7 --- /dev/null +++ b/html/classpForms_1_1insertFlangeForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertFlangeForm__coll__graph.md5 b/html/classpForms_1_1insertFlangeForm__coll__graph.md5 new file mode 100644 index 0000000..7d1cb85 --- /dev/null +++ b/html/classpForms_1_1insertFlangeForm__coll__graph.md5 @@ -0,0 +1 @@ +04027c2f2788c31c9c11fc0fef80bb0c \ No newline at end of file diff --git a/html/classpForms_1_1insertFlangeForm__coll__graph.png b/html/classpForms_1_1insertFlangeForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..374605633c4f609c7deb9c69f94aa810e8aac149 GIT binary patch literal 7235 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 + + + + + + diff --git a/html/classpForms_1_1insertFlangeForm__inherit__graph.md5 b/html/classpForms_1_1insertFlangeForm__inherit__graph.md5 new file mode 100644 index 0000000..7d1cb85 --- /dev/null +++ b/html/classpForms_1_1insertFlangeForm__inherit__graph.md5 @@ -0,0 +1 @@ +04027c2f2788c31c9c11fc0fef80bb0c \ No newline at end of file diff --git a/html/classpForms_1_1insertFlangeForm__inherit__graph.png b/html/classpForms_1_1insertFlangeForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..374605633c4f609c7deb9c69f94aa810e8aac149 GIT binary patch literal 7235 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertPipeForm Member List
+
+ + + + + diff --git a/html/classpForms_1_1insertPipeForm.html b/html/classpForms_1_1insertPipeForm.html new file mode 100644 index 0000000..861d913 --- /dev/null +++ b/html/classpForms_1_1insertPipeForm.html @@ -0,0 +1,273 @@ + + + + + + + +Quetzal: pForms.insertPipeForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertPipeForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertPipeForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertPipeForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
reverse (self)
 
insert (self)
 
apply (self)
 
changeL (self)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

insert
 
edit1
 
btn2
 
reverse
 
btn3
 
apply
 
sli
 
changeL
 
lastPipe
 
H
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert tubes.
+For position and orientation you can select
+  - one or more straight edges (centerlines)
+  - one or more curved edges (axis and origin across the center)
+  - one or more vertexes
+  - nothing
+Default length = 200 mm.
+Available one button to reverse the orientation of the last or selected tubes.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertPipeForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertPipeForm__coll__graph.map b/html/classpForms_1_1insertPipeForm__coll__graph.map new file mode 100644 index 0000000..43cf470 --- /dev/null +++ b/html/classpForms_1_1insertPipeForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertPipeForm__coll__graph.md5 b/html/classpForms_1_1insertPipeForm__coll__graph.md5 new file mode 100644 index 0000000..c00eb5e --- /dev/null +++ b/html/classpForms_1_1insertPipeForm__coll__graph.md5 @@ -0,0 +1 @@ +5ba65b0ea0ec73d20ca4e17ee4d703ff \ No newline at end of file diff --git a/html/classpForms_1_1insertPipeForm__coll__graph.png b/html/classpForms_1_1insertPipeForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..1d84ff1114021ace7da27d4cfc96c653f0ab0970 GIT binary patch literal 6951 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 ZPiL+&YzHz3z$af2Wd#lSYFV?;{{y4sk1_xN literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertPipeForm__inherit__graph.map b/html/classpForms_1_1insertPipeForm__inherit__graph.map new file mode 100644 index 0000000..43cf470 --- /dev/null +++ b/html/classpForms_1_1insertPipeForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertPipeForm__inherit__graph.md5 b/html/classpForms_1_1insertPipeForm__inherit__graph.md5 new file mode 100644 index 0000000..c00eb5e --- /dev/null +++ b/html/classpForms_1_1insertPipeForm__inherit__graph.md5 @@ -0,0 +1 @@ +5ba65b0ea0ec73d20ca4e17ee4d703ff \ No newline at end of file diff --git a/html/classpForms_1_1insertPipeForm__inherit__graph.png b/html/classpForms_1_1insertPipeForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..1d84ff1114021ace7da27d4cfc96c653f0ab0970 GIT binary patch literal 6951 zcmd6shdW$R+wO;mE(oHBhzO!Z)aX5W7lcHa=)HHMcM{P>OY{=N5M}fl61|gAqK%#? zgTYzze%JL~=lu)LQTFU>Y%_bU^{o5;-Ot2mX(*8p(h))+5EA7V@;cyg4*WLa_dMR=LAX4Nw~P##{GY<;P#vPs zz_EGGhS|btG5uC8)1@VY8C~8AiB%)sle!B3F{%TJindqBsg6{zDM2k$m#I>A=0bf+ zBngf@4(o%F%cvo)7uZ;|6ubXKqudA3Rzd&JRvX#FYIh+tmhn&fz#%i%42eCQs#4_k zxX?v+X3Ss!T8Hio!z;;dzT?g+?1{Az8{KtV1~otFSx+VJ0qHQ*oiR@ofvVGp`_z=F z^7$JX8L@M533$?4saheiY5bR52WV1gqT-*%xDLF2=)N&5aQHq~szP^U@xo@Z)Z;i?2Sa*ir7V$sj!jTEl zDGRTtc+%C~{WJ*eGdn*Y`>(gRw{vQ0in80RD*DZ!@z}}E3^@%=^jd$C<#5K+=(spJ zWo3ek)4e$7_A7&&gTL!TTeGzf)3{$n`u^K^ARs`w(C8f1-Y!-5?OX48Xjqsi^ea}- zBYTC35=|v(X-MLI3Bt_X^M5l+Oo8D%rp?SkLic=qeQO#U@gUz@T4wx7_fs?_W#r{? zEG#Wu_ZLMWBbwBo3k%7psBS|HTYa96PfR>W8C>4pjXkBcCpUd?uHBj17YCV`PD2L(xLnq{j<4w%f=@`&~}`)r@!BF@WUf~V&a}C zrl9C!kM2BZ)-&rn)77SN?;k2z^hA?KCnfc7<^}UKjO2(?_@C}}{uxXeYYz@q%Ml?j zD=Qnd5#U}TRwD)T@u<;h2^)esKNqz5R$KcnJ3Ct>=|Njt8zdw&6x+wgN5JM_q9h4* zDR$5rR#(UGu+TtaZf;Jp5r{f`(BQNbTVF2_9vO)ZSzKJ?3qZMWnKo0Vrlz8h6m>`>4hS{I!%vup>RnPo99Yo96IJVlfMaYJin_D634kO*(XHX@O(Y8Q; z_+C>}(`?;aA~$z;?bojpFV7C>TdjtE{)_;V0j7;ZgNTSI%%Gw-fnHckTN|rLhXa>b z8t!Yfvog_ZFy7+r49aH}b+kq@KR!OL1zzFZEj*$5{=t;T=8lf02OVGa!E=X)E@b3Z zKeHm<4yCQY&wk6jeOvUqje&t7f65NLE04w#4i55#-Mu|+ef)n3C|i`#mfsUlY!KeIDL-Pyn(wGKQE6qFJfI?MGdYRo#Z!IeTbBO@b9 zpjOj(Ok+tUQIH1@9%xle;a={Hea35TZLM)ydhR-(C1^kT&05pP*S8aaVA|i`NBzsY zA%=`@d(3`!wN#D#mDN!aS7kF+sKCr3ucY)@w?w0+p`j0EKXVxO290e$U0Ei400!!^ zJ^si>fNrtbljz>Pdzd@i`1Prx@!-CM-!d3xSY93z8jW_@{Ka^@J%I=Im*3_~cFNgr z)}-L>Lwb7TCnqPROD4>3uCI~@q2Om0W>4Lh$QWnZ;Sm*kCZB!nkB8R;_$1|DZ6I>Gbgz1 z%dfACK-q9|a~Jua?Y}p!a`L!FBJF+*4}Ynw5VNZD}>Y5F{zE(dyJ@wd`u1eppfPH%I85?x5{g{Qt?{t?o zfkE^`VPRp`5?C|WfY;2mw~6jCb8!*NLyF?NUg>8G!mtim@-v!#noh5W_(#X@&sW|M$fnQ zEvS#$m#Nl*ZBZ;#NQvU=5}r)8G-o8;Fx3q=T8MR@#*x{K2S@zyMbxW+*8FFl>Xo(u z>eGrn{VDMwG-Qy_p*=EmQklI)-%2u!+#A;nKSbk3^lTI#n=P|}#fs~W(W`=PRtOAX zuMM7xSO4Nw%oRf$B{z+WIS&na3c04|4E^+pF*2)~6LUGenRU{cGH!PB1P+$*J2K1i ztc)WOsAEXJTs*{PN8_Qi2DYO5bz-HuKJ~LZQNzRPH<1p?9eB*_bOLwhVG}F2C_eUP zy_2)rz)_8#q_5e;$CeB#x?O9vmYgZp)lZgxV?Tw>B~2r_jw1?REjN7TGB7+lEH_Es zA;xS-lcNmzV;mpksb9OXnw~#qOqA-_yeFew&=K9kaf*m;8OKeGe?vEExX(I3c;#MgsZiCkQ=+am1Rdx0LSP z;f;%OA^V|jN;q-QvEbY;(XfxxR3Peqf_xMxS~-_{kXp@F9lEWnr4>?FSBE=65;;6K zXEYuP+?Vp+J>;ifGthYDc)7le9uaV&_91zxJ(ww!Ilr`YfOUx8ZKdn>VvG04);S(A zO~~FtW1}6(?q>gTLQ=yYV3h1UJdw=!TAZmao}LOb)g%WUj)*o!u;-#_c|__+pq?bnVETb zbR^^HDd@D+e7ngc5rN(i&JgqF!C5(9c$Y2gEaX~LENDN?g+{(?@0u*rO?X|r-@yIk ziJXSUouIQ8g!wi4e4NV8>rId}m(*eQ*EZ;2@2#6T^=mKWZH2_%U8>YHGTIL=r;2yR8!f^~1?j z!`0N(^zri(68%+-EUm2UnW}iXvcG=^4-fB4QIYv_$2%={N=OL6hP9RMsKc|fsDy-s z&XXLe;QQbUsI8)t6Hl|}4z7|?Kki;bL&JB!6Hak)@#WoJhnhBU5cmCy1H|Hmvhq8y znE-NR!yV7|m*O~diJyj)a$NAUwXk)_uV$&^BQqtMk*=6KZ#nyOHoR9e8ch_5*x#BW_Vdi1>)-H(F z`jp3-iMnNalMGVm!&{!av+vPYS7r7y)dBz(u%#m+BIM;i=H_Yu34iqF&6~fcr)vK8D+w6w~3fu}}c%?8yb$_54odiweb^6~`*1@(>#LbZXwa0F~dnf-RE8VBa) zGJpGSGIH|rQZKy8X)k-OqoXr0Hum1{1gVgln=4@6h2zR#T$QGnK&OzHm`F)Sr}9b6 zyO>eTi)OJ{Mn*=!?avE0PtT&DtBdzKWnX}QPunvI+EF&Ov`oBmhAZ5lH>K#SoX`KR zLoF@kB>ax^Wx{aBcIUpms&|ALa~l~Njv{WZy)RA|oCkY*Bg!i(dQT@O^}zlp>`!8% z7fb|eKuAc)0+ty$^OZ?dOl;x|5sdiLCRpqhxWLZN9vw-_qyg6QxR2gBS+*cwJzHoj zn*3p@W}f7q?QLZ&EG#_(11lE<&49}5 zRs*|2{)UTjziu@&*_dg+7CgVa)KypismiMf^-=m#QbGY~_Bmo97bI3U)z{ZQ-fuY= zPk$4{p-~~${&el|`1p(G&UDOLhPZE?NMal{?*|wR=5q+H9LtsPCw7|2&u2ygJfNbc zrXU|H(=B@G(s1C!~N4Cquz)>B|$+!%s^sd zVk|BJhT6{8+bSk}E-sG5zIDqMAmf*b?dWKB4vrWT6O%3A=BpP{7h4Z?%Jf!~YWsWR z7D~O0fhX$g>5-9-U7YL?grLGp#%wV2Q}6rFD(te4Y*5zg{O{WjgHSyqBMuGSimBC3 z&-EWv*wO%xEc|6;u(0y!g`HZD|H?sMgSjA{FNj6u)19}od;9bN1H&36sN9Ng~~srB_}gWN&-wDTz3NyvRV)3 zeH?xM?_@W%kCt#w^-YRI5Sm7%sP4CKeOOo+%HP(OFLFN4yAW571XDI(gJKHP*qihuerFnbrq?m z*I19-AI_Da2N5Jg*!h03W}Z{cb@R}SWVP5v^NbMpoJJoHNLsX%R8*aPeYgO@F_+CZ zI+H>`6zT?|{ysZ9E*QPWgppxG!wl^;c23SvW_-i;pg{O3*m5!zQ?W@WrYWB!1LsTU z-?U!ef;@ThM7JBw`s~ z$a}h03g6b=S!{A&Jy>5~2SP@4kJ~t0F6xdsqAd^%fWlexO^X)^EiLWIw2}8Y*j`X5 zG#_v`cR4A9lJK^jon01;_z=yksjS=y)cI&V{Y_VIuY$wQWEq8G()|SPR}E$W0s)3w zh0PNubOVUy&m;!EqX+;Dm6DSa4~QSW=HRrqv0U_K5Y#`PCsHq-N$UPk8h1Ak&>D+g z!rG;|Ia*g&*XWp-PB5bdQ+Bl;+d2Uk+a(|tM#14%s@!iX^7A1a92_7)efRyx=5_Ep z0gVm_xVbv>+wpR72`MUi)Zj1|3f|1*y9-vfkYi|GUf%EX1lsyJO15z#=$`VG}pz$L*B)uMth-w15`&R00|P{y-8Bn-(^|~TcM|X^URw~dbTi)7=rhR6W-`s2*@U3|t4f7N- z=m&y~32h)huK{MlAjIk3LKF(+gF>O0nVBIVEp{EP^{=e1hK7gZc+F4@Mxb zsE7^0Og`fJv=NA0C&oI@^JmvcNl_C}#ymVc35iB|U0t$zdV0{{lc|>p2(-;0cfhI1-p>$Y zF|XZxFx9ZquR!K677*9dbZ?cbYig2#pDTe0B$=Nd7kQlq6_%V04!k;<0cnv&$brV` zcWVro29W-E`7m$$LgZGs`i*yei8oIRwH4=Qv!AEoGfz z3`;IpE-_Ps7UmqRWO)^I(S1rAxGwCR(R_cJjJ&8_q^grUz^ZLEaV!9PS}w#->B}f$ z@`P{gP|%28wgXBAkv%-7m|Vg<=Ff zij+z|!|sRQf09YKG>YaqJ5ud$jF^h!W)kUjyz9Vx$oGRS5{M-4V)6J^M@hURR#YX) zC^_3*t*b6*1T*tJ`GBa|Vb_6SlK}BS94scHkhX)>mY}~9UB_zHR^cGMI7KZ7OY9Irk?%DTDK^I(ww#+AJB#uG6KYjuM1&oSM-dv`oL_nR;4rDk?0b9^o6 zGnxFl8UChURD~VVI9d=^_Qbd9V_KSQ$;6)0ryH|*V^($P5{*wlAK2G9Y3!-&V8(TA z=UM;hIR4id)mZRI@Av%rB&Kev_^rM-Yavv~J@{(2*7AjlO1ZE)PrBtqu{v9MsVfjp zq3sJ&29c1zf8EqRJ=f1M@TUK~n@AF2;FhaF_oGBTn+e7I|9Xvi!kMh{|^5)}Fc#kG(D zIFa@7%j0)Yz(H)v*+4>6o(it<(1*AY?kbbt^DbfgQgrR#DB z7S!5WxM>l{?BPN14LtybK9EvYR#x7T&+S`Lb5* zFB13!D=VvXftEnUv~j{7g(Z^zkN(~>cQb+0@)<*qhqV&Pc;Q4QQ@{_oD|5>2M#of*=!v^0EDQalJS zqAmau!0LSd{SuAdZgc*njT0=wGXy| zU>5^?6SM&fK(%cl+NA;l16{Yrixm53XaIeIIcDMIC58K)@Qb{$yzI$nR)dcWznjb9 z!5)!{JXu{EO6QGBI{Ad4AXiaUUD@5`(g4jYz?ibGuC*fSi2fD_2L~kg!<0cYd;2FE zy6lvt)z$ZyZvLjX_kfjn|KS7n+~#Y;98ald1H;9MPv zjABUcgVojXE!1(D#1=Of*J!P!l3E5I78sL|NP9t`g@bAFZ|jYYN?8Lvy~*X;urRsL zL-?T(5VSG)+TV`{$)DIh+#36AaI^R&JDc8WI0I|>yz}A`adTftNNCls2)QseMh?Qg zOncB({JtjHad2m0lQ0YM9)%2i2>V)xNi`5 zb#-N#@Q8~ufSv#debNdFx9{8+$6r1#Q?U01Z9$+$7|RD;QZjOn=Zqk50ku7epbR9X z<;MXWh5|2HFlKYO+<6Q11TpPD+{^mL#{Muo(jH0U^4h@h56yP)*gz|uVPqXh|>Atf}!&|rVcfgb9=jh~q9FD@Z*G-sVBQ>NEo?1-rm0)kG^BRvG+p!3(S zJMZ7WuX5XIDQk-&ro{#u7|dc}O$`|c&@>`0%wYLRPHE}rVgbitS|orwN%nc@D*ms# zV7(mQ07^4BG&Ho8egj&#fB?*YeB{tc?aA8Stk(pf8Eu1Za9p_is>K;h8FbgP2h$w0 za#t5}S`^Vu?|9vD`Ni|_$$$Gk003p@0P(;Jy&wCu_7tona{$STc60ypnbQ9ptW<7D ZPiL+&YzHz3z$af2Wd#lSYFV?;{{y4sk1_xN literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertPypeLineForm-members.html b/html/classpForms_1_1insertPypeLineForm-members.html new file mode 100644 index 0000000..4d9de94 --- /dev/null +++ b/html/classpForms_1_1insertPypeLineForm-members.html @@ -0,0 +1,114 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertPypeLineForm Member List
+
+
+ +

This is the complete list of members for pForms.insertPypeLineForm, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self)pForms.insertPypeLineForm
apply (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
apply(self) (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
btn2 (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
btn3 (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
btn4 (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
btn5 (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
btnX (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
changeColor (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
changeColor(self) (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
color (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
edit1 (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
getBase (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
getBase(self) (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
insert (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
insert(self) (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
lastPypeLine (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
partList (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
partList(self) (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
rd (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
redraw (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
redraw(self) (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
summary (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
summary(self, pl=None) (defined in pForms.insertPypeLineForm)pForms.insertPypeLineForm
+ + + + diff --git a/html/classpForms_1_1insertPypeLineForm.html b/html/classpForms_1_1insertPypeLineForm.html new file mode 100644 index 0000000..dd11c82 --- /dev/null +++ b/html/classpForms_1_1insertPypeLineForm.html @@ -0,0 +1,297 @@ + + + + + + + +Quetzal: pForms.insertPypeLineForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertPypeLineForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertPypeLineForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertPypeLineForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
summary (self, pl=None)
 
apply (self)
 
insert (self)
 
getBase (self)
 
redraw (self)
 
changeColor (self)
 
partList (self)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

insert
 
summary
 
edit1
 
btn4
 
redraw
 
btn2
 
partList
 
btn3
 
changeColor
 
btn5
 
getBase
 
btnX
 
apply
 
color
 
lastPypeLine
 
rd
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert pypelines.
+Note: Elbow created within this dialog have a standard bending radius of
+3/4 x OD, corresponding to a 3D curve. If you aim to have 5D curve or any
+other custom bending radius, you shall apply it in the "Insert Elbow"
+dialog or change it manually.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertPypeLineForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertPypeLineForm__coll__graph.map b/html/classpForms_1_1insertPypeLineForm__coll__graph.map new file mode 100644 index 0000000..a166d1c --- /dev/null +++ b/html/classpForms_1_1insertPypeLineForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertPypeLineForm__coll__graph.md5 b/html/classpForms_1_1insertPypeLineForm__coll__graph.md5 new file mode 100644 index 0000000..6dea32a --- /dev/null +++ b/html/classpForms_1_1insertPypeLineForm__coll__graph.md5 @@ -0,0 +1 @@ +7522d441dc6bc5fed9c43d10d5e9acbd \ No newline at end of file diff --git a/html/classpForms_1_1insertPypeLineForm__coll__graph.png b/html/classpForms_1_1insertPypeLineForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2d992cc685c3e2421bc61d7918305112d8863af9 GIT binary patch literal 7228 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 + + + + + + diff --git a/html/classpForms_1_1insertPypeLineForm__inherit__graph.md5 b/html/classpForms_1_1insertPypeLineForm__inherit__graph.md5 new file mode 100644 index 0000000..6dea32a --- /dev/null +++ b/html/classpForms_1_1insertPypeLineForm__inherit__graph.md5 @@ -0,0 +1 @@ +7522d441dc6bc5fed9c43d10d5e9acbd \ No newline at end of file diff --git a/html/classpForms_1_1insertPypeLineForm__inherit__graph.png b/html/classpForms_1_1insertPypeLineForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2d992cc685c3e2421bc61d7918305112d8863af9 GIT binary patch literal 7228 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertReductForm Member List
+
+ + + + + diff --git a/html/classpForms_1_1insertReductForm.html b/html/classpForms_1_1insertReductForm.html new file mode 100644 index 0000000..7add89b --- /dev/null +++ b/html/classpForms_1_1insertReductForm.html @@ -0,0 +1,283 @@ + + + + + + + +Quetzal: pForms.insertReductForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertReductForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertReductForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertReductForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
applyProp (self)
 
fillOD2 (self)
 
reverse (self)
 
insert (self)
 
changeRating2 (self, item)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

changeRating2
 
fillOD2
 
OD2list
 
btn2
 
btn3
 
insert
 
reverse
 
applyProp
 
cb1
 
lastReduct
 
PRating
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert concentric reductions.
+For position and orientation you can select
+  - two pipes parallel (possibly co-linear)
+  - one pipe at one of its ends
+  - one pipe
+  - one circular edge
+  - one straight edge
+  - one vertex
+  - nothing (created at origin)
+In case one pipe is selected, its properties are applied to the reduction.
+Available one button to reverse the orientation of the last or selected
+reductions.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertReductForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertReductForm__coll__graph.map b/html/classpForms_1_1insertReductForm__coll__graph.map new file mode 100644 index 0000000..72bde2e --- /dev/null +++ b/html/classpForms_1_1insertReductForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertReductForm__coll__graph.md5 b/html/classpForms_1_1insertReductForm__coll__graph.md5 new file mode 100644 index 0000000..2430a2f --- /dev/null +++ b/html/classpForms_1_1insertReductForm__coll__graph.md5 @@ -0,0 +1 @@ +80831c5d6254f95ea6cc0942c0fdc30f \ No newline at end of file diff --git a/html/classpForms_1_1insertReductForm__coll__graph.png b/html/classpForms_1_1insertReductForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7825f3a0c662d0e1f6dca2728fd76a8c225fbbd7 GIT binary patch literal 7397 zcmd6MgFz!A z?f2}nyZ^v03^ViG%RTp;^NTlbn1-4n0Uiw=1VIE!&*fi%&k67c$HfNk8Pb>Uzz4R; z3q^V87WJFikQWC*bjeEcGMXN#+cREoHC=CT_D-p(sElgDiO~a`Ub#vd@k`No<5iN51&p{fYGnBe61{S~_F>SOpiX6T!;1&^t+v)Qs%urNQ7I9Me1 z?-C{aV&vyx3_-iBPY+r1-#vXNIp^G$;+#YcQJF^aBEefyxX~s$>}OFC2N5&PhfPr! zev*ot=h6D0XKqOjE1!@nnglrs0VU=F{_C+pJ>o$^=$@*+qIw&XO~?9Rj;g+FjQhpW z`}l-}6htKb3yV#3Dz5>@PO3PnkVxJz$4+|2UzYs}3JSpm-A1SLvByUD33|isu{s=Y zYTbEalGdzFS@+i5{LyHsVN89!xRn6SU1~l|B_$;)0jpTy-T*9ohokkExB*a*ESivz z&|L;eI!8yxvZ^Zbyca4epHfm%*n*o8#2H~>XI_j(olFrMEi!UtgNsZ5hNMsnw7+F zX|g_$HQwYaWmZww)Wo8a2)VnvKYaKwv$B%xwGFvfMwudD=78hD_QkdR<+F)`at*O1^4()lsshK7f? z;B(hAp4e3B*5BS-3Og<1ii?ZK#>V=M8T#I@bKj-dGCPgwH`8A}Sm{QcHSpSg%4?)* z;Ct;lJUnc4dvlGwme6JPw#I=enn5bMJAoU+$~)$%`5&_H-@nfn!)IlUj2P2BSE-j* zsC`(6z&4aykFZBFNYSfHT?@Q=^=fa@rZnstZ1(dPFIp?#5AChz#F!i`cXf7k`77jX z{If8E?IjgOyhFI$f#!F2=YFaeXl5HW`78g!O)l(A*Z&Uw{#U;CZ?tsP<}~?0$8Em@tZeqS_cQqd(Abqwb7xXqN1adg!p*I zr%%ZrJ$j^3pjqR#o!snI{pAa3ry1YX3A~AXs-?9xYsA`dp#^JrWJD%QBNPo|z(jY{ z^~|X};%Zf>$-lUmv+;a2Mccc!wiXOQ#cLv;(k<+<$7pM7t4nvLs>x0sOvFIQEbHXN z_l-j*ATJ$;cYJ&dOIVqohl;iFzbZef*3!}n^9I>qWo7j{P0YRRW^>az2l+=dSZ?$g z2Pfw~lGfg6qQboM&mYn$ZiD*J@82J`b#%aMrt8KM41L1LpJ*F32Vj*|R@#pEo*$TN zYH1k{Wl0Is^kG1=Ai^}_CMOhpCXU0T7r)>XQ@M^3eL z@87=%5mJP~L}_SgvxYXxyf59reuJ0oY(4coR<*X(-W12n6T45r!RSy=?|GTg%=~0(DqK-~>f`lb<@|kaNuCI3)Dy!`k2J5~dtRU0O4l*aS7m>@_KP3A zP$F^3EeWfN+3kXb#gly@;UUNLo4s7sc3kIwHlDBQ@>GNe4WFq}FdEr?Kui1n>W{jA^2Gvd9EaEdn3NV(A=lJpShnxT-w2wQge2xB-e zrO@R5Z>Fv0FDGC4{dgG@sZ*arJyoIGjX&QiI(EW%(y&-${dC0aed6wXdOxE{x`heG zRru7Upu!^kJ2WY2Sp6V?>hh__{*&w^!@-BI$C@KMEcuWRkxZs4CUpOQd?~(px!D|u z!+IxRFNiJNcw4OCekhuS&^%+liay?ueaBLalw`SQU~Lv#$X#k?Z;_(bot>{YEF}RO z&MSY&0U}gd3sLb=Qc^16oBWe`ZD3FWPuuPKUqDP1m-vvW4pa-KjP$c-K}xGa%WYxz zYGB7d2Zy9i#!b(bqSLz{f{&dS+&SK#qu7LVc(j3)0im1HjPS*QfTAbn2b&Jyup$Ol)j7J%ZCM zf7}TG<{Fxsn1+Ui`6JdSP+47F^*A1R!|T5D4!30{0b{IK&vH>&^@)fGHFwh$pG8li z@sW5h+)h=Mpf6n_0zT(Md$`u0P@;jcWlu^&6RuUL?b>}&Cz}vdl$C|n-rl~qw>L0V zI%56u)hl!v;`y~T9B1c4uC&|Qwe;5Hr#5XF{Cs>o@BcnT!DrW(N6?M|7oxVdxwn@9 z+G{0}ng=~Bw##hq;28JnJ--oe2^`ojkbMPoF-ycud`F8Q!)WZ4B{#m=*?IISVXDE`-pI_c}{1gqVs77Y8TA ztpg2`|Md6ot7(KQejpA}uxu7j%}w+_BJZjEqN2O$>FFBmUxl4l?}CuDFD{G6N`w6y$0Opcy}%%S0zan%CE0a4Gl$gV&B`F<+U|M zNlD4&r6oC5wbb>B^9K(eZ1nryI2R(maT}_Qj*bow3`on%gMljn+L!x+y9rniKc*3J zdRSXiGmyw@`uxYMu3Sp=HQ5= zhpjVBR=$sGwxb~yv@*4NjsFN83#fMWU6(_`yCNAtR_(T)t<{^iS;%NrX?G2#cfT`Nwyb#9yz z*GEGFw&OftZ?Zu&Ua6`^HG7*r2h_#f+}v*WAhuw{`rzawccnYw9?45n(+8?)qFUlL z!`4p;=!9cuJ(dU@)880)1_7dzUtYf7xW>v?{{Rez3#EyBehJkL$*m0z#)d71v971N z&yq|ftK0Vog9%z4Z;mVq=c=Z#L@zCO#hHPT=|2(>5X67`X5mnWjfFLsDHE7qQSl`- zl#oGE1=NzJrsl(wkWZgNaRPa#Ha;uTXZ5BCMO>#%R5x86;G<=hHr*rx^zQ2Jj`%w? z)PBiS~}ZXdCg!DEaLmKtV=q^CUn zkds>-8jAa~uoS0uA+0xWBCg+*ykmk~K*n6AXLLGr_N9u*L63!m5<-tc{(<^)`8Ups%F(v1wB;$Q?l;wN1#Ncv%u;K={(a<0+epg%ZOwYqZ*n6)T z$K*DI!RPS_^{=!Yf~4}P>J7%Z1}~v!^764UF)<#oC2z|Ed~Pr2K)5_TMRas^!>8&R z98)E{zCi=C4PJVmI{W&f8!van9ItnFc2J4EzqPl}sxacSD`;)4*W}Z1cKG>$V(0X9 zssK&YxS%QWZnBhbV|v41K{=+nU9So~_y@o`D{G?N92|(7N=r(D0S&OVvuhVrR8%Z4 zZEU=0T($28dIb#vWedAp>q!da)T{p8-%q6cgLJIakTSu$^kfq-oIu$uzaKw-%sPVJ zfP;mFg(B*J?rDHIdmgSDul6KiZ`n)w4)ynTOkd6B@=tY*d!l9zQUP=&W^r-4!`0rv zuV2X_MqXYLz<{19Dc!lb-t}!A8>3uUSWt+{$<9U(V4RxDwxh*X$Moq3yw;Byu4-XIJx?@PcmuV&}w z7(~+u&(F_I^b8E>dwP2pwzjIq^6y z$`gN{U7_ZW&JCeg1!{`Lr}S09{LW5v5I&{J?rg(2!u1JIbnP8OsH;HZiEtInFf7*2 zDJvrejcrHM8)8i89vmMZ&+_!E!|`-;6Fk|T3UQzH#3?B$F)^HL^d_ODjTj!*v>h)) z1CpoMnqMFq5NW_*i}c`xpi3>jQBc4Jw7!Yt1fyQeoi}07CvXHNqS^6_{03 zRd1_plg4)!7X#YbnrfY$MFrOhAhMaIrCiS7{9=2= zc!fDWmtkXMPmfB2tC+Cx@4tUZ3knLTBtHtPr3(93*^IT!%^B_xRI09+es2$g7m&uj)^HLOXq7D_9OOIbQBa6Z!4`x zP)d>GZ5afxP8g7E$?K!nWE2$D=b!q=m$F%T>flUFOvd?)xc3?w8lnuI1F5^YxmjjE zCz-Fw&SBU{2jp0ys4F`e9u|+`TBnU@x%DvcsW?QbwuL{k{5Plb#`_( z4Epe?c*m{eEYoLG;+qjv0UVB4kV+#$|ueIS-qy}Vn1szoCZh{b-%%cAWN zhBVJl{X5n$ssXd1T-D|6?U@2|Q2B#Wx99yOk6$>gtgM(B8_S4@h!kJIhJ<$#%!nk% zZ$Iw0Q+D?EcK}Z#EP|4o`OzaRHa50gt{1PsKcZB4Kwu!SAdEMiU=Im(D3zZ-mzI+Y z^qAWRi(+PB$$i}oI~r8f6E|8f&@Ot51~%Mw2BBr|Yfl{#fA=OTW-v!FC6f*bD;>&H z&jIK(GIuuLANPL=8t3C`l%O%++b}tViMehMS0uE{&Vy>4*KFLqK!vFTPpEXIyU@qu14Wz>@MmgZ^!$8zfNUsd(<+_1_7R4QL@n zlmjFz_c9yvbhvPzLnKm6I}5^Q67Q7px-ilD@%a|ZdHeXvJ2a>E&gXb^B&B)v4Z&ohC;C&^};qKW%wPM=XG-2Wy5{%gzq zKR8l#>PvU5tfuCpl{XaR?#f%_jaVO1?+U;1CY8EgOD?cEe>z#?xYQQiH&k$2SunKG z!pX^*@vFLer{~{4pXCzB@3Vu8fa{|sc0lXczy5rE=yowTp{u9Y3TpM&FaFU&AXwZ) z%|5Cl6WfH%B9$WL{_~|swIlj|>)#(QRP_}~kxW~dQ3`>}%VyIxj;+H#$_z4xfCV|3 zadX6KRW(Ur$IHtLoH@Ri&w>H}D>7`FHQQ=(ULyoZ8wf0$O!W*&6R$%%D?2*^A|fJ{ zL>{!+*;$sKN4}8-wMyzUyJ;h)ve?isi(Xj=hq8k1^^xT2Eae}vz&9B!(T@OvMTS`P zxH0gn+mbxQ{tij}QxTP%|tF#`jUp5B!9F|c0iuMWCBF1O(ei;K*o zJitc;5Viz3+4@|Q6u?0=OUpI41pSvU{f~}ZuFjTXc=-9{ov+5HU4%7{FqRr|e&qBk4p)=X`G^fH!DlZ$Gz#fc}Gt0MP$*cP{{lmkGoU>#lcP z!lvLhh>VfCq2imE5sTVwx}{G_N_t!G!3$;9*VBo){re40;yOD!N8T5sFhxc-1K6D` zo*=ty5Odi|;^5{c0#vlf;h$_|6%iL;LWiYXY!`^6%c!DJv_-CMSpg z{w*ymEX)XQ2M`ZszQ!v*0=mKx7^j5WksvUOD+z|EX$acSMgnJ$nT@TW*L<$l8E3cQ zlpba7#l}Kax>11f83B9-a6cp_DVJc-TcF8KC*p+J*Vku~IHfnXJq6z%RAgXcXUEG? zh?3ROp?>xHb-Q169uSA9k$|sM?y+w|Ov1;{|MK7T}F@x6Qt+9p8O+4rf1Wr%owi$;ZGcyy?*49Q@j+iojaJUfjg9iX@M@&pR zkjR#aiQ171y4%Z>9AKf7k&_!QcYcQaj9Y_c3N#mie-<1Vh_UP>0$u>|!3z)!QSrv{ z@wfXB4InmdJJWX{JFYr#4`3gHs)8UOjoXmOMIf|oN%*{%hVsq@U0ht+3~vr7_lt&R z5x|%P2@=!U`5f|VYLZfjq6rEJK+i!MYG?o-3?wRdiSys@O3)7WbYimq&dlyimY&?` zN7M0%iDtm4fFWzrd8D8622>K5e7i(YLgd)MYi-5rlgPMgjT zv-NE0UDh@>j%$7Q_l2UFqNAhp^YbB+Fxo3%lPfT|AW1RN)W!EP(>)gNfKmjE0wYDx zu4TH``H{X`hNSoW!UEIm&~)Jj>H6$S6}&No9)=5=MeF5mQw$IzExo!EEkMonKn2`2Iaxrd~%YRl@-UjiUug4vy&5f#Kn!M^$1mQBee|eQ6P( zq#p3|zy4?~==N`%tC$n$Bd?Qx&FKITN@CFA59h{wQob>?#_gMM*rp#_i z5JgS_o#x!>!j$<9y2?JF+`vo0FfcIi_*dTH08BPVj?%^pb}$`(KwaOyeQN|FU-s+Q zmPW5?l?!S`X|Vm}9|;DNJL~Ib?-V6Bzoe!{0$Gzc(=CUDW&io3jB?Uw1#Q8u?ew1b-DA_9_%oIN6AdGkiiU_JD|PJ(Pe1dXWFo)@=B;hJbZW9|<=qnA|L;RV g)RVz~XnVJBU_a?LaFAx;xh16ZOijK-)+peA0FktWRR910 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertReductForm__inherit__graph.map b/html/classpForms_1_1insertReductForm__inherit__graph.map new file mode 100644 index 0000000..72bde2e --- /dev/null +++ b/html/classpForms_1_1insertReductForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertReductForm__inherit__graph.md5 b/html/classpForms_1_1insertReductForm__inherit__graph.md5 new file mode 100644 index 0000000..2430a2f --- /dev/null +++ b/html/classpForms_1_1insertReductForm__inherit__graph.md5 @@ -0,0 +1 @@ +80831c5d6254f95ea6cc0942c0fdc30f \ No newline at end of file diff --git a/html/classpForms_1_1insertReductForm__inherit__graph.png b/html/classpForms_1_1insertReductForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7825f3a0c662d0e1f6dca2728fd76a8c225fbbd7 GIT binary patch literal 7397 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertRouteForm-members.html b/html/classpForms_1_1insertRouteForm-members.html new file mode 100644 index 0000000..8f91e22 --- /dev/null +++ b/html/classpForms_1_1insertRouteForm-members.html @@ -0,0 +1,102 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertRouteForm Member List
+
+
+ +

This is the complete list of members for pForms.insertRouteForm, including all inherited members.

+ + + + + + + + + + + + + +
__init__(self) (defined in pForms.insertRouteForm)pForms.insertRouteForm
accept(self, ang=None) (defined in pForms.insertRouteForm)pForms.insertRouteForm
changeOffset(self) (defined in pForms.insertRouteForm)pForms.insertRouteForm
edge (defined in pForms.insertRouteForm)pForms.insertRouteForm
getPrincipalAx(self, ax) (defined in pForms.insertRouteForm)pForms.insertRouteForm
L (defined in pForms.insertRouteForm)pForms.insertRouteForm
mouseActionB1 (defined in pForms.insertRouteForm)pForms.insertRouteForm
mouseActionB1(self, CtrlAltShift=[False, False, False]) (defined in pForms.insertRouteForm)pForms.insertRouteForm
normal (defined in pForms.insertRouteForm)pForms.insertRouteForm
obj (defined in pForms.insertRouteForm)pForms.insertRouteForm
selectAction (defined in pForms.insertRouteForm)pForms.insertRouteForm
selectAction(self) (defined in pForms.insertRouteForm)pForms.insertRouteForm
+ + + + diff --git a/html/classpForms_1_1insertRouteForm.html b/html/classpForms_1_1insertRouteForm.html new file mode 100644 index 0000000..4a8a9af --- /dev/null +++ b/html/classpForms_1_1insertRouteForm.html @@ -0,0 +1,297 @@ + + + + + + + +Quetzal: pForms.insertRouteForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertRouteForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertRouteForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertRouteForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
changeOffset (self)
 
getPrincipalAx (self, ax)
 
 accept (self, ang=None)
 
 selectAction (self)
 
 mouseActionB1 (self, CtrlAltShift=[False, False, False])
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
reject (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

normal
 
L
 
obj
 
edge
 
selectAction
 
mouseActionB1
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Detailed Description

+
Dialog for makeRoute().
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertRouteForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pForms.insertRouteForm.accept ( self,
 ang = None 
)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ mouseActionB1()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pForms.insertRouteForm.mouseActionB1 ( self,
 CtrlAltShift = [False, False, False] 
)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
pForms.insertRouteForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertRouteForm__coll__graph.map b/html/classpForms_1_1insertRouteForm__coll__graph.map new file mode 100644 index 0000000..c0d0393 --- /dev/null +++ b/html/classpForms_1_1insertRouteForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertRouteForm__coll__graph.md5 b/html/classpForms_1_1insertRouteForm__coll__graph.md5 new file mode 100644 index 0000000..6b2bb50 --- /dev/null +++ b/html/classpForms_1_1insertRouteForm__coll__graph.md5 @@ -0,0 +1 @@ +5435000ced6cf99c2567f6543e2a1779 \ No newline at end of file diff --git a/html/classpForms_1_1insertRouteForm__coll__graph.png b/html/classpForms_1_1insertRouteForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f8646d4a56a7dc6e0cd0c93804d31ea3b0e5ffe0 GIT binary patch literal 6489 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertRouteForm__inherit__graph.map b/html/classpForms_1_1insertRouteForm__inherit__graph.map new file mode 100644 index 0000000..c0d0393 --- /dev/null +++ b/html/classpForms_1_1insertRouteForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertRouteForm__inherit__graph.md5 b/html/classpForms_1_1insertRouteForm__inherit__graph.md5 new file mode 100644 index 0000000..6b2bb50 --- /dev/null +++ b/html/classpForms_1_1insertRouteForm__inherit__graph.md5 @@ -0,0 +1 @@ +5435000ced6cf99c2567f6543e2a1779 \ No newline at end of file diff --git a/html/classpForms_1_1insertRouteForm__inherit__graph.png b/html/classpForms_1_1insertRouteForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f8646d4a56a7dc6e0cd0c93804d31ea3b0e5ffe0 GIT binary patch literal 6489 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertTankForm-members.html b/html/classpForms_1_1insertTankForm-members.html new file mode 100644 index 0000000..4c8205e --- /dev/null +++ b/html/classpForms_1_1insertTankForm-members.html @@ -0,0 +1,99 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertTankForm Member List
+
+
+ +

This is the complete list of members for pForms.insertTankForm, including all inherited members.

+ + + + + + + + + + +
__init__(self) (defined in pForms.insertTankForm)pForms.insertTankForm
accept(self) (defined in pForms.insertTankForm)pForms.insertTankForm
addNozzle (defined in pForms.insertTankForm)pForms.insertTankForm
addNozzle(self) (defined in pForms.insertTankForm)pForms.insertTankForm
combine (defined in pForms.insertTankForm)pForms.insertTankForm
combine(self) (defined in pForms.insertTankForm)pForms.insertTankForm
flangeRatings (defined in pForms.insertTankForm)pForms.insertTankForm
nozzles (defined in pForms.insertTankForm)pForms.insertTankForm
pipeRatings (defined in pForms.insertTankForm)pForms.insertTankForm
+ + + + diff --git a/html/classpForms_1_1insertTankForm.html b/html/classpForms_1_1insertTankForm.html new file mode 100644 index 0000000..04482dd --- /dev/null +++ b/html/classpForms_1_1insertTankForm.html @@ -0,0 +1,237 @@ + + + + + + + +Quetzal: pForms.insertTankForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertTankForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertTankForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertTankForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 accept (self)
 
addNozzle (self)
 
combine (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
selectAction (self)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
reject (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

nozzles
 
pipeRatings
 
flangeRatings
 
addNozzle
 
combine
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
selectAction
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertTankForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
pForms.insertTankForm.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertTankForm__coll__graph.map b/html/classpForms_1_1insertTankForm__coll__graph.map new file mode 100644 index 0000000..52edd65 --- /dev/null +++ b/html/classpForms_1_1insertTankForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertTankForm__coll__graph.md5 b/html/classpForms_1_1insertTankForm__coll__graph.md5 new file mode 100644 index 0000000..ac7abca --- /dev/null +++ b/html/classpForms_1_1insertTankForm__coll__graph.md5 @@ -0,0 +1 @@ +93b3c960221dc763b919af5b74cfec8b \ No newline at end of file diff --git a/html/classpForms_1_1insertTankForm__coll__graph.png b/html/classpForms_1_1insertTankForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2890cdf2aaef928bf9059ee95349075d33f2a855 GIT binary patch literal 6523 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 PngXdRK2a!rU>5LS9Lq~b literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertTankForm__inherit__graph.map b/html/classpForms_1_1insertTankForm__inherit__graph.map new file mode 100644 index 0000000..52edd65 --- /dev/null +++ b/html/classpForms_1_1insertTankForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertTankForm__inherit__graph.md5 b/html/classpForms_1_1insertTankForm__inherit__graph.md5 new file mode 100644 index 0000000..ac7abca --- /dev/null +++ b/html/classpForms_1_1insertTankForm__inherit__graph.md5 @@ -0,0 +1 @@ +93b3c960221dc763b919af5b74cfec8b \ No newline at end of file diff --git a/html/classpForms_1_1insertTankForm__inherit__graph.png b/html/classpForms_1_1insertTankForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2890cdf2aaef928bf9059ee95349075d33f2a855 GIT binary patch literal 6523 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 PngXdRK2a!rU>5LS9Lq~b literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertUboltForm-members.html b/html/classpForms_1_1insertUboltForm-members.html new file mode 100644 index 0000000..3e2ff3f --- /dev/null +++ b/html/classpForms_1_1insertUboltForm-members.html @@ -0,0 +1,103 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertUboltForm Member List
+
+ + + + + diff --git a/html/classpForms_1_1insertUboltForm.html b/html/classpForms_1_1insertUboltForm.html new file mode 100644 index 0000000..0e33ee8 --- /dev/null +++ b/html/classpForms_1_1insertUboltForm.html @@ -0,0 +1,265 @@ + + + + + + + +Quetzal: pForms.insertUboltForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertUboltForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertUboltForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertUboltForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
getReference (self)
 
insert (self)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

lab1
 
insert
 
btn2
 
getReference
 
cb1
 
cb2
 
cb3
 
checkb
 
refNorm
 
PRating
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert U-bolts.
+For position and orientation you can select
+  - one or more circular edges,
+  - nothing.
+In case one pipe is selected, its properties are applied to the U-bolt.
+Available one button to reverse the orientation of the last or selected tubes.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertUboltForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertUboltForm__coll__graph.map b/html/classpForms_1_1insertUboltForm__coll__graph.map new file mode 100644 index 0000000..298d361 --- /dev/null +++ b/html/classpForms_1_1insertUboltForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertUboltForm__coll__graph.md5 b/html/classpForms_1_1insertUboltForm__coll__graph.md5 new file mode 100644 index 0000000..ced008f --- /dev/null +++ b/html/classpForms_1_1insertUboltForm__coll__graph.md5 @@ -0,0 +1 @@ +2ba462d52c916829b601222aff24e78c \ No newline at end of file diff --git a/html/classpForms_1_1insertUboltForm__coll__graph.png b/html/classpForms_1_1insertUboltForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..ee46eb1246bade2a384fe23afd1ff38b704097e6 GIT binary patch literal 7067 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 NP*c8(EK)S{|3ADphV1|V literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertUboltForm__inherit__graph.map b/html/classpForms_1_1insertUboltForm__inherit__graph.map new file mode 100644 index 0000000..298d361 --- /dev/null +++ b/html/classpForms_1_1insertUboltForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertUboltForm__inherit__graph.md5 b/html/classpForms_1_1insertUboltForm__inherit__graph.md5 new file mode 100644 index 0000000..ced008f --- /dev/null +++ b/html/classpForms_1_1insertUboltForm__inherit__graph.md5 @@ -0,0 +1 @@ +2ba462d52c916829b601222aff24e78c \ No newline at end of file diff --git a/html/classpForms_1_1insertUboltForm__inherit__graph.png b/html/classpForms_1_1insertUboltForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..ee46eb1246bade2a384fe23afd1ff38b704097e6 GIT binary patch literal 7067 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 NP*c8(EK)S{|3ADphV1|V literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1insertValveForm-members.html b/html/classpForms_1_1insertValveForm-members.html new file mode 100644 index 0000000..46702aa --- /dev/null +++ b/html/classpForms_1_1insertValveForm-members.html @@ -0,0 +1,104 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.insertValveForm Member List
+
+ + + + + diff --git a/html/classpForms_1_1insertValveForm.html b/html/classpForms_1_1insertValveForm.html new file mode 100644 index 0000000..4cc02cd --- /dev/null +++ b/html/classpForms_1_1insertValveForm.html @@ -0,0 +1,270 @@ + + + + + + + +Quetzal: pForms.insertValveForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.insertValveForm Class Reference
+
+
+
+Inheritance diagram for pForms.insertValveForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.insertValveForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
reverse (self)
 
insert (self)
 
apply (self)
 
- Public Member Functions inherited from dodoDialogs.protoPypeForm
setCurrentPL (self, PLName=None)
 
fillSizes (self)
 
changeRating (self, item)
 
findDN (self, DN)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

PType
 
PRating
 
insert
 
btn2
 
reverse
 
btn3
 
apply
 
sli
 
cb1
 
lastValve
 
- Public Attributes inherited from dodoDialogs.protoPypeForm
mw
 
PType
 
PRating
 
mainHL
 
firstCol
 
currentRatingLab
 
sizeList
 
pipeDictList
 
fileList
 
PRatingsList
 
secondCol
 
combo
 
combostandart
 
setCurrentPL
 
ratingList
 
changeRating
 
btn1
 
+

Detailed Description

+
Dialog to insert Valves.
+For position and orientation you can select
+  - one or more straight edges (centerlines)
+  - one or more curved edges (axis and origin across the center)
+  - one or more vertexes
+  - nothing
+Default valve = DN50 ball valve.
+Available one button to reverse the orientation of the last or selected valves.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.insertValveForm.__init__ ( self)
+
+
__init__(self,winTitle='Title', PType='Pipe', PRating='SCH-STD')
+  winTitle: the window's title
+  PType: the pipeFeature type
+  PRating: the pipeFeature pressure rating class
+It lookups in the directory ./tablez the file PType+"_"+PRating+".csv",
+imports it's content in a list of dictionaries -> .pipeDictList and
+shows a summary in the QListWidget -> .sizeList
+Also create a property -> PRatingsList with the list of available PRatings for the
+selected PType.
+
+

Reimplemented from dodoDialogs.protoPypeForm.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1insertValveForm__coll__graph.map b/html/classpForms_1_1insertValveForm__coll__graph.map new file mode 100644 index 0000000..93aecbd --- /dev/null +++ b/html/classpForms_1_1insertValveForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1insertValveForm__coll__graph.md5 b/html/classpForms_1_1insertValveForm__coll__graph.md5 new file mode 100644 index 0000000..7057829 --- /dev/null +++ b/html/classpForms_1_1insertValveForm__coll__graph.md5 @@ -0,0 +1 @@ +9813a25ff6730815f5787013b8859fc5 \ No newline at end of file diff --git a/html/classpForms_1_1insertValveForm__coll__graph.png b/html/classpForms_1_1insertValveForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..34a020f2ab23e2d67002b2f53ce3f612ece121b7 GIT binary patch literal 7299 zcmd6Mhd-6^+y7By@3OawNcKopMj3^WnY}k5vLhqA?Cg-e_Z|^4O4hMA*<@xu*ZIDF zzvuP){RPisoO8QzkL$j!_xgNLR(y(&LxqDtAn@g6rB&d49KLI?Zoq4r#Mvu&yJ4j8 zR2p%G`b=-iiAEr3gyf_jtGOj_O?#=Sxm;rI9@Cl`ERDZlB$B?Vd|Tq9#IIjAw{UU! z=`%ZGY^tVzADUE85dS=lS}WeNtN--xm)75!47u#AJoYG@;)krk!6sq|F~4Au4|sj6 z$3eZiQIr&>#pIj&!a+_6JI6CSp3TQIf=)XrXo&9=#$nv>@|t+*L3*bA^XD$iUmWT- z{@lNbBQqFG%*?Y~oXM>6Ls#OdjP$%8gXbMr+7t}pEp#rqZDC<10xjw%VHAw6*t9c= zyynU(Don1Fv~iN#*C;%GJ9bk0hi8dA7;oOZS$OT}=;+|+_|cfEFYF|?FUj^@RObZJO4rfQU zcr-#pvtGw3wXYNv3F=*UBC-|YjV{msVd3L=hD*B3<3gV z;ui;`zGpe1FJ8O|4hgx2@Z4>~?C$G(FPY&R6ofhBwuldZNKq6NTxvOVmqx^m$dAFG zFM-=_FhkR5Xwtq@SnF($Ju&g-ty}ZmADP{D znvOes`Q5KBj^RY_nmmrFboDco4F zZ*1TqO3TXHhVxXPCv)@O3hH}iV`GCrEH5wr87a^Rz5M(4we!|Q)d=^GA3qQX-Fjzk zq`tDUZ#cE!m-KYR%a<=}y)Wtqt*ia~uCd<45!vtKHPX@4q*&kBaJ)Q!J3KrrQKTM< zcKw%)mYJAmy~SN6@e97q%}odB6*4bMO3K{){PtfNQaZGY@CsLA`DRWqKR;j6%}pp6 z%f9K5Ebf7B2)Ujcn(NLCzffFeCNmuR#mkp>s;8U1bT*wF93*UQIku-8SdQZ3=V5WVr7Ppz!-k>2y|7^u!x%~7;{Q-7Sk({e?}u2J049)N3TYC7_z zB{vtV#(wtur#lL}zZEzcZ{J4OE*kyg29w~QlfyDvsKs1eq}N1sadsR8KYMz4%|o-a zTwUxS5KVfKN@D+(UVI&xXw3;VtF#zoA|n2hnK_vGln{wT&P~-hoow0rghDw5b>6HF zqzJjJ-*gtHeW2Hfg^P=OU%#1Vf2E&S=uM0F#cn$;XKPm%rkI!*>;3!hTUx}|*VpkL zl&IuIB_ssrspc@{%sAzlhvevR{>y^ywzhY0zsT*fzOCK)Z_dj< zZZR-%TtADcs|^_iGxQk_G+644+jfN!rNQy@87=$#>Ur`lzx)gXH^_6MqT{47b_2_ z)UErSG~CCA`z|*Dr7_836lz0@CED@jHV*RJ0yVv@tb#&x!+W#l0^H6+r?(3M=XIBz10WiVLJx?LVqaodavE|crthx-_4q-f`yYUmyw9$}wK z*v!~qzrl_#xg6T$S6e?{_jg3h8qfQjY04EPelb5mtS40yr{6|f)W3RXvy>m27$`N` z)_)$iDch>RkgM%Xa-ZYSO)jt;DK!`6;^24dJ0%{{3mvUQbkq+iwHW2%{COle!IquZtQy-*10sG=648 z^S@(*+enVED zz{BGBSe`Snz##A@Ie8{@uuQ{X)We4l<+O>6l|Fy^MB=~Y`TToAhmc8_T$mJW+{PY1 z+!$lTx+brnV5&8nP*`~XRl}S9rR5+zO241tS5t-jrTX-lf?~qa$;mV^v9XVd&~rzu zYHMrLHA>=K=ftkgoup-C7}?n51KE~yMyv)a%#}nAhgI*E4At7AwGIpr%*@Qd#Kh-! zsHe4je3JQCLZa2UAfqWYIEv#{Em2)v-R|GNk}$+5;K^3`Abvhim>_6RhdzHf`Hot^ zCaO;5ZPVeX&dKzScMv77Swf@YkgX0--TAra`I?eXyB`K_7W;7bz90@Zc3T&{&$(vm zEKMI-`NV`a@OWE)f4_l`mzO9G4h{p>wZ^8V3^lg?`pb?FqaqobqS-QBftO0^wvJl@t#7WE*rv$Jz> zc9sS-3M8P#iIvAd)O!Bov72ec1_6Pbn4t1XC1p`;ot~x@5D;KxWtG^OY04P1&_0+P zAD`bGuW)d64T_GA9y|qvP}b7=0JoEso!vGwL-+XcW5Ooemh-;~&(g$bIhzhh?%%(! ztfPY~F5Y6+dj)ijg@xstnQ5G~k3cZBgM4vV9iTnfnWeX?n)tIX-gn7W8IFUC3p7li zqoaemSP&~WBZKx=e`c1KlX!c3msVEt)!R>O0l7u1s;aITp2Jaxn><|q9v)`vHMtKK zlr+mDa)TiV)s?sayQ-RyOyqOKk{J{lPomgPF@RU@Ozu3pGsZEc-j zRCI^w%dcO`6P1?H$QB?RDltzXd}@KP?S!#H&<8#$8avH~>^Q5}EdbmVi9ChaYMBdep)wb~LwKO$&$+*x}-Rbv7GaQo_m4$5-j$#kBZ{ ziI+DT@vA4A_ zkJd*D(0#p6<}s}-EEwSCfrv@Ya-JtWv2WZ9l-swkut@jyMQAs=ajzY^Gcn04D&93W zH_tCFCQG}D)zHfr9#-4y9bQ~$vmHi~5feY==jWG}u6(nleU0I=b!g3bX=g_XW*AkO zkM~WWtXayee}MFjlGF=s5f%^SD3K!AI62ABLPJBb5h>z6&C?sCl!W6TKd}*}CMHB5 z=cA_UT|&K2*I0nPv)}Hoyl{4|M2h;{b zym#6~fw8f%ZEu}7M)7kLQzVUym{$4{{T1RL7=n*Uc=^Yd{4$~wNtgqA|ZY-XEj z!SXF^t%0FreDtVc+(|&UrMQ@2e0==RY|9n%2quCp76+yOst6pe7?czgzNLzK?7}#; zjgM<>ZVYB(-hGyUat#X=KgGTQD(eiJ+0ZpNH!HK=1YEiP`}gmTl9-sA?}LJN|G=l8L(w*>5_g2B<6n3@{G z6z}fsao0B9+fNYl68`!u(T`C4ymVXy{jsllLFYneD7W!eL_!9573z}kg>9Il-y)B z2h^|A>8B_r@b8$ON0CfR*;`F*ZKIw~cijFh$Co+GOV-xa&G#kpBFjy2%PT5$n!cH@ zI}Q?SiXe%osW(`#+OuYwJd#9Y)zofUSy`2u|D;oU`O>g6Poquw+^MLlk})y4jW7U~Ia#E?3I-ptc(&8>G)>G4^^Eqy z=YYu>`1o!D|Jhd4YZq{W5rZB>HhBm>&~Luq%so3=eRyynEh`&5crja`!Fl`cU8CXL z7r`GsSdNa3ia;vz4tR56uFW6y_)}771#FNEsYcaD=e8q2FrvuOlNtRXdIGRv{uLEY z1x^B4Sy||Srf^ z)Ij!awB0kU$aux@kNtydHzdC*vxWp)PbvlCKwn89NcHjR*v~dS&X@=6SW2X=B-vZ z0&Kz`d5PRAd)mgh(JC96 zXX{-blYWiM@CjSqq~@od_dk~(agpr$FnCTDzK|fn+CT)S9o>e<4WlBX20O~Ft79w1dRwj&XJ zWpSF@_c@qO)LkNTFu_UoyGh1~Rlfk4e)Rw6vnhG4#)@?T%R;A2o!z1J=dXXF95URg z*_o^%1aR!1h>^bo8jn*|rYMQa(68`ki_@wi3emoYQ6hZ(F$otyIct^~VW4OHo6PVy z+I$CN2FOcq9iC#F_E{kapAvyW%x{F^F%4mg_wL`voAuns2dO`|y2?^bN*qBa8Ujg7 zugX}7W7-e0@~o`eQ_Wt~WMpLBy}eTL4|ItrDL(`U2MdhZT3ATP%i~1QJ_=l4w>sFK zrdIv>>|H^Dbw$}rwp(ySE{k6bxoT|x$ElzYBp?6-@Dt2Nsc{!UOiWC={cLjrzctzB z))pG#-@kvzIwzK5{gwz2VvC*R`Y70H`}}5WA^=jgzT}6hg&B>FG(eo-&433f_^o2x z9BKpvh#5siX)P@+S=rgYsVa#Ed?00M@9OHBJ7;5O?-b_Y-Dz<>UCT*hVr9h&BBZw? zD~HGh$dL(v^Xz!1YfRqkYE~2KPg@I8OZtNTI$B3@8>l?Jabo zD2LmmJ4#?<8|zGspjmBOb3E%4d3C-jp1^BPpkAbn z;p*yIs8d5wRaLdX!=jYh;fr>?)M|vSqoV_Xc>Ve{5ebRk%K~*qVPPtL?|*k7&JBI& zv@*9CDSiV1cpGeNGhU7%6^PeX@3O(=y8UWtWkqcGTrpJy8+3l*t2z?Mfu&!+<|)=| znpi#GHCcl{z{$vnmiZ(cv=jv>!>FhzM67&(d72j) zDB#@OT%xf@Aj~0GHMF%2hb{>1<gODVX3RDV-XT!BEZSE_w-P>hHq}#WG)5-1qn`yL*R-R zR!2x?5Gi^2o?&|H>ZY8WY}L$u2Q~6BE-uh+x}Fhc4|tC6t@raTI~sk62!#cR=SPcl zkd1G71?*?0Y`o0PSJhX|yFmhmf-gor$)}NY0imI|rw41-5v*)%?a;g7?d_6k8XBP+ ze0+SZ?d@MWHGhii&W;NP8xs+|5$BQi2pS?56VLw|4wP^ZHF!}f3AK7RV- z2RhbljQH~M(yU+$N(o}A6%Gz-F%r^{@uL0<5j;ky5+?e3NfxeaF<#&M9f(>G(xuj8 z55P51(+;(@p$Xbe5p`LZK$o}qW1`j*z_w8En8;QL-{;`SP%n6)u6}n0-SRo4>aeC0 z0olz95mD;{Ru@59jdd?JaxMKHkbY5VX^~4yCJ;M;g3TCD;WE|(Q3OS_L6)M8jEsPk zZEe_T#;ww}t)771M2$I&;o^^2c2rbrVv;3ySmnA2=1wwOWghNa8XO*|8B}g#Z*QMz z92gk504oier3PpafQwxmsP0YNVPd-06+tTnmsan*##BrSvc9DG6bG>WagE(Hmkp8& zf|cr#2`?`%LrcpK&;*SaN0a@hblKZaB8}62blS93KJ+-U`Fn7{_itGg0&;*Q5c2hP z@&_Rh|H%j1hp zIHxw=6sri_T + + + + + + diff --git a/html/classpForms_1_1insertValveForm__inherit__graph.md5 b/html/classpForms_1_1insertValveForm__inherit__graph.md5 new file mode 100644 index 0000000..7057829 --- /dev/null +++ b/html/classpForms_1_1insertValveForm__inherit__graph.md5 @@ -0,0 +1 @@ +9813a25ff6730815f5787013b8859fc5 \ No newline at end of file diff --git a/html/classpForms_1_1insertValveForm__inherit__graph.png b/html/classpForms_1_1insertValveForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..34a020f2ab23e2d67002b2f53ce3f612ece121b7 GIT binary patch literal 7299 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.joinForm Member List
+
+
+ +

This is the complete list of members for pForms.joinForm, including all inherited members.

+ + + + + + + + +
__init__(self) (defined in pForms.joinForm)pForms.joinForm
accept(self) (defined in pForms.joinForm)pForms.joinForm
observer (defined in pForms.joinForm)pForms.joinForm
reject(self) (defined in pForms.joinForm)pForms.joinForm
reset (defined in pForms.joinForm)pForms.joinForm
reset(self) (defined in pForms.joinForm)pForms.joinForm
selectAction(self) (defined in pForms.joinForm)pForms.joinForm
+ + + + diff --git a/html/classpForms_1_1joinForm.html b/html/classpForms_1_1joinForm.html new file mode 100644 index 0000000..c3dd901 --- /dev/null +++ b/html/classpForms_1_1joinForm.html @@ -0,0 +1,260 @@ + + + + + + + +Quetzal: pForms.joinForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.joinForm Class Reference
+
+
+
+Inheritance diagram for pForms.joinForm:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pForms.joinForm:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 reject (self)
 
 accept (self)
 
 selectAction (self)
 
reset (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

reset
 
observer
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pForms.joinForm.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
pForms.joinForm.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ reject()

+ +
+
+ + + + + + + + +
pForms.joinForm.reject ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
pForms.joinForm.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1joinForm__coll__graph.map b/html/classpForms_1_1joinForm__coll__graph.map new file mode 100644 index 0000000..6204438 --- /dev/null +++ b/html/classpForms_1_1joinForm__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1joinForm__coll__graph.md5 b/html/classpForms_1_1joinForm__coll__graph.md5 new file mode 100644 index 0000000..b3ae360 --- /dev/null +++ b/html/classpForms_1_1joinForm__coll__graph.md5 @@ -0,0 +1 @@ +21ad70d4ee07e4fe51b210e8ac61e4df \ No newline at end of file diff --git a/html/classpForms_1_1joinForm__coll__graph.png b/html/classpForms_1_1joinForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..51d22ed34fe3589c4e72e6a5b0a7a6c7cc55d6f4 GIT binary patch literal 5992 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 Z0OcvWzW1kV0gTQewFjDr;``<={{zQjVw3;? literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1joinForm__inherit__graph.map b/html/classpForms_1_1joinForm__inherit__graph.map new file mode 100644 index 0000000..6204438 --- /dev/null +++ b/html/classpForms_1_1joinForm__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpForms_1_1joinForm__inherit__graph.md5 b/html/classpForms_1_1joinForm__inherit__graph.md5 new file mode 100644 index 0000000..b3ae360 --- /dev/null +++ b/html/classpForms_1_1joinForm__inherit__graph.md5 @@ -0,0 +1 @@ +21ad70d4ee07e4fe51b210e8ac61e4df \ No newline at end of file diff --git a/html/classpForms_1_1joinForm__inherit__graph.png b/html/classpForms_1_1joinForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..51d22ed34fe3589c4e72e6a5b0a7a6c7cc55d6f4 GIT binary patch literal 5992 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 Z0OcvWzW1kV0gTQewFjDr;``<={{zQjVw3;? literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1point2pointPipe-members.html b/html/classpForms_1_1point2pointPipe-members.html new file mode 100644 index 0000000..0e6abeb --- /dev/null +++ b/html/classpForms_1_1point2pointPipe-members.html @@ -0,0 +1,109 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.point2pointPipe Member List
+
+ + + + + diff --git a/html/classpForms_1_1point2pointPipe.html b/html/classpForms_1_1point2pointPipe.html new file mode 100644 index 0000000..a107aba --- /dev/null +++ b/html/classpForms_1_1point2pointPipe.html @@ -0,0 +1,180 @@ + + + + + + + +Quetzal: pForms.point2pointPipe Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.point2pointPipe Class Reference
+
+
+
+Inheritance diagram for pForms.point2pointPipe:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for pForms.point2pointPipe:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, wireFlag=True)
 
alignWP (self, norm)
 
offsetWP (self)
 
rotateWP (self)
 
rset (self)
 
action (self, arg)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

pform
 
rset
 
hackedUI
 
rotateWP
 
offsetWP
 
start
 
lastPipe
 
nodes
 
form
 
point
 
node
 
support
 
pos
 
+

Detailed Description

+
Draw pipes by sequence point.
+

The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1point2pointPipe__coll__graph.map b/html/classpForms_1_1point2pointPipe__coll__graph.map new file mode 100644 index 0000000..0f5db26 --- /dev/null +++ b/html/classpForms_1_1point2pointPipe__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classpForms_1_1point2pointPipe__coll__graph.md5 b/html/classpForms_1_1point2pointPipe__coll__graph.md5 new file mode 100644 index 0000000..5a67939 --- /dev/null +++ b/html/classpForms_1_1point2pointPipe__coll__graph.md5 @@ -0,0 +1 @@ +0522d671fd51048811bd7b655e4a43d6 \ No newline at end of file diff --git a/html/classpForms_1_1point2pointPipe__coll__graph.png b/html/classpForms_1_1point2pointPipe__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b035807a37b2ff3b33d7670d3e15eeab308a38 GIT binary patch literal 4280 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 F{10M$8}I-C literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1point2pointPipe__inherit__graph.map b/html/classpForms_1_1point2pointPipe__inherit__graph.map new file mode 100644 index 0000000..0f5db26 --- /dev/null +++ b/html/classpForms_1_1point2pointPipe__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classpForms_1_1point2pointPipe__inherit__graph.md5 b/html/classpForms_1_1point2pointPipe__inherit__graph.md5 new file mode 100644 index 0000000..5a67939 --- /dev/null +++ b/html/classpForms_1_1point2pointPipe__inherit__graph.md5 @@ -0,0 +1 @@ +0522d671fd51048811bd7b655e4a43d6 \ No newline at end of file diff --git a/html/classpForms_1_1point2pointPipe__inherit__graph.png b/html/classpForms_1_1point2pointPipe__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b035807a37b2ff3b33d7670d3e15eeab308a38 GIT binary patch literal 4280 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 F{10M$8}I-C literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1redrawDialog-members.html b/html/classpForms_1_1redrawDialog-members.html new file mode 100644 index 0000000..880bab7 --- /dev/null +++ b/html/classpForms_1_1redrawDialog-members.html @@ -0,0 +1,106 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pForms.redrawDialog Member List
+
+
+ +

This is the complete list of members for pForms.redrawDialog, including all inherited members.

+ + + + + + + + + + + + + + + + + +
__init__(self) (defined in pForms.redrawDialog)pForms.redrawDialog
brn2 (defined in pForms.redrawDialog)pForms.redrawDialog
btn1 (defined in pForms.redrawDialog)pForms.redrawDialog
btn3 (defined in pForms.redrawDialog)pForms.redrawDialog
checkBoxes (defined in pForms.redrawDialog)pForms.redrawDialog
clearAll (defined in pForms.redrawDialog)pForms.redrawDialog
clearAll(self) (defined in pForms.redrawDialog)pForms.redrawDialog
formLayout (defined in pForms.redrawDialog)pForms.redrawDialog
pypelines (defined in pForms.redrawDialog)pForms.redrawDialog
redraw (defined in pForms.redrawDialog)pForms.redrawDialog
redraw(self) (defined in pForms.redrawDialog)pForms.redrawDialog
scrollArea (defined in pForms.redrawDialog)pForms.redrawDialog
scrollAreaWidgetContents (defined in pForms.redrawDialog)pForms.redrawDialog
selectAll (defined in pForms.redrawDialog)pForms.redrawDialog
selectAll(self) (defined in pForms.redrawDialog)pForms.redrawDialog
verticalLayout (defined in pForms.redrawDialog)pForms.redrawDialog
+ + + + diff --git a/html/classpForms_1_1redrawDialog.html b/html/classpForms_1_1redrawDialog.html new file mode 100644 index 0000000..4263dc6 --- /dev/null +++ b/html/classpForms_1_1redrawDialog.html @@ -0,0 +1,169 @@ + + + + + + + +Quetzal: pForms.redrawDialog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pForms.redrawDialog Class Reference
+
+
+
+Inheritance diagram for pForms.redrawDialog:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for pForms.redrawDialog:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + +

+Public Member Functions

__init__ (self)
 
redraw (self)
 
selectAll (self)
 
clearAll (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

verticalLayout
 
scrollArea
 
scrollAreaWidgetContents
 
formLayout
 
checkBoxes
 
pypelines
 
btn1
 
redraw
 
brn2
 
selectAll
 
btn3
 
clearAll
 
+
The documentation for this class was generated from the following file:
    +
  • pForms.py
  • +
+
+ + + + diff --git a/html/classpForms_1_1redrawDialog__coll__graph.map b/html/classpForms_1_1redrawDialog__coll__graph.map new file mode 100644 index 0000000..65d53f6 --- /dev/null +++ b/html/classpForms_1_1redrawDialog__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classpForms_1_1redrawDialog__coll__graph.md5 b/html/classpForms_1_1redrawDialog__coll__graph.md5 new file mode 100644 index 0000000..f7c846e --- /dev/null +++ b/html/classpForms_1_1redrawDialog__coll__graph.md5 @@ -0,0 +1 @@ +1917db354da5aec36e334f7b449c495e \ No newline at end of file diff --git a/html/classpForms_1_1redrawDialog__coll__graph.png b/html/classpForms_1_1redrawDialog__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a29c5885f40e5d7e51aa7a5e348ef48710b846 GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/html/classpForms_1_1redrawDialog__inherit__graph.map b/html/classpForms_1_1redrawDialog__inherit__graph.map new file mode 100644 index 0000000..65d53f6 --- /dev/null +++ b/html/classpForms_1_1redrawDialog__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classpForms_1_1redrawDialog__inherit__graph.md5 b/html/classpForms_1_1redrawDialog__inherit__graph.md5 new file mode 100644 index 0000000..f7c846e --- /dev/null +++ b/html/classpForms_1_1redrawDialog__inherit__graph.md5 @@ -0,0 +1 @@ +1917db354da5aec36e334f7b449c495e \ No newline at end of file diff --git a/html/classpForms_1_1redrawDialog__inherit__graph.png b/html/classpForms_1_1redrawDialog__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a29c5885f40e5d7e51aa7a5e348ef48710b846 GIT binary patch literal 4494 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 literal 0 HcmV?d00001 diff --git a/html/classpObservers_1_1arrow__insert-members.html b/html/classpObservers_1_1arrow__insert-members.html new file mode 100644 index 0000000..7bb7f8b --- /dev/null +++ b/html/classpObservers_1_1arrow__insert-members.html @@ -0,0 +1,96 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pObservers.arrow_insert Member List
+
+
+ +

This is the complete list of members for pObservers.arrow_insert, including all inherited members.

+ + + + + + + +
__init__(self, name, pype, portNr, scale=100) (defined in pObservers.arrow_insert)pObservers.arrow_insert
pickAction(self, path=None, event=None, arg=None) (defined in pObservers.arrow_insert)pObservers.arrow_insert
portDir (defined in pObservers.arrow_insert)pObservers.arrow_insert
portPos (defined in pObservers.arrow_insert)pObservers.arrow_insert
pype (defined in pObservers.arrow_insert)pObservers.arrow_insert
stop (defined in pObservers.arrow_insert)pObservers.arrow_insert
+ + + + diff --git a/html/classpObservers_1_1arrow__insert.html b/html/classpObservers_1_1arrow__insert.html new file mode 100644 index 0000000..89be27d --- /dev/null +++ b/html/classpObservers_1_1arrow__insert.html @@ -0,0 +1,274 @@ + + + + + + + +Quetzal: pObservers.arrow_insert Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pObservers.arrow_insert Class Reference
+
+
+
+Inheritance diagram for pObservers.arrow_insert:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pObservers.arrow_insert:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, name, pype, portNr, scale=100)
 
 pickAction (self, path=None, event=None, arg=None)
 
- Public Member Functions inherited from uCmd.arrow
closeArrow (self)
 
moveto (self, pl)
 
pickCB (self, ecb)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

stop
 
pype
 
portDir
 
portPos
 
- Public Attributes inherited from uCmd.arrow
view
 
sg
 
cb
 
node
 
name
 
color
 
transform
 
cone
 
offset
 
Placement
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pObservers.arrow_insert.__init__ ( self,
 name,
 pype,
 portNr,
 scale = 100 
)
+
+ +

Reimplemented from uCmd.arrow.

+ +
+
+

Member Function Documentation

+ +

◆ pickAction()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pObservers.arrow_insert.pickAction ( self,
 path = None,
 event = None,
 arg = None 
)
+
+ +

Reimplemented from uCmd.arrow.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pObservers.py
  • +
+
+ + + + diff --git a/html/classpObservers_1_1arrow__insert__coll__graph.map b/html/classpObservers_1_1arrow__insert__coll__graph.map new file mode 100644 index 0000000..44d38bd --- /dev/null +++ b/html/classpObservers_1_1arrow__insert__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpObservers_1_1arrow__insert__coll__graph.md5 b/html/classpObservers_1_1arrow__insert__coll__graph.md5 new file mode 100644 index 0000000..a77aea8 --- /dev/null +++ b/html/classpObservers_1_1arrow__insert__coll__graph.md5 @@ -0,0 +1 @@ +c2c5333e30b1e92e49f520e6c10774c9 \ No newline at end of file diff --git a/html/classpObservers_1_1arrow__insert__coll__graph.png b/html/classpObservers_1_1arrow__insert__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cb771e2b71a098040f875bc088f9e26a8065d13a GIT binary patch literal 5925 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

>Q{P|iO@vm5Z*%D5ZIa28ijTM z^|0GtZWvk!(bpA<455XdLx>GJwu6lSoA^bw_+f!g1szIpn03l>{PKhh|3YaQk34GR zb`f%T-iS`r2`it2F)WZ^kELmO!Ib8;{#q~qf=`A?OR_+wC=oO;R%Q?NEOBqw{ZY1* zhlF8}DKy@r1!{z84W&^3^B)12tV`xJWhCrfP?ieh|7VDwP^q}MxUkt&oS=QEEyZ}2 z=-6>8D-|+E>S@`9lGWfGoSeBc6QfIltx3Iqno@EvMkXdEeBv4O4kL}Pu!EMFO&?`X z0W1ljdIRx{$Xguo2!6TVV_{xfTkEavmij;4Q+bsS;WMs|2)sI*^GReQU25imEHqDr z(eNJcb_*T|WSbgpky~c~_Xw~zHZf88$rC)lPn;qmpMiWgEV!|Q$8S=jId*n6oN;+= z*MJAxlE~A;{d+J5t#F!=23*?%+)Y_U1v@+YhbZ~ekf9;%^ng=)hd4GRs;%1y>+S?$ z*tk&B#i6l)NsVHEx?Hlj11%l_nG$zfFl)eb0P6j+dlAdNKs*HJ+5gDGpOc8jq; zO{U{yZ)In9cLCg!CfTgTp>JDiq(q4(ijD+W{5>)Mwthsw{-r*&wUN)dPH?Cew= z7Bew1AtWKO{1wM-momC=4nWai=nt^Ok<2okeSJ60I-}XtGUU^oX6jrPT8TWiCa=*8 z=Xifu12{l(c+&|dz!X4Ldxul-3ZH{FYPqAHt-zAr<>QM0M4;;b=+UDDBjBZyq+B^c zi(u>04}-zrl)7)|S3AwTxVpTUvVQsoO*21`_2hgvvAGox2(ZsPeKOd;0D_&jCdIF< z-lo1SuxzlYYGh#{U-u(N`}FnoH&W`c`AR0jZ7q5@9g1JH|FdV2VZ zu8I0dYMe~W%>0%{s5~$WxZ4a4k18tS$Gb^tHd$#8iAzj$-Ca_#=}$+ZPl2!6qC|A1Ke9JpIMP2{O=0Y*5?$cQcg4^>A;{*1s&spaKm&;-GKIsC7v2b^$Rov$cx3kt5B9&B8v^wt!5Z$w8! z{B#X7Bn#4gbFwNN6ayn8BY^Iav9av9A8l+P87 z?Y#vQZ8dyO-P)Q1JfPqHpfZrz)S&GL0ht86*ze95_T#fNJoMwTz^j1nt;0j1bV2a7 z!0U#P378XFddd<1x<2bYwibXB0=-O8_^fRAEfKa*@;}s{@O4q zb)Zr#DkFmxA0NNrY`Y#58tAt?g2DJaJUk$v50%(2e-`06>m3XL92EG^IBuQNGW!cQ zVC~91v9GUd{<`OKQ03m|i}B(zFfd5>KQx>Tyz&PYW9RVDW~nm z0j(R*sWCIVJDjJ1-k%yDpWoQ%{zyW{Hx=H}qWC#BHgMpwS)6?FBt^{rHaIGF4i0=^ z3p~8(zILVD242#1xRN>h8L|$mlE81=4(g{12*g0=M~`Jm0f~a%3uyfOUX+ + + + + + + diff --git a/html/classpObservers_1_1arrow__insert__inherit__graph.md5 b/html/classpObservers_1_1arrow__insert__inherit__graph.md5 new file mode 100644 index 0000000..a77aea8 --- /dev/null +++ b/html/classpObservers_1_1arrow__insert__inherit__graph.md5 @@ -0,0 +1 @@ +c2c5333e30b1e92e49f520e6c10774c9 \ No newline at end of file diff --git a/html/classpObservers_1_1arrow__insert__inherit__graph.png b/html/classpObservers_1_1arrow__insert__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cb771e2b71a098040f875bc088f9e26a8065d13a GIT binary patch literal 5925 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

>Q{P|iO@vm5Z*%D5ZIa28ijTM z^|0GtZWvk!(bpA<455XdLx>GJwu6lSoA^bw_+f!g1szIpn03l>{PKhh|3YaQk34GR zb`f%T-iS`r2`it2F)WZ^kELmO!Ib8;{#q~qf=`A?OR_+wC=oO;R%Q?NEOBqw{ZY1* zhlF8}DKy@r1!{z84W&^3^B)12tV`xJWhCrfP?ieh|7VDwP^q}MxUkt&oS=QEEyZ}2 z=-6>8D-|+E>S@`9lGWfGoSeBc6QfIltx3Iqno@EvMkXdEeBv4O4kL}Pu!EMFO&?`X z0W1ljdIRx{$Xguo2!6TVV_{xfTkEavmij;4Q+bsS;WMs|2)sI*^GReQU25imEHqDr z(eNJcb_*T|WSbgpky~c~_Xw~zHZf88$rC)lPn;qmpMiWgEV!|Q$8S=jId*n6oN;+= z*MJAxlE~A;{d+J5t#F!=23*?%+)Y_U1v@+YhbZ~ekf9;%^ng=)hd4GRs;%1y>+S?$ z*tk&B#i6l)NsVHEx?Hlj11%l_nG$zfFl)eb0P6j+dlAdNKs*HJ+5gDGpOc8jq; zO{U{yZ)In9cLCg!CfTgTp>JDiq(q4(ijD+W{5>)Mwthsw{-r*&wUN)dPH?Cew= z7Bew1AtWKO{1wM-momC=4nWai=nt^Ok<2okeSJ60I-}XtGUU^oX6jrPT8TWiCa=*8 z=Xifu12{l(c+&|dz!X4Ldxul-3ZH{FYPqAHt-zAr<>QM0M4;;b=+UDDBjBZyq+B^c zi(u>04}-zrl)7)|S3AwTxVpTUvVQsoO*21`_2hgvvAGox2(ZsPeKOd;0D_&jCdIF< z-lo1SuxzlYYGh#{U-u(N`}FnoH&W`c`AR0jZ7q5@9g1JH|FdV2VZ zu8I0dYMe~W%>0%{s5~$WxZ4a4k18tS$Gb^tHd$#8iAzj$-Ca_#=}$+ZPl2!6qC|A1Ke9JpIMP2{O=0Y*5?$cQcg4^>A;{*1s&spaKm&;-GKIsC7v2b^$Rov$cx3kt5B9&B8v^wt!5Z$w8! z{B#X7Bn#4gbFwNN6ayn8BY^Iav9av9A8l+P87 z?Y#vQZ8dyO-P)Q1JfPqHpfZrz)S&GL0ht86*ze95_T#fNJoMwTz^j1nt;0j1bV2a7 z!0U#P378XFddd<1x<2bYwibXB0=-O8_^fRAEfKa*@;}s{@O4q zb)Zr#DkFmxA0NNrY`Y#58tAt?g2DJaJUk$v50%(2e-`06>m3XL92EG^IBuQNGW!cQ zVC~91v9GUd{<`OKQ03m|i}B(zFfd5>KQx>Tyz&PYW9RVDW~nm z0j(R*sWCIVJDjJ1-k%yDpWoQ%{zyW{Hx=H}qWC#BHgMpwS)6?FBt^{rHaIGF4i0=^ z3p~8(zILVD242#1xRN>h8L|$mlE81=4(g{12*g0=M~`Jm0f~a%3uyfOUX+ + + + + + + +Quetzal: Member List + + + + + + + + + +

+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
pObservers.joinObserver Member List
+
+
+ +

This is the complete list of members for pObservers.joinObserver, including all inherited members.

+ + + + + + + +
__init__(self) (defined in pObservers.joinObserver)pObservers.joinObserver
addSelection(self, doc, obj, sub, pnt) (defined in pObservers.joinObserver)pObservers.joinObserver
goOut(self, info) (defined in pObservers.joinObserver)pObservers.joinObserver
o1 (defined in pObservers.joinObserver)pObservers.joinObserver
o2 (defined in pObservers.joinObserver)pObservers.joinObserver
stop (defined in pObservers.joinObserver)pObservers.joinObserver
+ + + + diff --git a/html/classpObservers_1_1joinObserver.html b/html/classpObservers_1_1joinObserver.html new file mode 100644 index 0000000..89fad27 --- /dev/null +++ b/html/classpObservers_1_1joinObserver.html @@ -0,0 +1,206 @@ + + + + + + + +Quetzal: pObservers.joinObserver Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
pObservers.joinObserver Class Reference
+
+
+
+Inheritance diagram for pObservers.joinObserver:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for pObservers.joinObserver:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 goOut (self, info)
 
addSelection (self, doc, obj, sub, pnt)
 
+ + + + + + + + + + + + + + +

+Public Attributes

o1
 
o2
 
stop
 
- Public Attributes inherited from fObservers.frameObserverPrototype
beam
 
av
 
stop
 
+

Detailed Description

+
Mate together the Ports of different Pypes by clicking on
+arrows in the scene-graph.
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
pObservers.joinObserver.__init__ ( self)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+

Member Function Documentation

+ +

◆ goOut()

+ +
+
+ + + + + + + + + + + + + + + + + + +
pObservers.joinObserver.goOut ( self,
 info 
)
+
+ +

Reimplemented from fObservers.frameObserverPrototype.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • pObservers.py
  • +
+
+ + + + diff --git a/html/classpObservers_1_1joinObserver__coll__graph.map b/html/classpObservers_1_1joinObserver__coll__graph.map new file mode 100644 index 0000000..1fa95a7 --- /dev/null +++ b/html/classpObservers_1_1joinObserver__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpObservers_1_1joinObserver__coll__graph.md5 b/html/classpObservers_1_1joinObserver__coll__graph.md5 new file mode 100644 index 0000000..9dbd397 --- /dev/null +++ b/html/classpObservers_1_1joinObserver__coll__graph.md5 @@ -0,0 +1 @@ +adfbbea5e0e618c75d80a4fc3a5a76e0 \ No newline at end of file diff --git a/html/classpObservers_1_1joinObserver__coll__graph.png b/html/classpObservers_1_1joinObserver__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..57e901ddb3bac6835d3b463f38233d17483ae138 GIT binary patch literal 7391 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 literal 0 HcmV?d00001 diff --git a/html/classpObservers_1_1joinObserver__inherit__graph.map b/html/classpObservers_1_1joinObserver__inherit__graph.map new file mode 100644 index 0000000..1fa95a7 --- /dev/null +++ b/html/classpObservers_1_1joinObserver__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classpObservers_1_1joinObserver__inherit__graph.md5 b/html/classpObservers_1_1joinObserver__inherit__graph.md5 new file mode 100644 index 0000000..9dbd397 --- /dev/null +++ b/html/classpObservers_1_1joinObserver__inherit__graph.md5 @@ -0,0 +1 @@ +adfbbea5e0e618c75d80a4fc3a5a76e0 \ No newline at end of file diff --git a/html/classpObservers_1_1joinObserver__inherit__graph.png b/html/classpObservers_1_1joinObserver__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..57e901ddb3bac6835d3b463f38233d17483ae138 GIT binary patch literal 7391 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 literal 0 HcmV?d00001 diff --git a/html/classuCmd_1_1arrow-members.html b/html/classuCmd_1_1arrow-members.html new file mode 100644 index 0000000..fd94f1a --- /dev/null +++ b/html/classuCmd_1_1arrow-members.html @@ -0,0 +1,105 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
uCmd.arrow Member List
+
+
+ +

This is the complete list of members for uCmd.arrow, including all inherited members.

+ + + + + + + + + + + + + + + + +
__init__(self, pl=None, scale=[100, 100, 20], offset=100, name="ARROW") (defined in uCmd.arrow)uCmd.arrow
cb (defined in uCmd.arrow)uCmd.arrow
closeArrow(self) (defined in uCmd.arrow)uCmd.arrow
color (defined in uCmd.arrow)uCmd.arrow
cone (defined in uCmd.arrow)uCmd.arrow
moveto(self, pl) (defined in uCmd.arrow)uCmd.arrow
name (defined in uCmd.arrow)uCmd.arrow
node (defined in uCmd.arrow)uCmd.arrow
offset (defined in uCmd.arrow)uCmd.arrow
pickAction(self, path=None, event=None, arg=None) (defined in uCmd.arrow)uCmd.arrow
pickCB(self, ecb) (defined in uCmd.arrow)uCmd.arrow
Placement (defined in uCmd.arrow)uCmd.arrow
sg (defined in uCmd.arrow)uCmd.arrow
transform (defined in uCmd.arrow)uCmd.arrow
view (defined in uCmd.arrow)uCmd.arrow
+ + + + diff --git a/html/classuCmd_1_1arrow.html b/html/classuCmd_1_1arrow.html new file mode 100644 index 0000000..49600e5 --- /dev/null +++ b/html/classuCmd_1_1arrow.html @@ -0,0 +1,174 @@ + + + + + + + +Quetzal: uCmd.arrow Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
uCmd.arrow Class Reference
+
+
+
+Inheritance diagram for uCmd.arrow:
+
+
Inheritance graph
+ + + + + + + + + +
[legend]
+
+Collaboration diagram for uCmd.arrow:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + +

+Public Member Functions

__init__ (self, pl=None, scale=[100, 100, 20], offset=100, name="ARROW")
 
closeArrow (self)
 
moveto (self, pl)
 
pickCB (self, ecb)
 
pickAction (self, path=None, event=None, arg=None)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

view
 
sg
 
cb
 
node
 
name
 
color
 
transform
 
cone
 
offset
 
Placement
 
+

Detailed Description

+
This class draws a green arrow to be used as an auxiliary compass
+to show position and orientation of objects.
+  arrow(pl=None, scale=[100,100,20],offset=100,name='ARROW')
+

The documentation for this class was generated from the following file:
    +
  • uCmd.py
  • +
+
+ + + + diff --git a/html/classuCmd_1_1arrow__coll__graph.map b/html/classuCmd_1_1arrow__coll__graph.map new file mode 100644 index 0000000..44517b9 --- /dev/null +++ b/html/classuCmd_1_1arrow__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classuCmd_1_1arrow__coll__graph.md5 b/html/classuCmd_1_1arrow__coll__graph.md5 new file mode 100644 index 0000000..dfde1e9 --- /dev/null +++ b/html/classuCmd_1_1arrow__coll__graph.md5 @@ -0,0 +1 @@ +7f614cdacba2817a208c17b98c50112f \ No newline at end of file diff --git a/html/classuCmd_1_1arrow__coll__graph.png b/html/classuCmd_1_1arrow__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d87135654e99dbf742a17e292243c40ab0bad755 GIT binary patch literal 3249 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 + + + + + + + + diff --git a/html/classuCmd_1_1arrow__inherit__graph.md5 b/html/classuCmd_1_1arrow__inherit__graph.md5 new file mode 100644 index 0000000..58cc150 --- /dev/null +++ b/html/classuCmd_1_1arrow__inherit__graph.md5 @@ -0,0 +1 @@ +6d1df4c45893fd7dc557fb137af665f9 \ No newline at end of file diff --git a/html/classuCmd_1_1arrow__inherit__graph.png b/html/classuCmd_1_1arrow__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..aaeb2104936f85872b57ef0a9b3a5161eddcf1ce GIT binary patch literal 8747 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 BVLSi; literal 0 HcmV?d00001 diff --git a/html/classuCmd_1_1arrow__move-members.html b/html/classuCmd_1_1arrow__move-members.html new file mode 100644 index 0000000..8c53c1c --- /dev/null +++ b/html/classuCmd_1_1arrow__move-members.html @@ -0,0 +1,98 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
uCmd.arrow_move Member List
+
+
+ +

This is the complete list of members for uCmd.arrow_move, including all inherited members.

+ + + + + + + + + +
__init__(self, edit, edit2, pl=None, direct=None, M=100.0, objs=None) (defined in uCmd.arrow_move)uCmd.arrow_move
direct (defined in uCmd.arrow_move)uCmd.arrow_move
edge (defined in uCmd.arrow_move)uCmd.arrow_move
edit (defined in uCmd.arrow_move)uCmd.arrow_move
edit2 (defined in uCmd.arrow_move)uCmd.arrow_move
objs (defined in uCmd.arrow_move)uCmd.arrow_move
pickAction(self, path=None, event=None, arg=None) (defined in uCmd.arrow_move)uCmd.arrow_move
scale (defined in uCmd.arrow_move)uCmd.arrow_move
+ + + + diff --git a/html/classuCmd_1_1arrow__move.html b/html/classuCmd_1_1arrow__move.html new file mode 100644 index 0000000..f97a8fd --- /dev/null +++ b/html/classuCmd_1_1arrow__move.html @@ -0,0 +1,301 @@ + + + + + + + +Quetzal: uCmd.arrow_move Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
uCmd.arrow_move Class Reference
+
+
+
+Inheritance diagram for uCmd.arrow_move:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for uCmd.arrow_move:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self, edit, edit2, pl=None, direct=None, M=100.0, objs=None)
 
 pickAction (self, path=None, event=None, arg=None)
 
- Public Member Functions inherited from uCmd.arrow
closeArrow (self)
 
moveto (self, pl)
 
pickCB (self, ecb)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

objs
 
edge
 
edit
 
edit2
 
scale
 
direct
 
- Public Attributes inherited from uCmd.arrow
view
 
sg
 
cb
 
node
 
name
 
color
 
transform
 
cone
 
offset
 
Placement
 
+

Detailed Description

+
arrow_move(edit,edit2,pl=None,direct=None,M=100)
+  edit,edit2: displacement and angle QLineEdit widgets
+  pl: the placement of the arrow
+  direct: the displacement vector
+  M: the scale of display
+This class derives from "arrow" and adds the ability to move the selected
+objects when the arrow is picked.  This is accomplished by redefining the
+method "pickAction".
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
uCmd.arrow_move.__init__ ( self,
 edit,
 edit2,
 pl = None,
 direct = None,
 M = 100.0,
 objs = None 
)
+
+ +

Reimplemented from uCmd.arrow.

+ +
+
+

Member Function Documentation

+ +

◆ pickAction()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
uCmd.arrow_move.pickAction ( self,
 path = None,
 event = None,
 arg = None 
)
+
+ +

Reimplemented from uCmd.arrow.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • uCmd.py
  • +
+
+ + + + diff --git a/html/classuCmd_1_1arrow__move__coll__graph.map b/html/classuCmd_1_1arrow__move__coll__graph.map new file mode 100644 index 0000000..f62aa9f --- /dev/null +++ b/html/classuCmd_1_1arrow__move__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classuCmd_1_1arrow__move__coll__graph.md5 b/html/classuCmd_1_1arrow__move__coll__graph.md5 new file mode 100644 index 0000000..e35f855 --- /dev/null +++ b/html/classuCmd_1_1arrow__move__coll__graph.md5 @@ -0,0 +1 @@ +a3bc87341afa98714e09d2501833a7c8 \ No newline at end of file diff --git a/html/classuCmd_1_1arrow__move__coll__graph.png b/html/classuCmd_1_1arrow__move__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7e97a02ab246b5ea36298a28c9f9323ddc2fa0d4 GIT binary patch literal 5632 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 + + + + + + diff --git a/html/classuCmd_1_1arrow__move__inherit__graph.md5 b/html/classuCmd_1_1arrow__move__inherit__graph.md5 new file mode 100644 index 0000000..e35f855 --- /dev/null +++ b/html/classuCmd_1_1arrow__move__inherit__graph.md5 @@ -0,0 +1 @@ +a3bc87341afa98714e09d2501833a7c8 \ No newline at end of file diff --git a/html/classuCmd_1_1arrow__move__inherit__graph.png b/html/classuCmd_1_1arrow__move__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7e97a02ab246b5ea36298a28c9f9323ddc2fa0d4 GIT binary patch literal 5632 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 + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
uCmd.hackedLine Member List
+
+
+ +

This is the complete list of members for uCmd.hackedLine, including all inherited members.

+ + + + + + + + + + + + + + +
__init__(self, wireFlag=True) (defined in uCmd.hackedLine)uCmd.hackedLine
action(self, arg) (defined in uCmd.hackedLine)uCmd.hackedLine
alignWP(self, norm) (defined in uCmd.hackedLine)uCmd.hackedLine
form (defined in uCmd.hackedLine)uCmd.hackedLine
hackedUI (defined in uCmd.hackedLine)uCmd.hackedLine
node (defined in uCmd.hackedLine)uCmd.hackedLine
offsetWP (defined in uCmd.hackedLine)uCmd.hackedLine
offsetWP(self) (defined in uCmd.hackedLine)uCmd.hackedLine
point (defined in uCmd.hackedLine)uCmd.hackedLine
pos (defined in uCmd.hackedLine)uCmd.hackedLine
rotateWP (defined in uCmd.hackedLine)uCmd.hackedLine
rotateWP(self) (defined in uCmd.hackedLine)uCmd.hackedLine
support (defined in uCmd.hackedLine)uCmd.hackedLine
+ + + + diff --git a/html/classuCmd_1_1hackedLine.html b/html/classuCmd_1_1hackedLine.html new file mode 100644 index 0000000..26e5f20 --- /dev/null +++ b/html/classuCmd_1_1hackedLine.html @@ -0,0 +1,163 @@ + + + + + + + +Quetzal: uCmd.hackedLine Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
uCmd.hackedLine Class Reference
+
+
+
+Inheritance diagram for uCmd.hackedLine:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for uCmd.hackedLine:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + +

+Public Member Functions

__init__ (self, wireFlag=True)
 
alignWP (self, norm)
 
offsetWP (self)
 
rotateWP (self)
 
action (self, arg)
 
+ + + + + + + + + + + + + + + + + +

+Public Attributes

hackedUI
 
rotateWP
 
offsetWP
 
form
 
point
 
node
 
support
 
pos
 
+

Detailed Description

+
One hack of the class DraftTools.Line
+to make 3D drafting easier.
+

The documentation for this class was generated from the following file:
    +
  • uCmd.py
  • +
+
+ + + + diff --git a/html/classuCmd_1_1hackedLine__coll__graph.map b/html/classuCmd_1_1hackedLine__coll__graph.map new file mode 100644 index 0000000..bd5a7eb --- /dev/null +++ b/html/classuCmd_1_1hackedLine__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classuCmd_1_1hackedLine__coll__graph.md5 b/html/classuCmd_1_1hackedLine__coll__graph.md5 new file mode 100644 index 0000000..6633207 --- /dev/null +++ b/html/classuCmd_1_1hackedLine__coll__graph.md5 @@ -0,0 +1 @@ +ac2e4e10896f80cd220cced62fd5220e \ No newline at end of file diff --git a/html/classuCmd_1_1hackedLine__coll__graph.png b/html/classuCmd_1_1hackedLine__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9e29c6611fa845b906284dcda8070b955aaecfd1 GIT binary patch literal 4097 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 Vf*&^Kior||F*ik;)Lyuj@Nb0Q+Nb~k literal 0 HcmV?d00001 diff --git a/html/classuCmd_1_1hackedLine__inherit__graph.map b/html/classuCmd_1_1hackedLine__inherit__graph.map new file mode 100644 index 0000000..bd5a7eb --- /dev/null +++ b/html/classuCmd_1_1hackedLine__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classuCmd_1_1hackedLine__inherit__graph.md5 b/html/classuCmd_1_1hackedLine__inherit__graph.md5 new file mode 100644 index 0000000..6633207 --- /dev/null +++ b/html/classuCmd_1_1hackedLine__inherit__graph.md5 @@ -0,0 +1 @@ +ac2e4e10896f80cd220cced62fd5220e \ No newline at end of file diff --git a/html/classuCmd_1_1hackedLine__inherit__graph.png b/html/classuCmd_1_1hackedLine__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9e29c6611fa845b906284dcda8070b955aaecfd1 GIT binary patch literal 4097 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 Vf*&^Kior||F*ik;)Lyuj@Nb0Q+Nb~k literal 0 HcmV?d00001 diff --git a/html/classuCmd_1_1handleDialog-members.html b/html/classuCmd_1_1handleDialog-members.html new file mode 100644 index 0000000..b4bbc44 --- /dev/null +++ b/html/classuCmd_1_1handleDialog-members.html @@ -0,0 +1,97 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
uCmd.handleDialog Member List
+
+
+ +

This is the complete list of members for uCmd.handleDialog, including all inherited members.

+ + + + + + + + +
__init__(self) (defined in uCmd.handleDialog)uCmd.handleDialog
accept(self) (defined in uCmd.handleDialog)uCmd.handleDialog
arrow (defined in uCmd.handleDialog)uCmd.handleDialog
objs (defined in uCmd.handleDialog)uCmd.handleDialog
reject(self) (defined in uCmd.handleDialog)uCmd.handleDialog
selectAction (defined in uCmd.handleDialog)uCmd.handleDialog
selectAction(self) (defined in uCmd.handleDialog)uCmd.handleDialog
+ + + + diff --git a/html/classuCmd_1_1handleDialog.html b/html/classuCmd_1_1handleDialog.html new file mode 100644 index 0000000..e480123 --- /dev/null +++ b/html/classuCmd_1_1handleDialog.html @@ -0,0 +1,260 @@ + + + + + + + +Quetzal: uCmd.handleDialog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
uCmd.handleDialog Class Reference
+
+
+
+Inheritance diagram for uCmd.handleDialog:
+
+
Inheritance graph
+ + + + + + + +
[legend]
+
+Collaboration diagram for uCmd.handleDialog:
+
+
Collaboration graph
+ + + + + + + +
[legend]
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 __init__ (self)
 
 selectAction (self)
 
 accept (self)
 
 reject (self)
 
- Public Member Functions inherited from dodoDialogs.protoTypeDialog
action (self, arg)
 
mouseActionB1 (self, CtrlAltShift)
 
mouseActionB2 (self, CtrlAltShift)
 
mouseActionB3 (self, CtrlAltShift)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

arrow
 
selectAction
 
objs
 
- Public Attributes inherited from dodoDialogs.protoTypeDialog
form
 
mw
 new shortcuts procedure
 
actionX
 
actionS
 
actionESC
 
view
 
call
 
+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + +
uCmd.handleDialog.__init__ ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+

Member Function Documentation

+ +

◆ accept()

+ +
+
+ + + + + + + + +
uCmd.handleDialog.accept ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ reject()

+ +
+
+ + + + + + + + +
uCmd.handleDialog.reject ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+ +

◆ selectAction()

+ +
+
+ + + + + + + + +
uCmd.handleDialog.selectAction ( self)
+
+ +

Reimplemented from dodoDialogs.protoTypeDialog.

+ +
+
+
The documentation for this class was generated from the following file:
    +
  • uCmd.py
  • +
+
+ + + + diff --git a/html/classuCmd_1_1handleDialog__coll__graph.map b/html/classuCmd_1_1handleDialog__coll__graph.map new file mode 100644 index 0000000..3ecd2e0 --- /dev/null +++ b/html/classuCmd_1_1handleDialog__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classuCmd_1_1handleDialog__coll__graph.md5 b/html/classuCmd_1_1handleDialog__coll__graph.md5 new file mode 100644 index 0000000..74013fa --- /dev/null +++ b/html/classuCmd_1_1handleDialog__coll__graph.md5 @@ -0,0 +1 @@ +f9ad6f0bd546affe717e0b2611ac5b61 \ No newline at end of file diff --git a/html/classuCmd_1_1handleDialog__coll__graph.png b/html/classuCmd_1_1handleDialog__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a33f60deeb33638eefafadb4558e87f1af9dd7 GIT binary patch literal 6671 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 literal 0 HcmV?d00001 diff --git a/html/classuCmd_1_1handleDialog__inherit__graph.map b/html/classuCmd_1_1handleDialog__inherit__graph.map new file mode 100644 index 0000000..3ecd2e0 --- /dev/null +++ b/html/classuCmd_1_1handleDialog__inherit__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/classuCmd_1_1handleDialog__inherit__graph.md5 b/html/classuCmd_1_1handleDialog__inherit__graph.md5 new file mode 100644 index 0000000..74013fa --- /dev/null +++ b/html/classuCmd_1_1handleDialog__inherit__graph.md5 @@ -0,0 +1 @@ +f9ad6f0bd546affe717e0b2611ac5b61 \ No newline at end of file diff --git a/html/classuCmd_1_1handleDialog__inherit__graph.png b/html/classuCmd_1_1handleDialog__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a33f60deeb33638eefafadb4558e87f1af9dd7 GIT binary patch literal 6671 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 literal 0 HcmV?d00001 diff --git a/html/classuCmd_1_1label3D-members.html b/html/classuCmd_1_1label3D-members.html new file mode 100644 index 0000000..f91fb8e --- /dev/null +++ b/html/classuCmd_1_1label3D-members.html @@ -0,0 +1,100 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
uCmd.label3D Member List
+
+
+ +

This is the complete list of members for uCmd.label3D, including all inherited members.

+ + + + + + + + + + + +
__init__(self, pl=None, sizeFont=30, color=(1.0, 0.6, 0.0), text="TEXT") (defined in uCmd.label3D)uCmd.label3D
color (defined in uCmd.label3D)uCmd.label3D
font (defined in uCmd.label3D)uCmd.label3D
moveto(self, pl) (defined in uCmd.label3D)uCmd.label3D
node (defined in uCmd.label3D)uCmd.label3D
Placement (defined in uCmd.label3D)uCmd.label3D
removeLabel(self) (defined in uCmd.label3D)uCmd.label3D
sg (defined in uCmd.label3D)uCmd.label3D
text (defined in uCmd.label3D)uCmd.label3D
transform (defined in uCmd.label3D)uCmd.label3D
+ + + + diff --git a/html/classuCmd_1_1label3D.html b/html/classuCmd_1_1label3D.html new file mode 100644 index 0000000..cb1f738 --- /dev/null +++ b/html/classuCmd_1_1label3D.html @@ -0,0 +1,157 @@ + + + + + + + +Quetzal: uCmd.label3D Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
uCmd.label3D Class Reference
+
+
+
+Inheritance diagram for uCmd.label3D:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for uCmd.label3D:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + +

+Public Member Functions

__init__ (self, pl=None, sizeFont=30, color=(1.0, 0.6, 0.0), text="TEXT")
 
removeLabel (self)
 
moveto (self, pl)
 
+ + + + + + + + + + + + + + + +

+Public Attributes

node
 
color
 
transform
 
font
 
text
 
sg
 
Placement
 
+

Detailed Description

+
This class writes a 2D label in the 3D viewport.
+To be used as an auxiliary tool to show flags during execution
+of commands.
+Note: default text size is 30 units.
+  label3D(pl=None, sizeFont=30, color=(1.0,0.6,0.0), text='TEXT')
+

The documentation for this class was generated from the following file:
    +
  • uCmd.py
  • +
+
+ + + + diff --git a/html/classuCmd_1_1label3D__coll__graph.map b/html/classuCmd_1_1label3D__coll__graph.map new file mode 100644 index 0000000..84279db --- /dev/null +++ b/html/classuCmd_1_1label3D__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classuCmd_1_1label3D__coll__graph.md5 b/html/classuCmd_1_1label3D__coll__graph.md5 new file mode 100644 index 0000000..f8204d9 --- /dev/null +++ b/html/classuCmd_1_1label3D__coll__graph.md5 @@ -0,0 +1 @@ +92226eb3cbb93c7044a23a81dcf6a8d5 \ No newline at end of file diff --git a/html/classuCmd_1_1label3D__coll__graph.png b/html/classuCmd_1_1label3D__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..09ea6681097e15ff9e49143099576a8448b99776 GIT binary patch literal 3674 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 R^}t~ff-pszR2zB5{~wa1HHQEI literal 0 HcmV?d00001 diff --git a/html/classuCmd_1_1label3D__inherit__graph.map b/html/classuCmd_1_1label3D__inherit__graph.map new file mode 100644 index 0000000..84279db --- /dev/null +++ b/html/classuCmd_1_1label3D__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classuCmd_1_1label3D__inherit__graph.md5 b/html/classuCmd_1_1label3D__inherit__graph.md5 new file mode 100644 index 0000000..f8204d9 --- /dev/null +++ b/html/classuCmd_1_1label3D__inherit__graph.md5 @@ -0,0 +1 @@ +92226eb3cbb93c7044a23a81dcf6a8d5 \ No newline at end of file diff --git a/html/classuCmd_1_1label3D__inherit__graph.png b/html/classuCmd_1_1label3D__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..09ea6681097e15ff9e49143099576a8448b99776 GIT binary patch literal 3674 zcmcgv`9GB1{~qZPvJ6qOFM}R3*6iD3AIpSY88VO#O0{I zb~rw$RgA5Nr_?Kfs>_cxETj5e6~2uo91P^<(z)4Uo}YFd#of$sv`KDvSSO5hT&_%a z>Bs4pkI+qQq0c(tc+=qP*{E&C!K6wEYL~xKrKM*9KOWSVzga+A$q(`on7^0!pVn?@ zXkRg9oW!LklVD+A5mVZ~6g+gv-ahT`{eY6p8EXx*^9z$v3}PK7 zEp564rRSeK1Gn|?z&r10x48`3a@c%i@5jAz&@gG%}NPu1{L-Gr0p!tkg`@esOrI?jyhWvWw*4)r=<+-(t zox3|+P)O+EXHRGnx7aqO67^Ya`-%({xkR+L#7ff$)Ad)QEN|ZY zTe~0)Ou75!K-tBP)zF~1FZ{fxPBA@KxsJ)dqmuJn>FTj;IEwme{adNk2RFE5mCIZv z9KkCsExo(9CzT+sr8O*1@l&Ue$L$khrD7Jp{`+AZjUNAKYG??7sOQ=AE#n#*hHp2{ z&->sR$YadRPhrUyZVxK?eig?z$reRp>Ga5v(b0y$8J5;W&dp(WEZ-jUoX1N_%2G{D zP0Cr-#B_bS1+u%lTM7+l>MDfq%$Z9L4#$HTzPY)%qO))VC3tFbcjE!HFmmA`TN`{t)n`3m$(}X1?CF7G%$x^>rDe?#la~PVLu{1O^^gLHCq4ZAd z+3auu7@AzUa<;Uz)Bo9!sl9!AeO+-u76uEL?>Q?cC--J_mDJJEJ$l2(M>Z;a$ZIGW8lRghXk=s*UHACWBXLQ|7v0(++9Gy#cBuJ> zNlB+fMJEQniV4zfb`G30!`6g1Ha2vrol?4cE47wMC7Szd*2FWsyu9b&a7XQwB$mth zOM(-=-!4CrK|MSQw@SsT?6i-~*+y@>J3E(KG#>irVM=EuTXA`qcX${EkquiahfbSH zk2EjFs(m!&aCe=J^coVLc~xaeDjry>mhXq3+a>y0V&6MO%T02^DtS6s$-SAnmL1=- z%hA^4UVd#RE1rAexV!A+b0U{KO0<`TUT&O+GKl(p(g^Q!LUt6;72XLMIoRnvhiG~? zOKHJ*Tg0SR;1p@~N(kP^_YGhtj~zSqJLZcQq(p9s>3+{CZP5l*8*G48e5qv{?sx?j z9^ou^f3HuCiAADjQEZO{EuH>#+d)ci^Td=Q?6kNN-J9K7hWjKRs}+xf6pAWUWi=(j z3d;(~(3rGM4L;ue1d5tREb{ck&}5aHx*1G~a=62wYyqYoqvG|tC&yVd;+7lBpBeLi z)04>(|MxH>uTLBCJ6)e0Vdo%$Vm+96;Kj?^m9uAh7}a#SNfPWeAT>AZ(s3vK*cK_PQU zhnRPJs5)?_Jymqb>B<#^l~uQ1$H3?|9m6EOzr8wI=|LEz;Os{D8|U-y-oFQg>vhYM6bTCnxe(eYg1`!>`w6rrh3)hD zmJKBTxOIK^_mn;%0~+7nZsy|Z%Ermr=DV`CIz1Vn>0Il>d2nz5Ss81{=*`op4PA9< zum)9aX(_I$lRDNA3NrTkFM1EFxk4gcE7aA^Y!;{^HU!f8|(R!DL*$8paEXqq3iqf2ylt% zGY;FIKY8-0DPr?y?G5grg}y(ue#%MirYL-Mb^BC6INMrUU7h+w)Vf}ZnbZj`VNc)= zni$k>n5^u~MtJz){*G4Q^l{Z2eK-Q4fWe3c>xx)wSb!QmDJr78{&`x#1r`_DI39gK zTi`o=TIEKcuoj`NE^BPet;a{zsoL%8KK)OMh)xy|Y<2$;(xr=fZ7mN^0?DJq9Twn; z2f6QW4|%DC5Fid#RwqwCeh5@?du4c_q*g;+J!_qKSO~HVBp~vAI%?xnY5n_<%ESxd zzb6e8bV7bPG(@FfFh*qqT{n`DW!C^&zYh&Dd)7Gn-nu1u;Q~Jdfwi!)nIk2iB4Ehq z`hl-s?+q-$banIJzE#09W@o)4eqz$nWK>kJ)6-r+#6Yr|ez%--YmPn(sU5aFhdqOXj=+-)35-MpM1BFZ)e2n^kTOprk;&;uyGLv#H6{JNXg9bfX%^?4N)asXmxzP{(Mu%}O- z{^RWY+-+hhICS*AP5}~6GXg{gRCKLJhsXnKIzfm^PDzRWfCJ*(m3^(Ms%nKoq{zq7 zsB_WOF4;=g`ZOF4M#EMCZ!%naLp5-kLP4yp(SRi(~JEj!12i-^B;Zo z^qgplh~8*B)03l`R9q~6>(;H^xonTluC9%ofCybtDwS%1M9QeCJp(!564mXTNjE_H z`j)%(`P6oW@h>kgAEn90#-?ebU5KD>Ha=DR65-`Ft%<;91sCe+Nyx~sG>-Ry6@aZh z@B9V=*!u3~fRX?Q$61vG0IV^z1~4qoGBYI-Jp1yssMhsw-(tbk;~zY@pCFC{M3aO$VE3uk9a_xGAb+rmWWqa*g7y!`N*2mXdrtM z+-zZWvIyQ&GS-v8z2<8LvE=o(C$OCYro4v1{Hme?U@Pt0H+$fpKvlWU*xfjf`nXlt zcQ>y$v32T0IDKpBa4ctH)tE0iIhlYqnVEV~S;>*tJHH8SyZ3RYx?fdoNzNpr+UUQ- zM}kz?j+m$#U98~Z)L3eIZ~-!Gd}d>1aV_U&>cK-~na;~#4sdcgYTSv3%#+V=!Iaj; R^}t~ff-pszR2zB5{~wa1HHQEI literal 0 HcmV?d00001 diff --git a/html/classuForms_1_1QueryForm-members.html b/html/classuForms_1_1QueryForm-members.html new file mode 100644 index 0000000..f278f31 --- /dev/null +++ b/html/classuForms_1_1QueryForm-members.html @@ -0,0 +1,111 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
uForms.QueryForm Member List
+
+
+ +

This is the complete list of members for uForms.QueryForm, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + +
__init__(self, Selection) (defined in uForms.QueryForm)uForms.QueryForm
cancelButton (defined in uForms.QueryForm)uForms.QueryForm
initUI(self) (defined in uForms.QueryForm)uForms.QueryForm
labBaseVal (defined in uForms.QueryForm)uForms.QueryForm
labBeam (defined in uForms.QueryForm)uForms.QueryForm
labName (defined in uForms.QueryForm)uForms.QueryForm
labProfile (defined in uForms.QueryForm)uForms.QueryForm
labRotAng (defined in uForms.QueryForm)uForms.QueryForm
labRotAx (defined in uForms.QueryForm)uForms.QueryForm
labSubObj (defined in uForms.QueryForm)uForms.QueryForm
mainVLayout (defined in uForms.QueryForm)uForms.QueryForm
onCancel (defined in uForms.QueryForm)uForms.QueryForm
onCancel(self) (defined in uForms.QueryForm)uForms.QueryForm
onPushButton1 (defined in uForms.QueryForm)uForms.QueryForm
onPushButton1(self) (defined in uForms.QueryForm)uForms.QueryForm
pushButton1 (defined in uForms.QueryForm)uForms.QueryForm
Selection (defined in uForms.QueryForm)uForms.QueryForm
subFLayout1 (defined in uForms.QueryForm)uForms.QueryForm
subFLayout2 (defined in uForms.QueryForm)uForms.QueryForm
subFLayout3 (defined in uForms.QueryForm)uForms.QueryForm
subHLayout1 (defined in uForms.QueryForm)uForms.QueryForm
+ + + + diff --git a/html/classuForms_1_1QueryForm.html b/html/classuForms_1_1QueryForm.html new file mode 100644 index 0000000..3819a60 --- /dev/null +++ b/html/classuForms_1_1QueryForm.html @@ -0,0 +1,184 @@ + + + + + + + +Quetzal: uForms.QueryForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
uForms.QueryForm Class Reference
+
+
+
+Inheritance diagram for uForms.QueryForm:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for uForms.QueryForm:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + +

+Public Member Functions

__init__ (self, Selection)
 
initUI (self)
 
onPushButton1 (self)
 
onCancel (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

Selection
 
labName
 
labBaseVal
 
subFLayout1
 
labRotAng
 
subFLayout2
 
labRotAx
 
subFLayout3
 
labSubObj
 
labBeam
 
labProfile
 
pushButton1
 
onPushButton1
 
cancelButton
 
onCancel
 
subHLayout1
 
mainVLayout
 
+
The documentation for this class was generated from the following file:
    +
  • uForms.py
  • +
+
+ + + + diff --git a/html/classuForms_1_1QueryForm__coll__graph.map b/html/classuForms_1_1QueryForm__coll__graph.map new file mode 100644 index 0000000..9a2b129 --- /dev/null +++ b/html/classuForms_1_1QueryForm__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classuForms_1_1QueryForm__coll__graph.md5 b/html/classuForms_1_1QueryForm__coll__graph.md5 new file mode 100644 index 0000000..97248a1 --- /dev/null +++ b/html/classuForms_1_1QueryForm__coll__graph.md5 @@ -0,0 +1 @@ +08af4dbeb1fddffd4a46d4d2ecdeb551 \ No newline at end of file diff --git a/html/classuForms_1_1QueryForm__coll__graph.png b/html/classuForms_1_1QueryForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..095f23dc28b28921264331719dbb37c9ebe62ffa GIT binary patch literal 4386 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 + + + + diff --git a/html/classuForms_1_1QueryForm__inherit__graph.md5 b/html/classuForms_1_1QueryForm__inherit__graph.md5 new file mode 100644 index 0000000..97248a1 --- /dev/null +++ b/html/classuForms_1_1QueryForm__inherit__graph.md5 @@ -0,0 +1 @@ +08af4dbeb1fddffd4a46d4d2ecdeb551 \ No newline at end of file diff --git a/html/classuForms_1_1QueryForm__inherit__graph.png b/html/classuForms_1_1QueryForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..095f23dc28b28921264331719dbb37c9ebe62ffa GIT binary patch literal 4386 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 + + + + + + +Quetzal: Member List + + + + + + + + + + +
+
uForms.dpCalcDialog Member List
+
+
+ +

This is the complete list of members for uForms.dpCalcDialog, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
__init__(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
accept(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
changeMat (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
changeMat(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
checkFluid(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
export (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
export(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
fluid (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
form (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
isLiquid (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
isMixture (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
materials (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
Mu (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
Rho (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
setGas (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
setGas(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
setLiquid (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
setLiquid(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
setMu (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
setMu(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
setRho (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
setRho(self) (defined in uForms.dpCalcDialog)uForms.dpCalcDialog
+ + + + diff --git a/html/classuForms_1_1dpCalcDialog.html b/html/classuForms_1_1dpCalcDialog.html new file mode 100644 index 0000000..1825136 --- /dev/null +++ b/html/classuForms_1_1dpCalcDialog.html @@ -0,0 +1,167 @@ + + + + + + + +Quetzal: uForms.dpCalcDialog Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
uForms.dpCalcDialog Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self)
 
changeMat (self)
 
accept (self)
 
checkFluid (self)
 
setLiquid (self)
 
setGas (self)
 
setRho (self)
 
setMu (self)
 
export (self)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

form
 
setRho
 
setMu
 
setLiquid
 
setGas
 
export
 
materials
 
changeMat
 
isLiquid
 
isMixture
 
fluid
 
Rho
 
Mu
 
+
The documentation for this class was generated from the following file:
    +
  • uForms.py
  • +
+
+ + + + diff --git a/html/classuForms_1_1rotWPForm-members.html b/html/classuForms_1_1rotWPForm-members.html new file mode 100644 index 0000000..3f41bdc --- /dev/null +++ b/html/classuForms_1_1rotWPForm-members.html @@ -0,0 +1,105 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
uForms.rotWPForm Member List
+
+
+ +

This is the complete list of members for uForms.rotWPForm, including all inherited members.

+ + + + + + + + + + + + + + + + +
__init__(self, winTitle=translate("uForms", "Rotate WP"), icon="rotWP.svg") (defined in uForms.rotWPForm)uForms.rotWPForm
accept(self) (defined in uForms.rotWPForm)uForms.rotWPForm
arrow (defined in uForms.rotWPForm)uForms.rotWPForm
btn1 (defined in uForms.rotWPForm)uForms.rotWPForm
closeEvent(self, event) (defined in uForms.rotWPForm)uForms.rotWPForm
edit1 (defined in uForms.rotWPForm)uForms.rotWPForm
grid (defined in uForms.rotWPForm)uForms.rotWPForm
lab1 (defined in uForms.rotWPForm)uForms.rotWPForm
radioX (defined in uForms.rotWPForm)uForms.rotWPForm
radioY (defined in uForms.rotWPForm)uForms.rotWPForm
radioZ (defined in uForms.rotWPForm)uForms.rotWPForm
reject(self) (defined in uForms.rotWPForm)uForms.rotWPForm
rotate (defined in uForms.rotWPForm)uForms.rotWPForm
rotate(self) (defined in uForms.rotWPForm)uForms.rotWPForm
sg (defined in uForms.rotWPForm)uForms.rotWPForm
+ + + + diff --git a/html/classuForms_1_1rotWPForm.html b/html/classuForms_1_1rotWPForm.html new file mode 100644 index 0000000..b2d8c2f --- /dev/null +++ b/html/classuForms_1_1rotWPForm.html @@ -0,0 +1,168 @@ + + + + + + + +Quetzal: uForms.rotWPForm Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+ +
uForms.rotWPForm Class Reference
+
+
+
+Inheritance diagram for uForms.rotWPForm:
+
+
Inheritance graph
+ + + + + +
[legend]
+
+Collaboration diagram for uForms.rotWPForm:
+
+
Collaboration graph
+ + + + + +
[legend]
+ + + + + + + + + + + + +

+Public Member Functions

__init__ (self, winTitle=translate("uForms", "Rotate WP"), icon="rotWP.svg")
 
rotate (self)
 
closeEvent (self, event)
 
reject (self)
 
accept (self)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

grid
 
radioX
 
radioY
 
radioZ
 
lab1
 
edit1
 
btn1
 
rotate
 
sg
 
arrow
 
+

Detailed Description

+
Dialog to rotate the working plane about its axis.
+

The documentation for this class was generated from the following file:
    +
  • uForms.py
  • +
+
+ + + + diff --git a/html/classuForms_1_1rotWPForm__coll__graph.map b/html/classuForms_1_1rotWPForm__coll__graph.map new file mode 100644 index 0000000..b55fe19 --- /dev/null +++ b/html/classuForms_1_1rotWPForm__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classuForms_1_1rotWPForm__coll__graph.md5 b/html/classuForms_1_1rotWPForm__coll__graph.md5 new file mode 100644 index 0000000..e6a500b --- /dev/null +++ b/html/classuForms_1_1rotWPForm__coll__graph.md5 @@ -0,0 +1 @@ +abb9aa317dc9a54212927381e2788f1a \ No newline at end of file diff --git a/html/classuForms_1_1rotWPForm__coll__graph.png b/html/classuForms_1_1rotWPForm__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..851609ab2c072f60e89c80065f1b3be02eb63d45 GIT binary patch literal 3738 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 JaLSfp{{jS$hK&FK literal 0 HcmV?d00001 diff --git a/html/classuForms_1_1rotWPForm__inherit__graph.map b/html/classuForms_1_1rotWPForm__inherit__graph.map new file mode 100644 index 0000000..b55fe19 --- /dev/null +++ b/html/classuForms_1_1rotWPForm__inherit__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/classuForms_1_1rotWPForm__inherit__graph.md5 b/html/classuForms_1_1rotWPForm__inherit__graph.md5 new file mode 100644 index 0000000..e6a500b --- /dev/null +++ b/html/classuForms_1_1rotWPForm__inherit__graph.md5 @@ -0,0 +1 @@ +abb9aa317dc9a54212927381e2788f1a \ No newline at end of file diff --git a/html/classuForms_1_1rotWPForm__inherit__graph.png b/html/classuForms_1_1rotWPForm__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..851609ab2c072f60e89c80065f1b3be02eb63d45 GIT binary patch literal 3738 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 JaLSfp{{jS$hK&FK literal 0 HcmV?d00001 diff --git a/html/classupdate__crowdin_1_1CrowdinUpdater-members.html b/html/classupdate__crowdin_1_1CrowdinUpdater-members.html new file mode 100644 index 0000000..d59983f --- /dev/null +++ b/html/classupdate__crowdin_1_1CrowdinUpdater-members.html @@ -0,0 +1,108 @@ + + + + + + + +Quetzal: Member List + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
update_crowdin.CrowdinUpdater Member List
+
+
+ +

This is the complete list of members for update_crowdin.CrowdinUpdater, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
__init__(self, token, project_identifier, multithread=True) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
_add_storage(self, str filename, fp) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdaterprotected
_get_project_id(self) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdaterprotected
_get_source_files_info(self) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdaterprotected
_make_api_req(self, str url, dict extra_headers={}, str method="GET", data=None) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdaterprotected
_make_project_api_req(self, str project_path, *args, **kwargs) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdaterprotected
_update_source_file(self, TsFile ts_file, dict files_info) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdaterprotected
_upload_translation_file(self, TsFile ts_file, dict files_info) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdaterprotected
BASE_URL (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdaterstatic
build(self) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
build_status(self) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
download(self, str build_id) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
multithread (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
project_identifier (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
status(self) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
token (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
update_source(self, list ts_files) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
update_translation(self, list ts_files) (defined in update_crowdin.CrowdinUpdater)update_crowdin.CrowdinUpdater
+ + + + diff --git a/html/classupdate__crowdin_1_1CrowdinUpdater.html b/html/classupdate__crowdin_1_1CrowdinUpdater.html new file mode 100644 index 0000000..1c3f769 --- /dev/null +++ b/html/classupdate__crowdin_1_1CrowdinUpdater.html @@ -0,0 +1,163 @@ + + + + + + + +Quetzal: update_crowdin.CrowdinUpdater Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +
+ + + + + + + + + + + + + + + + +

+Public Member Functions

__init__ (self, token, project_identifier, multithread=True)
 
status (self)
 
download (self, str build_id)
 
build (self)
 
build_status (self)
 
update_source (self, list ts_files)
 
update_translation (self, list ts_files)
 
+ + + + + + + +

+Public Attributes

token
 
project_identifier
 
multithread
 
+ + + +

+Static Public Attributes

+str BASE_URL = "https://api.crowdin.com/api/v2"
 
+ + + + + + + + + + + + + + + +

+Protected Member Functions

+int _get_project_id (self)
 
_make_api_req (self, str url, dict extra_headers={}, str method="GET", data=None)
 
_make_project_api_req (self, str project_path, *args, **kwargs)
 
+dict _get_source_files_info (self)
 
_add_storage (self, str filename, fp)
 
_update_source_file (self, TsFile ts_file, dict files_info)
 
_upload_translation_file (self, TsFile ts_file, dict files_info)
 
+
The documentation for this class was generated from the following file:
    +
  • translationz/update_crowdin.py
  • +
+
+ + + + diff --git a/html/closed.png b/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/html/dir_13025d1c6197b87408f748a24eb3cb3d.html b/html/dir_13025d1c6197b87408f748a24eb3cb3d.html new file mode 100644 index 0000000..bc35d2e --- /dev/null +++ b/html/dir_13025d1c6197b87408f748a24eb3cb3d.html @@ -0,0 +1,87 @@ + + + + + + + +Quetzal: translationz Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
translationz Directory Reference
+
+
+
+ + + + diff --git a/html/dir_1ee13bb4f307f5a0ddf91c12f6238171.html b/html/dir_1ee13bb4f307f5a0ddf91c12f6238171.html new file mode 100644 index 0000000..4e59d52 --- /dev/null +++ b/html/dir_1ee13bb4f307f5a0ddf91c12f6238171.html @@ -0,0 +1,87 @@ + + + + + + + +Quetzal: cut_list Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
cut_list Directory Reference
+
+
+
+ + + + diff --git a/html/doc.svg b/html/doc.svg new file mode 100644 index 0000000..0b928a5 --- /dev/null +++ b/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/html/docd.svg b/html/docd.svg new file mode 100644 index 0000000..ac18b27 --- /dev/null +++ b/html/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/html/doxygen.css b/html/doxygen.css new file mode 100644 index 0000000..009a9b5 --- /dev/null +++ b/html/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/html/doxygen.svg b/html/doxygen.svg new file mode 100644 index 0000000..79a7635 --- /dev/null +++ b/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/dynsections.js b/html/dynsections.js new file mode 100644 index 0000000..b73c828 --- /dev/null +++ b/html/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/html/folderclosed.svg b/html/folderclosed.svg new file mode 100644 index 0000000..b04bed2 --- /dev/null +++ b/html/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/html/folderclosedd.svg b/html/folderclosedd.svg new file mode 100644 index 0000000..52f0166 --- /dev/null +++ b/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/html/folderopen.svg b/html/folderopen.svg new file mode 100644 index 0000000..f6896dd --- /dev/null +++ b/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/html/folderopend.svg b/html/folderopend.svg new file mode 100644 index 0000000..2d1f06e --- /dev/null +++ b/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/html/functions.html b/html/functions.html new file mode 100644 index 0000000..50b8af5 --- /dev/null +++ b/html/functions.html @@ -0,0 +1,154 @@ + + + + + + + +Quetzal: Class Members + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- _ -

+ + +

- a -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- s -

+ + +

- u -

+
+ + + + diff --git a/html/functions_func.html b/html/functions_func.html new file mode 100644 index 0000000..1cd3a86 --- /dev/null +++ b/html/functions_func.html @@ -0,0 +1,136 @@ + + + + + + + +Quetzal: Class Members - Functions + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the class documentation for each member:
+ +

- _ -

+ + +

- a -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- n -

+ + +

- s -

+ + +

- u -

+
+ + + + diff --git a/html/functions_vars.html b/html/functions_vars.html new file mode 100644 index 0000000..6db7911 --- /dev/null +++ b/html/functions_vars.html @@ -0,0 +1,88 @@ + + + + + + + +Quetzal: Class Members - Variables + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the class documentation for each member:
+
+ + + + diff --git a/html/graph_legend.html b/html/graph_legend.html new file mode 100644 index 0000000..b4da1a0 --- /dev/null +++ b/html/graph_legend.html @@ -0,0 +1,143 @@ + + + + + + + +Quetzal: Graph Legend + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +
+
+ + + + diff --git a/html/graph_legend.md5 b/html/graph_legend.md5 new file mode 100644 index 0000000..da515da --- /dev/null +++ b/html/graph_legend.md5 @@ -0,0 +1 @@ +f74606a252eb303675caf37987d0b7af \ No newline at end of file diff --git a/html/graph_legend.png b/html/graph_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..15bf62a2f49d3dcd38283293de89b3390e2981b5 GIT binary patch literal 23370 zcmbTe1z42p_bxoNA|cX^N_TfCUDDm%DJ6}fpdcU}O3FwMDBU1POT*CJ-Cf@^d;k9D zoa_7k-*ugH_P*5FIP<>m^E_+a>%Q-`W`9ysk;BF$!-PN}*b4H}8W0Hb7K~@5tDc0gNN{DbgW^GTQ*FJ@tla=NZ!-40@lWO zjAe*H^UuRc+cPLs{`-_@wExR1FQnVRQ|3D{zsKanw%cm|Je+(-6nW=VrK2-t7^4hr z0ejZ__ozAEJ2YHeL-1_G6Xkr_nQzW~M9e-RjHMp25_l3LDladewf#ND=DM-l%Hnuy z?89X|8n?}oG}Z28d`o}2Gi3x~*)DXnw1bt7<4(;2sme}s4YefCnJKKjYNg?rd<9kI z<gu>xQ*9w?%;P?N1VtO681^G&P*@vc2|auwA|jGfQn29Wo1@C9i`vMKAoG~~A#s_Vj2j}P2cgB?t+RQq| zDSPGGMLLJ4~F$e5tqm7 z9=lU~=vX8zSuaD2SJ5yqM#^nfbH0BU^4xfQx;?($PHdX1n8;k);mH5>a<6{>;$k`G za_y_@!P(i`{QccIC7Z6!UfnjkN#Lorq@?5nOiYW7!R!jx`6g*oqmLGQnvMG{NV1>F z!$TXz@H?Yd-(K%oj%SD&y*jo?y+{!6QBY8T`^rX9$Hd3ut42|DLwl1q#oV&Iu2Rcw z4o_CPE9~H(88EPyrm@K{yxY(r=xAto!hymZuQL9I;)=f5e~U6%X^RWFy*kPMk;f3| ze?kMo=Uq59%0l8~d8()-`rYm{&+82}xU4iME$yExf7MrMf8wlrNx01*eT|JHfeawr zKenFtu#|H89$DSo-jWKvrga=IvF`fv6uy7HJKZ_)%d$Z4*E3bIQvwVeiY(1M73Fl{ z#7-*z&lzI=+zz9R-a8YqE*a)+VdmVa4{&hSPBup_uCC&~eEH%`fq_f4QoEk5Vp|@JrWAFX4}{bRitsQB)|j!#AW~ny&hM1D+@^0S zoH{5=zuX3Lae1i@GvEulJ=NWU!yeJbzz+iygTQWV%r%PG4rD;Rd(wBY$@vdveddQs zj71zLZ?Dg*y$2p(Vdbi%3kRHz>0&95yh(N#&Q)l*J)6d&5>4TAgfA>FYbHcux7?o3 z4>*=Kb_CxYQ&%}pcg)m!_=1o4-ky%bdYKiYEmR8|sRKCYk9l1NTdwwd5}A=6d5+WzilDe1jWQ9j>bG{A1}$ElZr}KBKFJs>vb`4RRL!8};)-223E-Mt zS7cJTx#1}(DG?MBHo$iX(P{sw`4Fsmb?k7tGk&0NKrDIB14_W4^6e-67+6w8kZyqn zosp4I@k6gITQ2*(&nOkj$3}^vp(t~6a}*LmqP>DwXS=)RsL}jJUyvj?+2NwaeqD{I(hoE zu1JIKuMN*HclVjZIH$b2pk;LDdT;BE5TwtfT*%{?gnErGl=WwOeN{%dK0XN=%3pbz zMnaKrXMCuM*-ciw14OG`=c|IK@yWl2Lx}*4{z*SLIFJ_?Q2m;8Idjv30uQzo&0B}w zyLZrv(9?%S5VF_^!7?+cgMxyLYF~dCkhuRQFdq;<^j+?F!ZL=-s_U_^_s&Oi0+rIK zKYyg*rKSUA*1dZ5-fV1!RaO890>By7)YcOAxPEN4J$5hLp7X$+_TDYKqr4lE^UbI> zzrEtMpGg79ZqEM|Nzi)<)j#LE&~+!ZQPd~%js&I?Osrh%<27k&(G-^;u%x>tzp*Qy z@95Ze!})mNt%r`|IKif-0fyCUgQ^mXi+d`|=-3B^+L1m)tdJIqUk7Ix)C5+CA3({7 z4V8@|8_HF{KiioM1xvcSy8~JJdSmdZsHiBW*4Z#r3HIrM+gIT+f zGw9|G;$*;y6&Tm^|Ni~^X4~|hS&h{`ic%!0Kr?S?cef8@^2g7gtya2X(9yZ~F4wtIm5XmKEaB493uCzt*+jf^W!u8O zUG54f)8n6=odr~wAsx>JCSMy?|Cp1)g*sXjBly4~H~5%QZ5$$-R##zoXms zfBT)VxaSkZ=Q5K*|0->;!Pi6BXYcPfA&;8-yX#}o;P0|gZ$OG&f>J^%5ft#&LSegd z++-O*VZ+5z<66^MuXZp@}WWMi+5Pn^3q6j^Co0jW*=Zuc;L>M(;GwIuUVi? zdNpq5P3vN>R~~qKd-DRcoLvWqu)5S9iTDrWqTQyz>w}}C9KRk9O#oCB!k!<`cBc*V zgxr@<>El0vOhs7$TMWQ(bGn)X}#?i$V_bfjzMH&Lj$-?&xvnGtl-S->gn>MMW%qUj+tE ze7EGEe_)b;E##d1@;%1|2@lqwC}LlLND}E<56-p)G)aPl3av-~{FVBPxc}yrHFE)+ z>HeR05MVl2d7aB^Na{b=qdP^QNn&D0uE*ySw zt&D^%|8q&E)fYZl$Ph9fBJ^o~8uelD)+zS4;zVv$L0RsKWqEnnQvbZq-iDJzK2W?D zC$z~At)vP|A;HP|Spl3=?^g4WtEHG%%84}opOax|BoSaekd}*nQ+~`b_#JH#! zs39h*p^J*Fz!UcgT?G2ZY7{*%dG{GUVo?PvU6xiw}HK7MVd zCS05O4=a`q!lFA?N_)jvw-J-?6d5Ajt-BTPkUp#ZU6wS=NF8x}&-PC+3v&)Il=W52 zI+xqYzA*ABdTCIWz4T{3peu?f<>7b|VsgYJ5!gP9R1am`HOPjW*=QC9HL=Iv)qd_2~dRm37 z2m34odWoG&UWFQiX3e(ssE*Xd_Zk#}9KFvGgDkQ#8-!KSQi$`n4mF8}XAaN9-9N^a zj(XoCjs-+T?w4Ex#0$xf$Z`K?ub%mPge+I#NG1e8&sI79xth!?Y@0Ng7yA!&O$wy}RdnyU~`uRs(@H##|ax!<7N?6I!0 zo}Zu378@JO7a`2AUXu&`=RucnWMpOG=wWuSai5)uL$!|mL=7S{C6nIBm>2;j=nW*# zDCk@pcItzKgk+egA>8a9+4>(DB`xkW-!#j{#dYWo9aYQ1{`q@u?rx;`N8iNlb8hb8 zG0x9?HszPT@!h->`9+m;`&(PW(?B@>&~Ok6F(=8ClaZN47e75de$=a1qQU%m&B?>0UoX3;6;)P@;UMrt_NX=rFrL$xY29BSJwd_`$! zXz1%N*^TS07@;>dwj>>$Ek>}@^Oj=3XKPXL*@$}U!^}^r^jKX{f~O`Y zZ!@%OK^43oHfXN%+SUm+`>5e?p2TLTVh58z632b;phhE~<;99(oWnl{>a?+{EOYou ztI{D8>D(S>J3T!uaCmy!$358>{s|C-c_e8WnOevQQi4XkX4Cys8kz-V6|`JWwo9rD zaj>dy8imOkTZ9XJU0q!`U^gWQIAvpTkFs(Qp(A}}gM!NpokPK4f@Zu@R=#QO>XHwJ zRo0D2CThTmd-Pb7nnNOd4B((R?4#2obD$(v!jCB_C{*U{eV6*>mHtg(_M4lVB#07V ziSR*-Usz)X98nPwWz&F^IU+)lGga9K$+qlkzZ3tyx?(zt_-jwkoiVV(HSg}K7)cZg5xMsCh{>9y z9@YW}oAD6T@3RluE>>16wnUNEvxp;LgeKYYU4@&IIE#30xYcq7X%gUU{#(w}Az<^W z0|Ns~txwaNn}grMgNSFwS{rcBV_!ET#K(5{VB zi+sk%ELloIn5{b@jDtAU1Z+PcgJ8vA!_KFQ;{TRAki{Xi{}jIWU2_x*Z%Q;jy;h~t zB0%I-R~Xq}Uc*irMU4N?d;jOB{&!z>g_-ng-7-ZvQ-(8M{*OC4Exa_u01xw@eR|JG z^MC!SOaMdBWt&F2+tzj)0u~EOIx}C2eO2_!1f2ii$Wv(~g?|y{|KOE1nFfcTU`>@q zA&l)E6Jy{iF-8cW#OKvstUi*CjUGceGQk8glThFKh@B7N;iZfbuc1u|$}*LWZEbCi zjxcNgWE91M^zU*p>~Y7+_G0I2KU`-6Uj^SxZ=ai56m?DsC$;J%_{!&MHTFK5v1X}Dq{kw#Yx50j;J-oq-ycralUOYb42)x- z_N=dOYuuNCAaLfArR|AtzP}?64i2`k?41dnl}r%k;^M+0;S2%rG%1|$L@-aeNw zd9#QH!~jaj*RSNSzVcfG^{EB$l`~?1R#1>cRdpbs)5g|T4*ZBj*po3`#D_g@q9-nA zqQtV}^Wu;kH617CPc;kHoue09f79#Yui`QTg*f(d#kW=vTW?8UwX<^6$Ea zhK4G@tp@*p)`W0BWFm=D#bctQ>1k+M(D4#+BN`7_bjED2KM+~(PE{VBpJTLic7_{NI{XT}_OA2XlvGoD zJo4k!ci-bRh*48OYE~8v2%k{E>mdRzGiGalQxS>+sEFgGNDd9CVj^p>BaqW48$+Q~ zVt#rOhCq}T>6X$1u?ytH@gICuD^kPt{`AQTd;IP3(&`M(Jk`v80PUPuq5gZd;dsww zfklI{eN*qVZ}a;dno*tSC!4-BF6$lwgsQkb8#fJp<>bWL)YK$;y;D9hJxv?{O@atH zk1s5k`JHaHzeU0L7#(c`Vht4)^)VGy|BqK+)fDkaNV-1aJr7wa>ceMH;q*Uq62Cc+ zO5?R}y}3MoJ2P&sGkvbo%k#Cb;S_G@G+UPltXZBn2MZL*hFi*WtJO_Fz4W5tM_ktijxW&_P6RC4}qlw)#E#&&D8z;kaV6~NEYa*TuqaBezc zs8##Y_};GEx*smJgD49p<8v4UUV-PaBkXdgd;kbP3`HhTT!F!-DDX;J8g)MKoD%4@ zlby+Upp8+w*CT)mHZT+g`q8x`nzA>JPAOk48yUD|(7@}nZ-Vacp36n6mD{`mdh-u( z%r92rRRJ`hi}|1Bs%DC(2DvVGMEz-R2iW;YHk!g-Y;(P$VZY%R2kgJi-OVK;l6mb0 zLv&38`Np|D4CSEeQ;#Bnm-f&Wpu6}3Hz4GJ>D{&8e6Iqolq&31$d?*$e|ugFZbHbc zWd^h_I1L_P@)c?qbpWX=7k{PNrwd^=X8 zdkn18FDWT@#&=QV0!s@EUrPQ0KjEiM9~lC75ON#f+s0TCv5Ja{Z$vZeB{+*W$9)1q zK{tY4TchS6Lcn@kt^!rOFcykRo0iH4#M>q(Q-RM&=-?zXoCjREtrTVYJFwvp@7<|( za8KBLXJ;oqA)$}#GIVWh zN4SpL=dKNh=m=9bJDe)Vv^mIWs^SwU8Au@PD{yJRrk4Xi{cBUsR|VjHVQ;U0;diJI z@H|4%u`NJ}K}AO&{$(lmPr=!pwq;vJ>^8uu3YXb51nhv|%Zn7sTipeI=~$umcTj>s zlzjqNu~zVR2ClAOZa+c~ylLPh`;!Q`Pzbor<$^WOH2C6&fDAi4>gDh_T2YYwO!77| z^3iOa*Kbcvs4l$4 z*Z^e-uwsN~cXM+*@R?kIefpC7Y(U&=ivS$P&TM`1Vq3V!e&hKQ09T-Q0BTgW^K{i4 ze}8;3GDSN(yChf{*cG~G&)$K(8Z6LcSnE$$iX!795%c4nu5y-g3}h&()7qM?7YM$) zWWc9aM%c%jWa=J8BE88Rw!lCG(KC{#N^SEu-!30lLIkTS@I$zkwy3Q!NSY9xHv(OQ=rbR7UX4= z1!Y#v>*T4Ve~gR-yyqLg^VGq5X0Qbb`heIuMSp)kIIGvo9oUc(lg6H6{ql>&aOz^+ zSx~OEigcn(gKrZ-rmy*4DuotTZG#Mc1L`?ajpybQb93{Znc8?z0Fe+d2dZl-mnHhE zG~VBReNmvy8oq;*=p!rDSf9S=+oquyc_D(}HcoDxV?0rB4jS+s94Ud*6X7 zxdD-+$4aDAtoIvalKp5t9t12&^!P6iOl5VQd3h~SX%l5 zfW5rhE`@c*0Pq|s*5~QZ5Q|Js){X9+&U%SrWNcguYLWeH9p8%*Yhe+Q^_u9O9N>lX zc&sUB`0okPTw3IUmQ?`QM7T&Mn?c0_AdP51&;GMm;Jt36ZBqx|{05z-X3twUKot9c zmIJjIPzd*}QKmV+Z8joSy)R5*;3`9St#1bTE7A9MPiWpOSd%OG21Q!TEXEDf%%oY+}%kSSvApZc9 z$=D9)jHZ-wd{ytgI~=&Tv}AGXvkiv9#1j{c;nSoUD33L*f}! zU*BGN-Q66kZX=xn#IXQXh1U`O8KC?SARpjlF=)^46_k}LTpF}M$KsoyI=xCtt@C)r z!;$WI1}?1U#uB|Cu)icE`~gs2JR3aR<4jpsTf15pc&wQL$PuVH@OWagMu@x;;I7@O zf!#e_vCn;XE5}pB1BK;cs8#_P+f*R{kygCo71(>$FVV&cRB@_!wH_;p?A6ySaIB@L z^NGyb$TaNi(I9)5H#Sn7DTP2$4KqJj2*ov!aD*3=0&@l&N7%*1n+kYpG~1=`+Vfq0 z&~s>+oD?!nKRP)0d3JldnrtessJI0Bi9U7Q2^!zT1EMm1B;|7;Fb%q-16&#tw2&Wx9$YRsRi6qYPy09|8Zj<&;Ih70J?X|B*-Yl5`7LvS%#*^_<)9N#ZSG#BNb!>?m zn`;BklqO99LY=!`=a1NpYFc)ut7`+Vt4^!e^ zR)n%*-?&~ao*TED9-NVp0mv}ZtSu-ZfByWjsvGRCG1jQ9t;M6JRt*Rc1(pN^j!M)r zJDZ-HOY1V%U>|r#Unvq^UoZ0M)2Ea^8$hy?RxewvxDhQc{VFrt&usO2n#Fh_r%8`bdRgWrN;W|ff}@-QegLZDX7qrn=picN7pNQ-;4c7kOaNFh0&Y&R9j$>WAW-dj`ohsT ze?OnGLVT=%fewV9GQ%(^7G=)U{M+-3i;JmirgfeLUN3$2X1W1q-UJ<|lIH23=Kt{g zzo|Shi~+!_^uxP)dH_*@J)8o1wHCBmd2Ie>0WDeKG#R(CVYgiY6tFFzxPZ-$fW}S7 zXVNxA1M1VKZ1wN5y!ONI0i|A8Uk?Xp2C6)eKa3;7jIh^JB_QNSKY|D1cAXR5w)I&1 zo9({b0f*Dz;^I0|PmlV(HVChEp1(;NuW`2oAo*rJ-6v#)WubaLNM!t!#*5zdNYk`T z1Moc%3wjlHcz{tWjh{ZRKE=5##hr}ZO&5`nkZ1za0iMhC>;@GNaB*Wi*?NTvOq<0) zaIor^p~}xuYu;mbvo)ERn6Mhv3|>vXLwi)5ISw;SM#m;Q=pc91i@^muyaeJL^2XN} zDng7XSw2lIv@u(QAb)VEMCFTgV0NIOh>MF;09r8{S|HT@Mq>c>4^KJ);|U1<8%e|l z1|vG>=QBYiv!0|$rv576x(2w^H zUs{X0SX)n)Sp)X~qm5G!sAK?%)>kK+*7Vuv2%6-7zV|Ab!)3lH9em8NdIV$)q7-s{ z?L*LFF3XOEm6bmr5g)9W_y8v03pi6Tc4H(l2m5H`sDyWyu zWr5y9P+Nrj2dA@mcfCJQ=@j4n2k?`AP|yyKj+Ou$>E~Vf3v@Hk!kq&HF^B+jnH6qr zZ4Ft8-+LY-D%lo>4MaRPXih7SSGJ6d#QV(oh6B9_WHPz1=SB;tG6hDp+@QGz2vQl) zBjBvTnHspkQWY-|(*2fX|}Mmz_^6=GSSiKut|^S1)hXI*XAg55+H-XE{XxBE%lY(88LML{FiEz$6|o^1ONsn zderqCAzyOv-om$sm1@xvkLS>(9kH-M4T`{n6 z+0JK815#ygZ*R23_$y#|>P0$iYXh08fZAeemBhs0f}<7$0f`W(;GhhzN7iLPX+!{~ z|JjZ?P#I_ubTIM2tDnGUcYKyIMuRQpcd`JGrQx_=!;Y}(FPVVf|QTutA~O+cmT5M1_I77es5;0A6!Ss|BMx=#>L+l)K(yH zM}fv2OnN#Z7LM>Gbrl0+tE_1R!f~lP+S@+>{$MMDFew;RGjah`f(HFB$8q+6z`$QX z!2+cQG7l6pG{7rfrVD%J8`YM1&4G!H<;_j|Mrg{RYs(bz5n!|cYySAP3I|;LJjER3 z#46N*DFVI2JsTzt=r#Z>C}_bTYS{7mKpy$gI(SMT(4qnDvKAVhM_}8V!)IUzTl@Oh z2DaJ9fF(I-fD2HAqd|->N@TJmXJx9|l^Osi!1C4ICUbGZc6S;t3Dwnx~FE?&_ zph%bRJd2%f^1Hk7MU0<(OHUsO%$OB7AdAM6X>0@{{mK#6+yxtBX8~U04LEVI*u~Y= zMEgcc@qiTIhZ&52YPT>S$Phzt#ri)pO@Uv5qFUVC`~(UUFvP&&==CZBb^@?~5tdICfU!VG1M5DJsNm3?eyod>vG8zgGjagGRZS85!NZ44z!a93{|Njk&!+e$kM(|V zuV5>`rq$BsJH%rk+V7juj^@a8g^sea2!Z8a9Kc%yev{kr+ADwzU)Ccl-Z5@9EURp{fv&g^ zkbPeQ1Xzk}^EJkGD;>tl0tPwj>rlF-w5UY9v4HIY61@{K7y&jVqw~Ih^NkT>VBzuW zqJg%y=d&nI_Sc=c#*6x5f0Nv^Zi>@yGy zsdd=TrGr+hO0B)j`u6BZgc_aMs{<>6x27-tCT>=ox%1;YFotCjJ5p810nd}D9FYMAU|EsmY?OQ#D z3rvB4?b05ufo~3vUANyT3je3CAx+czipfh_^d%<-9Q?V2B zOYd`$!6pfc1@9k<`d<;#!IG`mJUE1k=XP?wbpM&+?E15u)Z1SaUG2)`248?^$rkjy z*ea6eGoZ^(ltIC?4yi&J4eX>^J@UyCChE?Tp^FpE*TY1E4feNfnm6sS@rIWkY+8)*_vQb zbJ-+(F+l`@I^p5#&KB_~Q~eKj($&uT?fi*s=kfJ?e3yBbi^^Q#!N8J++~jR+@}pUBp~RyYchb`5F@)uX}+&2Pnae7kel*ddB6 zJZ4WXy;HJ>(1mXU6bopj$g6jLUf0L$9hZeKx))7^4ul?QnLaT#au719Kl?F$wtH0- z-gzYv7$C0d_L^B&wUz~{czaegA(WyrH&(0qO|!3)ucyRsM)f#BEzh^9-=q*aH3>1zG zI1@MH`dXLcDX_E|V(zZtrY{9ArO=xCtRsij#%(s*M8qI@$5gLHt-1GphNS%0m;H)x zp-Q)rO7C5lynI`P)2xD_k2+)@0gY>u(Nnr$G z)+X)K{rBVdUAL=2!7LJuol5yX*_pi$pF33Oc*t!BmI^F(CIxm1b!vN+k}b^aWr zxIlY7>s^5LVoq8ujWSiHc4b~z)Ul|TE|}`IAv6r9FC#umKO?C%X)fZMzF^2! z86^@=eqX0`;hKT(AU~WotAJAx`@ZhL9#)8i{fp!gcH8jQ%$?1cRQ6bonEYc)e5bA9dds|q6V>tlEX6L&0zM`OdDw#{(?7Bzzdv;+m;RM2P7((n&m znEWD=!R37_w$*PsNnnX$iYyCK@y9S*+1-OiosZ^8esNmKFTh2p?2;_h@Y01| z@=R*Z$4Se;HjA^$!_GpUr;U*DGflj=I9_^jT8-Vx(Hy3MB&Uf5Mi ziC^p2r~_*=*v63eFw)9Bi5T~@jMI2J(w})ht8@6ts;z0Pa%VR+=0~;825a1}UU&C5 zL6fG|0;nmBPs3z4FwfH5prj!^SN*j*cB~D-=PvYNVa!VIoq7h1lQwzf+s=93BuV{t zW2E^$b7Cb18%ZI#B5XVjmv>Qi26iW1UvB$!2`y@@!)V9ow7g+(vVQi5T0VK{{40jL zaaO8^Xz4>2Id+NMw@9#wY*wdc*eAU?<95R9cL@S71=V7$?Wh>GMX;;on;;R8IcqMw zFNf~3=8ujY;NK$Pr8!z_PYn_jr5zs~97P?kuYaK5kIy0bAnQQ?4ISY>mCE7r`d1rz5iFHNF!U?|wlA_z_XRQ3gwCl1a|E(Bin5ua2-5ahCI(tzjrG|P0 zN+H)Y>*6(GKddjFJGdT7(;qS0ec-S4A2hbl7#dVy>bEqH)ju{xD^K|CcDLDKsg4;5 z7p)ak3v_7vsg(HBX6Tw=6zNoK;}w0p?`>BjoAuw{7PJapOb1%;OOo>SADqY>|5=h7 zUB66~coSbzg1?!SU9RDYwgnL&+!_6;z{Ec`*N#+MsnaFPL)hn-yJs6g`{Zy*>Q4Ex z>1kTtTXov%fFSgSzGu;sj7zWgy;KKo8CPK*Li`RjJ6{q;J(r+L#E~pjM-B(VyL(m# zDBTaeT!Ks~^7ojwQl#gwO^X~;ltmSey6`Fq14{YK-N!GODjrxfV&MjP{&5lCfCGfnCFR@M8Eaq!c z98!05KpH35QF&EH>}B1IHL3eRmIvw4e(sKaX8FgLsXs_Ri?DxgX_Y4ML7D&Vo7`Uf zvM!9EXxwqk&%}_mynF{aj#Yul%iv|{`arsfe(~=_%jeBQEH~?N-%XS z$wRy}Z&n-Cs*w*CZqd>3lBa2!B&7TGMreS% zn7D(pEE8IQ$m-2y6F;^JC$l6+ORE|I&dsroS=3V3l1pI$nHY^u=z^&mAijj?Rf7s zb@(HvTI2o33dWKuM2Rx)!F5(%-SXj=-trH9=d~mT*qjv+Bwksmyhe$Vaaxf93Z%Lf zufk$wSZO7!$`sn@BcD%OhuldLMf}$H%l*ta%mj7p3jSrwbzJMReb5spWMaaHT`qJQ z!haOdwQ7Ji7yUW5z`&);Z1+S^u?myhD zCz9E(=(pZ`sdGoa!F!~ix6eoZnf?;V(T8B(?$tz`i&N6NTUpgJyAPZDnx}?jVbI91 z@eb+hmDAn&oCGjtN6_`rtFAEnK$TSg53yYiLG|Fyi}JRd2^ZZD`JB{r7_qHKs^eeG z2o&tZI~UkmzdW78>~2Wot9F2%`H$vvSu1;bK6_!8F04ZMtX5WQdpG;7SmjN8Qt4=GEmSe@__;uNHZ8^^flw@3VZdY90jSur_d%VhtE< zp@d=9Wot8JJvsQQQ#X=gmuc!mnaM~7_EeG(44kI%H8CliJr5yvGyaXsT_*ojX_qV~ zRr<&eq{;^?lhduSA4Ux+_6h0ZVq*J4iZb6vub9^Ru`6YqR#jdv-OvrPbKzyi_!oGP zGLTXguqYB&v=TQc=#DF3VPqihssGe>Y;E|aM@W{nchMJMtv}Ir&5(7Xnd{r~82X%7 z`tzr=*svIGl{g3WT<*`T!w+ke+UTGkHGXzmSd7H=E4o05rLRh!roWA6T=V!U6Y%b{ zhI-f9Sm787OqT`LsnX>3^e_A{!Rz<7SH4a|e%46Ni^@Lm1B~Bzb+zqaauy3^sdDWR z%vVlUr+c>5X2_CYG#LY{mqDRW=9dB@4X7zY&bF z&u!^p`i*2Eh5{+hfV`Q$9tWLqdWej(_Z;-eZc+5q_|kirB_3To?O3agW88U zHWy82A(m6IG8BKE;uyO3Tilo}2IB29P#m5cOJQm=k`OwK8HB=dX$@HWOo4UNTNPbU zOxma;P?0hLGdsw}7$mLu3*Rt#SiFsrVTTRx8DcIgfm1J>u+sxbRY=qYGX=S(Y19XEX9bDgLjqluFjc z3xM%6jz06o-B$ejng*G*>o=Drw=YewjpRFI9L6u+1VKvb^$yC#Qy4L21~GRR_GB{? z77v7x@kjlLt|Ki0s_w-wz{P>rEuj`vas8DgZ0Y)Rhzk4T2ReJ%4 z#*DX1_pC&9th*&Sh@T{z3pU8TWoeP4$3N~}u9;(br;`#LM4BtreJA=0z)8V<^6hGW ze3t;&kAg&VtJvrl)(a6~)C5kt5w9Za3L2V$#rm-Iy~r$&7q?rYosTiD^xP_aMMm2BjGNn5=;{~abxi(bS9;WJ_O3T z<4cv}$F)~P$6uqKvk=a~Oy{}o;4o*qT^j{?JE7Aa!p-wc)wc0%VfuD)v)QE=e25Iy zu@7q_N2ay!TklzDY@Z!ft%`=#G)!+{_^iL_ghZNe=EPmg3P4;ShJ;SM6$VdBk%(np z0#u-fk~VR8S>c(sFzt3d`*apyI!E2py~0#zZiCw0<}fB%7q&7<&gbZ-PeV2#3Q8jb zVyEMd%$C?`xY(n;P0w_zohUW!xkWWZNDohRIq}};{SG2{v}}IKFsoJTPb1Wzf6_}P z$@h)F!r=Sjbey=2r5_oHXrI%{*k=98HJQ_PH z@I74iDtHiivw)EjvTVQ*6YE@NX{kp{r|O0B-Yh1yiBVF1kL>m13rMK-Fdwb|vBTKb zM>zT0^&j6P?n^-05?1K^#tSIPj@PKr8-3NCvgMn=y|W;1#;b1xU<<^VWs*90=kbsC(?xskbO> z1ZzIo-YOQ8sH$7d#A=7^32p$Zu~eDB_{gygR4X4|Hv+zR+eHrXz@x~{v+rw8{Lz~u zH%esKsW}Wx9eN+!I+i{jrnbd&^j0>aBoN1nub!luMov5Xl+WZ34q52cF+yi0a{_xt zCsy_8#=vMskuCpMx!4=-3|iPJUK=OT)#YV+Vs4!kVu*jC;DIsQ&^yzfu4l#}buF*Z zMEIPB(Roe{GJn6$+K8 zfUDNk+7(szgL{OXu6s}AXwYMv@aBtfzX()nUmbI67@PSoQ8yi1lG3y1fz=v;JZ=193~AD1;O_#i>FmilfyEOVqgq{MsRhX zAw&+zALjMGx%pl)@wLiCwQJ@r`2KW;j$$Rs6EM?%4gMv6+EB>zo5LYlVBDh1)L>8 zgEB-NY?l{kS9nllGjMa4HEC?w!YTt_ym+C}V=I-Q5r2Do+gJ_u@R1&-GExa6w9Ww* zdtrQfnBjcw-R0sCi#hWrmF|;5F-|e8WJc< zA>ozq0VG>+MQSjMO!lMF1dQ@6z`+*`SgU<>W+f0uW#Z^OY#@@R{Nn}eltx6P{tC2R z$6rSXd+`2Wf897q$+Q=+u5i! z8T`y2Z>WXj-K7LU+uK9E6lKosUjOkg-RlF?nY!gR4-^B>>hjiqcN4P*SZt>#V)_Uq z+2w!VwZkJ~eCSm;x_I!{1|5Y6c8S%#K=*d*e!Bknf^pkpe>rnILjn1H79*y@$1+hU z)ItB98XDHaq6#h8J3j*!`lot^r=xWzC!(rfGsIP4&$MT{kw123Q2o@I#(en6>K&^A zev(5>&yvd%Z{>-yzky=Ge`(PRA9uZ0Z9NTYd_$Vjz29VWcbMj1GJjs(zCAT1xhx-E z({DwL=`zcEq_j^mFqv}Gx@pwrH7hbaJZysW02TRph$Hw4iwhB+_E@r#lG4cb_ICW+ z7W>AJoOq+b59moj@3Ccbc>p2@68%R;F+-V+9usl;mQ5_#0HKKdg zczv?Tvz-&kUWjr>@c{M7gTUkPLL7+rU0K*wuW|}!_9azx>kArAQ4%Z@6jm|yMh3sX z-^d&bql9D@FWZj}GBL`OM(-6U+Y;OYGLQ7M2p;k1IA{i#{v?-C(pU}YgjQ#YdL!d< z#)r3ke|jIGA#L-9mp0ngH-%>j$I#DRr_lRSiqb#wW<-C2d0CDqnEM2bK<9QaRV_;zLqtG!V z2W${Bq|?0#>Cfo+cquEJvoJx$*Fuw@U?gR)va-??g+H9!p|!HHq%i8$sX3m|DjCY# z7t9BNS&y>C~o;y$}E^em4aICATK?!{+avn=i1k#AgD-UkyZ6pJ3;h=WAz z1~)Rna62jabc%kyec=p;o9SMn#)g-eNe|=TJ(?9&7*^e zA08+*QXy^m3CuSJ@0zsPC^rQuOSY+w=PE7OYo6Yi1}_gpFaIeFOHz9EN(^G8t)Vfj zsog0UecTMtVx7y`VI&;<6WL`;F+Ne`FfuP=Md@}18dvcn!@~xi%m;`b z7BUC&WXmzQI$o@4UCH#V)oI2`Ws0WRt4c0s)_@5~_X}M8;34ss5(QhFDw5$tGwVgr zr{7}Kx(+!Drz(yPfv`Cd&0=X#PlTg5(~drNG{a&1&k(^*-hH}$E%U4#Flzd`!fmlPf0@iHz1HKn>7 zIMzfPVeF}_W$&5OV!~QfL!NO@K42BamzCO^ZLD_)l5ABbR$QZ_osp7h4>cJdjkQU( zt6osQ`>3YR@%OMUBRWaHII!~VBy}4uT3oC9n{fuOWz|L3I^o2;FjumLi+647Nilwh zy&3WP-kXLk1HwOx`Mri@h{wPh?liPbF;S6SDMjBL1W3-yb|B?DK$iuBu~3o47d{r^ zJdQO)0*Au(|ta$Zu!Cu~1~$AK!fX&n8`k zb5V(~>(gQj5>G@ue#}T@ZM?_3X;5C1851@G*^wLgJoLr)(sPUt?7{ z1&%=(WZi2c_P$hhk%p4I?^Z+(Wz0Uv0+4Vm{k02UTGz6MT`%XnXTdvDH4BSW1s_#p zJu#W3Lbmcv#sZ(OZtNcz&$!D)Q%rJ#u?K??z#~i^W1$ZyDk%7tANqo`rh5KNL_<^a zyuxZ0{3ZS9*jW4d*4Xwgn2-B&8PJs5Auq0-_=4s@yVJd{v!kO)#9=hwl7BWSA>l&X z>*xG_%;wPd&S~)dapARZpgwtdgL2A2hr8nmY7;synD=*f zZU`$B2GACfl9Dn`F2I|Vm?#5!^A~YpVd!8CeE%yLoFrR0zupF4Qn;T3AvWpA#byao z6OUHJFkQ8|TMe5MD*n(K(~U^&)B9*m+}56UO{gPpX8EQZfdGC4&UWa*6XO70D-(+) z4Xr$Zn!WtsqQa||ZNDi)zqfZqEdhj0jdq2_Cv_QTXN`nYMfEY{A=E{$A1(@t=0)G{ zI1RlOdd@#bm!oUHu|U||YJ+FITBo9J{Ay;ZpMTg~*}we9RLcL;$$3RJ8FXtHq@#2x zQUZd~4MhZ`s+52y`yx_#C6s= zH~-atla-6)n>~B>o;}~J{k-)3$QYsXTBFK)4Ka~Bki!((6VCfqxraAxGiZi3bbB_MiL}jzN&%^$$9#~@osyX zD^jI$J5>S8Lx{{f5Tz7}5c-iU&Azm`h$I$ljWBfyLsIMU?szMDnTe|K;Qj!_U29zG z3s25dcH`9#Zz(5T5d_~wmH@kPy0G3a_ceVi>X?*a4i_tg5~tRy z#FBS8N`sipU+O`{S$Wx}zXF2)>;C7JS4g6qlRbySW(8s;_75DLn7khaju; zPM98i@8%*+nOU#;J1TcRYM8wLRf~avMSM6%_RnZcOq?x=cw7GT6_b~1r}DOnzWJ9g zxtxykLJOnV0^J+K3p4~xW(`x~o66Q=r46C6+`ACTB>Fh)&NW{t$u`Nm)XANf1pNrJ zg?z;RwLHnG&AAD7-0rOJqH;2(xw&tT3%>FY}!}7mX=eNQQlqp&E;3V2}zg z?~lE3a!54!8;CG>b2>X8A3=kEv|04616Xvo+F<*E-6bWC?a`J)#E`l8fx{v0TBYJG+{vZA zA4@7Gi(8DoM$*3{Kv$h2+_@i!)_r!k@yX zjb5J2`KiB4uqysmW{@)FnIyUM=I}Z{q$5l6VF1E9Zwyh>a)982p8Ui-(wVUo8uZP5 zScqBp0(>xg=8Dg&{ce@miLOK)0_6yAk`8PC#I2_LF&1dVQffmc57txt6GHqmecV&E zn9pGeTH0ee4?Jv7j**@tW)Wk<2-6KgTau4T6{CU%y%U~q&%C~n7<|xch~^4TiDVY% zg;uaRI9yWW){y8k@3;ru3aLS^uix|OMP}lLj$iRXWn7jyha|5A>e%_n;F&L6(sAT`|tr8 zf=F*sgQ7H|kzI)$=LDBMGi&U+Gu)fYh@)rgXBMPoK}w@NliiqGpQhVvmq*;+BF3gY z#Kogt;Fp8pg^I!E@E+|f#GXqK-#eMwoDweI>3 z*}}f+Lxbd+dOfKm+l23C)O$_q=4^#<*c)0pgFUrS$HOXT?&_yVkQB<}OTzrut)i>C zIs5kyZt=>c*Yd)&#*6Su^VE6g2dQX%W8alp)9o^UoEhZgWDBE{Z@%`B6K$5fv{{zS z-BdP*`f2I%xNcZ`Udu8U?+W*RfBrK@C+ku zroK?pt!!BM7TkQ-11ps6QP;J!?gVFE{f^b)xLmJ=HPW(xjO{ z_$qY^b8_qpB5T)AEWh<#--WS6Uf#nbuVMWOQ|wmw2wrMZB@9;`@Wns?9xGRP1P)FZ z7awvOoX6bo&JzcJ|hxkq~3W1L;sQ(^jJWTYL#VLBB@=v`Ab zQ`3lvxaZ{*At4&Nupz=1g0dQ03kx-TPloRG*G9AB(cTYg>W)(+fnM+uealKJS7)-W z?VMAd;%}Sxa){U~eFU6;DkAsTWRa&|y5*r7D^bnrf{NaT`B=)4fbDQ)-ucD|etw7; zorzMZ(-V$#+^(gCOxdH6=`2gQPG|8=-5ia$O&MmJ6jh_+2|sm;+VUT`&z~NJtFjR! zn?%-q4bSYE6n?*6zG!B#sq105^Y@Kyn1RrhD#aaMuIFPB!u9e}D=ICRAzAeVFGthm`=bmSw zPI)FP_3(`vI8s+zE?5Rb&s`H`jb1l{eVLfSN(&C*xZmZT^XY);7&<Jr)aXm1tRZ3`~mqNZ~t5`a-i9Ie0r`!oglnciX zA1oA|jP{ZquBO}&m=Z6*Q|%F_Q*HYaGT(K>#x5|`nU7lwTZ|{pJwk6TlvI_fm(|PG zOWWEwo1vkB!Y}B9X_JfRM}Q?O_v4p%kt!_Uom7s^nH))TvKkrE@|<<7$`>kf*8T23#2$^)mujg2uFs^m>~Q*G5|ygsmr3a?CO%d|}^>U-}>5lT;n2PH{F<73W#mZd*Nh)FkJ&C*9MkE=$m+{Wtzv z9V$U#+{QlsliMjb9r5mT$(a>PiYKg9*mF##5aD>{-@AY89Vc&?Huu5>eC(W@q9GND z@Iup7+ZYRddV*|2o=IP)^si~p$L&n`^PDM@$m_6zZ_{VSeCwC$ngbPf?T$Wg(CV%@5WD4Z$b^yQ3aRhen7Ce7q2wywKx=VQYtJ;W4vtC*cA^$$y$VOm_G zVlcSnZQ5|3;f99Zzbk`8hppKKn*BO_7k%oC$;(=m$+R)+oaTmuI?CNjSMeO3$c!G1 zsll1*X+3Kj5$A!~*mWgC_Lm|)ilQ)-Z;o8y7J0WNmRyNlb2H>RN9XJITG~voZLuH; z^)TIbccAx0<~69F8o_Mnk4jgkiJqRf*5%RiVRKV2WDugL9&@Uh0j)dnRELPN3bK=_ z){Aa{*2W|<1D*i;dCj}%>ui5nrluqE@#!Rs_g?;*kb&~`&f&Oknl3B*1l;9xa@a$i zX608Pq}WPhWfAN1H0zXW#ZTp{LPBqUu&VLqdcq)2cmDKzM8z2g$knDn(Ir7=TSrIU zH>Kf?t0l$g_v&T6;>aj0tKiZtNO!vEN{xP%9J5KJG}Dzv>j<4|9>)rUq@f+|xB;~7 zll$R6C}lt310x*0h9_;Q#$;;i?;{PZ|9PNbQEA|n zi~^b~0MmkC;!or#j>WI@Z~M1it@ZHot~KQ zskxi>A9G8Zex|hlmXZt*Q9P0qZ?M%SkqE$;0=B_>b_-|*MQ zEAW9)j`04yo~fM-Q||^bDMlY0Jt_*OrE%kq-lYKdE4;ZvEEh$gFh4-MT^#$n(az~! z>5;e0z7u9+z$S~g>?yc|P@(#bIz% z-WWM&2szrF-*3aygsu~wrY|pC3nN#XxQ&ni^8xhTN5=62ObghGrgxyw&lAPEpJPJ> z2EvLTt^HaKJIw2nZ@SF5&Bj*s_?prFZ3|Ib9^UsQ6 zD#uUtiw)UvdT8hnynesmNQCrW=N*B^M}>UWz}+KP9O`Xaf8n=m;r-2*w039ewA#FX-xE*tB(ddcn@~vdJD>)O^;P1XbX|&JZqp}!ez=MmSYs}CBAn4 zEr)|ULO@0)^L!TIK>x~<{F02{zgCefr?V40e%Jw#K>Vwv%}2)HCCt@l^iN#u0|YKbqFnTq8m4bxENcVb8J6;X`Qx zRZA=I2Uab%u9^owRTr^S!Q^fOCcEuBtLsLV^;lJ|UPt?PT{?V7;W&^LJj5H-2Jh2b zu^m@@DU5hMC2~*+N|`33^U#@|;3)eJ-Aa~u%F($H-LKDXlV+%&)M?n2k|^=qG#;$) zccS5oFC;1s5U7*rOF=D*TL3`1Y#ri&#B79*EuF&16;|I#l!Qg}O=#w~=6khxymW=owR3yq{#zVjEjH^cr zBL^zwZt?`4DW-Pvvk5#%%)&DHhv17`;md!2G0v{3Ndd5|xw-k2pM=;>x9ZwDAiB_q zr*Z^eaq^-Ra?sO0Aw&I7pVp{uH09((kaao7@ezvF9NC41Pgyi}vyDg!1e_lEh(O(UUeE(? z)bkrO;zvbA+3libc`mThR{-&aU=2Y)^pi#J+TVr&aBy?Tt=tq2*9i<%0X|2eP@aI? zNy^G%x#r;k1<)u4qMimc6tg@L;Q;oibZlb;IHS(V@zDZtZo2*#aB<(jZnPXhJDl)p z0W`<^Ohj?Z`!C;7^cemcE7OAR++}n$#vU#egfae!tojur<&eqy!kM&vRQq zd$9@|_!}c9>Nt?;io`q@0um1Dz(kttvN9|Hgt*j?`>h{>8GHnAt%-%jSqh-ysP=c* z$HuFT)2Nj^clqF5&+stbEgof0Aqv1iOb+|>(2N6uMQx%1SULf~Bb1ZV#NUH+iVt{z zjD|fxLf!XUc#wwq}2o6n3kFUJ_w6h4Eauk;7dv7n1Eu#J-~&XY~y<7++5!Z z%>61nHm>pbyE<}GvZ3ic{Z#_-nFrZ$DxJIyLC1kK#yzkQ)K9JhxSkv)^JA@=a5(&u zM}A&j-p0WZfXIs5mY4-pl7S*Z#X|RXf(VQ(>eASx3mk^>F9LID2nT%2i-d%afN3Tp zQov!qe*N+Uv~ew(iEZMify_*0J0uTG1at24(|?gL0(i zkI7uwF^iKE6@E^l0Y0*n1%ib$fD&r)SRem*={OTW(PXF)KpS3&RDfPxzW*b;aBrF% zRzT(pAQ`?t+xhCtIsiRWQeG~mp#jP2A#Ja#_PK`@&Bkj!mJjW2{|v!~XIA07PSc6#xJL literal 0 HcmV?d00001 diff --git a/html/hierarchy.html b/html/hierarchy.html new file mode 100644 index 0000000..82b9198 --- /dev/null +++ b/html/hierarchy.html @@ -0,0 +1,241 @@ + + + + + + + +Quetzal: Class Hierarchy + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 CCFrame.adjustFrameAngle
 CCFrame.alignEdge
 CCFrame.alignFlange
 CCPipe.attach2tube
 Ccut_list.cut_list_creation.Beam
 CCPipe.breakPipe
 CCPipe.capQM
 Cupdate_crowdin.CrowdinUpdater
 Ccut_list.cut_list_creation.Cut
 Ccut_list.cut_list_commands.cutListCommand
 Ccut_list.cut_list_ui.cutListUI
 CCUtils.dpCalc
 CuForms.dpCalcDialog
 CCPipe.elbowQM
 CCFrame.extend
 CCPipe.extend1intersection
 CCPipe.extend2intersection
 CCPipe.flangeQM
 CCPipe.flat
 CCFrame.FrameBranchManager
 CCFrame.frameIt
 CCUtils.hackedL
 CCPipe.insertAnyz
 CCPipe.insertBranch
 CCPipe.insertCap
 CCPipe.insertElbow
 CCPipe.insertFlange
 CCFrame.insertPath
 CCPipe.insertPipe
 CCPipe.insertPypeLine
 CCPipe.insertReduct
 CCPipe.insertRoute
 CCFrame.insertSection
 CCPipe.insertTank
 CCPipe.insertUbolt
 CCPipe.insertValve
 CCPipe.joinPype
 CCPipe.laydown
 CCFrame.levelBeam
 CDraftTools.Line
 CCPipe.makeHeader
 CCPipe.mateEdges
 CCUtils.moveHandle
 CCUtils.moveWorkPlane
 Cobject
 CCUtils.offsetWorkPlane
 CdodoPM.PieMenu
 CCPipe.pipeQM
 CCFrame.pivotBeam
 CCPipe.point2point
 CQtGui.QDialog
 CQtGui.QToolButton
 CCUtils.queryModel
 CCPipe.raiseup
 CCFrame.reverseBeam
 CCUtils.rotateWorkPlane
 CCFrame.rotJoin
 CCUtils.selectSolids
 CpFeatures.Shell
 CCFrame.shiftBeam
 CCFrame.spinSect
 CCFrame.stretchBeam
 CpFeatures.Ubolt
 CCPipe.valveQM
 CpCmd.ViewProviderCOMMANDS ########################
 CfFeatures.ViewProviderFrameBranch
 CpFeatures.ViewProviderPypeBranch
 CpFeatures.ViewProviderPypeLine
 C_Profile
 CQDialog
 CQWidget
 CWorkbench
+
+
+ + + + diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..2300b64 --- /dev/null +++ b/html/index.html @@ -0,0 +1,83 @@ + + + + + + + +Quetzal: Main Page + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Quetzal Documentation
+
+
+
+ + + + diff --git a/html/inherit_graph_0.map b/html/inherit_graph_0.map new file mode 100644 index 0000000..6701172 --- /dev/null +++ b/html/inherit_graph_0.map @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/inherit_graph_0.md5 b/html/inherit_graph_0.md5 new file mode 100644 index 0000000..b85cfb6 --- /dev/null +++ b/html/inherit_graph_0.md5 @@ -0,0 +1 @@ +bfdc2db9c0ba4d703b14c8fc1c859785 \ No newline at end of file diff --git a/html/inherit_graph_0.png b/html/inherit_graph_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0148aefa7a50ce75cdffab2e87128d96502df3a5 GIT binary patch literal 43980 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 a+2!LDw!x!{gLzE&qo#67IakTl=l=l0cDbSe literal 0 HcmV?d00001 diff --git a/html/inherit_graph_1.map b/html/inherit_graph_1.map new file mode 100644 index 0000000..7d59405 --- /dev/null +++ b/html/inherit_graph_1.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_1.md5 b/html/inherit_graph_1.md5 new file mode 100644 index 0000000..a62f14d --- /dev/null +++ b/html/inherit_graph_1.md5 @@ -0,0 +1 @@ +1debe44d63421d80945c852e25883832 \ No newline at end of file diff --git a/html/inherit_graph_1.png b/html/inherit_graph_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b56904a2ddcb20a0fa553c5c335d640d15ca58 GIT binary patch literal 2532 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 + + diff --git a/html/inherit_graph_10.md5 b/html/inherit_graph_10.md5 new file mode 100644 index 0000000..3753266 --- /dev/null +++ b/html/inherit_graph_10.md5 @@ -0,0 +1 @@ +17e36e3e806b688f30dd3f7f20e057a8 \ No newline at end of file diff --git a/html/inherit_graph_10.png b/html/inherit_graph_10.png new file mode 100644 index 0000000000000000000000000000000000000000..2b8743af3100431a73299f26aebdcb28d73af884 GIT binary patch literal 2169 zcmYLLdpy(KAOBK`Ay&B*rZrMo5}MndE}Hw?=32QuF0;lm+JvykT`xVXXKNIqC6vok zR!{}c_QLzJb!24ZtXKYAm81HukZozr8-?Hc0$5!)v$OFMU)4g@bm|MWbaZ;6Es$68 zr>26^TPGr-7Lij;-!#*dG_v}Bw`?z_c=gsC*6^V8kB`5;5&h%)Y*^`1RbW&9d|{tZ znDy+L5jS=P;@1$DSXOpKQc`k!d>jBwA||$Xc69{@EQrMsqE01Cb`fQ}q{R1?6(x=@ zfp9o3E^d5ww&Q)si_1K z$ucNN>mUO0X>#($+#GRcb{39A-puG12;5s%pSIOg=l9kZcp+2iboxzF*hecXD`yW6 zDJLhVDUs;)*qG1#pSrRs>DfKgfh%)@H$6Q&nLm3p%#ldB`1pAK`*-gYD=RA}Cw53m zaCtnJ^XFx1ylx__vx|y~05+RF9$BZ4LP-_&w10k^9~>|`Hs<2$dZV+`PIcctI0~hF z?AS3IEEYqfosRnQL7qmVv3P$yeY&*16!?90wP|>G9~268c6Fs+WS%+jDqF++fN~Z* z$Ht#X%9`6c`VoMXi8Pp@xH#k>VQ^=A{6K9 z3f~KP{fP|bPUcjh0$_4=QGLIfTExb;;L&=jEQ7%SVW>y@f_w@7}sSO=UHeHTJUwB4FIg-`L>ppDIa*(+FNuE9m-|1wGB^^$AKpoYBLu{>&`t7|9A+2K$t}> zs6wHF!NFV>Yu`O|OfE!L))uMUB^JJV1?*E(>jw{f=skq}9(hztTieCP=FPU0tjb4^ z(gEj-7lr@7c96gS89hBc{wNd3pPngLgx1*|X?OpL8LU^$lU_>RKS3>aTu*K|3Fc=PpbGx8GkKX*g zfi(IeNBOuf_S)JaJN#qAFRD+!SmegCq4YQKhy((#9-(^zg(?^r>g{#;%<67xN~+`3 z)Z{FYh(rq&dh{_jn%s^!eo_^*9!|ZFMr@>@cG#7J9cy| zga-s9t*=M7DXXaLl$DkJ?CAmKa%^m@@d>-UJkxYztFn?cBciyxnO#|5nsjz|w>)zO z015QFzyEa(2ld#m5oUaObbWFKR8b8{h`PgKz2@`f#A0zZhtu}%-8;YON5#cSj~^o! zgwGX@9693E5NCSf;zg*csx)W`z?r~6#K_1<&;(dO{4ZUS0hv26G=$L8+Z8(am_^nE z4Ms&p1$q9j?ZW5bAqzwz@eQBfQt;a~^44a2+}5T>Nl8ic*Kvs}6KiX0?Vp;{mS%bp zk9}S;OnLa=;QQs}5KQvwYLuM3JRE@tw4=Vo99QZtglV-IpwU=?K;Y)#VO4mV#$eHH zv<5~;k;auES~GL=_Tl;Yd0VaBIc`VUw=_?8qLEws`-MV#@J$Ss=PB1Fze%yu2K5o? + + diff --git a/html/inherit_graph_11.md5 b/html/inherit_graph_11.md5 new file mode 100644 index 0000000..548693f --- /dev/null +++ b/html/inherit_graph_11.md5 @@ -0,0 +1 @@ +43b7aec73e5a242c114755bb0968dca4 \ No newline at end of file diff --git a/html/inherit_graph_11.png b/html/inherit_graph_11.png new file mode 100644 index 0000000000000000000000000000000000000000..a8ff23501e1cac8abc3f70ab635a71351d7bc2c5 GIT binary patch literal 1756 zcmV<21|#{2P)fhQ(YVf@bBGP$rOhgrEIp0njyx*X!&PtqeT0IFOpPJ zd@*y4z?51>!oo$FVbUK0*{nt{B8bPZGG@#{^v{v7rV}bnWMnU@7d2~GPYF$6~Rj3PuJj*gC4r9cJXz3xkvECHX-M{R8_ii?XEIkWkTNzqPBOkn%=?MP2g$Nv5M zArJ^KIXMZ9MgxsTgFSopz~OLU`SRsxXlU?^OHECU#q?AN-s}GJ=TAI;{v11Y?10H+ zLP<%ExgT?y)j-#QW0bjm+@f-^T0w@%UIpgc=>rqx#2D{x3 zo6Uy9hYw?5U;tLD6)YADLZJ{!r4llk%x6qVNeMhLw<$(hSNVwj~S zEEWs-@Zke-I2`2R!-vFTv5@oU&l4VxM+OH6ea57wrjpLiPSV%cNAmOYNp5Z~kxHfH z_U+rGyStktBqWfhPoH|m=yW==X3ZL6G#bg>yLX8~p&*r&l|ge3lvk)2Z{EBiY&M&` zd-u*0qpPcnOSF!!Q^d8$(uBR=}LS^9m_xPqeonh=*)nLgTAVs{3J)GU z@HsayFo4I8A4eQ>YHA9fKYxZ+t3_E^86*-(z!xVXk)555oSYmC4GlpqmqVdYKq{4D zWMl+99uEL;?%X+OG@7VlBqk=JqM`yO;o)J=lbb)qSctudR!qKJXl`ysYilcNYHGme^C6K)uwumuT)1!n znVFdp$IH&n#?GBPArgsDP*4DoNaVQz!+`oSxnVFf8NF+#4Plwa#1e?tU z0E~@|VPs?^su;kprzzL3Uk4!syLRo0c)Yiaj0{}5bO{2100jjFkjZ2?dh{sL($d0? z*VEGjg+c+jT#l@)ESO9tba!`$mD57(MYQJp4p*sEl?=n&qOT@Wi|xNx6ML>)x#IIa zE&UpoiaWGusklRnmWn&HXsNhEi + + diff --git a/html/inherit_graph_12.md5 b/html/inherit_graph_12.md5 new file mode 100644 index 0000000..cfceca2 --- /dev/null +++ b/html/inherit_graph_12.md5 @@ -0,0 +1 @@ +ae05f4890a05b8565a32da86e10602db \ No newline at end of file diff --git a/html/inherit_graph_12.png b/html/inherit_graph_12.png new file mode 100644 index 0000000000000000000000000000000000000000..857eaa1dc6bcf7b4873763f315ac62ff937242d1 GIT binary patch literal 1805 zcmV+o2lDudP)#Q{NxQ-*-A25>CqpsbeDK6mc%HG(~hFl%Wn4f4@RA zSk5#Nw3Zrawd_ghce&gXsJ_uLQnoVx)O3WY+UP$&SiJfKpkL=3|ud&3On@5AHqELyF$XKBoL z`5=a2k{O2i&*s^pY$l6~iw^<(YiZ1>2>zheYX7<+%I2cgYN6Nbo#H$%c%f`DXc16o z5m0CmP(X`dOHy85j<&Y8O`Ff{+re6~*=)FV>lV7ZyD>XEi`~0-qp+|LiHV5-fSQ^b z^!E00auN~}(Ae0xQ5LoYrKP3F&CNwdMg|+Jsi}cjEJj5|#i}$^DiuOPLjIOTCpM%A zj7B5U)6=nQ*De$n7egcx!DKQ)tyV*=RwFkz7ehls2o4VBEX0l-J2qnaErnjMM^aJ} zCpI)Rgt@u7Rcq|syLY2)d1OP1K&ezBGBOe`Uc3O0_shAP%4#3O-<$G96EFe@87?N!C-(`EQUs- zfzfD0b8|C({rZKYM~|YQpnx;i!^t^)`ZNLq15s9127|$X^z?Mp*482~ zFArH+Stu?pMt65Nn{(yL6`VVF4sy91Cr_S4TU#5BA3we(U*+ZHXl!gmPEHQ8va+Dj zXi!~U4FJf`&qruzC~|UgpwVccQmI_(deQ)ZckkX|e0-eaqqw*j0)YT!Wo7vO{W}y2 z#ft0tKT}dt^6yipPLb8p(a}Kw5VP6raopjzj|&$ru$;55Q#*bnAK_p z01OWg!{Kn??Afy%4TfPbGBSdQhzOUSm--qV9R-ia!~XsI*;rCi66WXUVKf>MA0O}W z`q!hebgg#o+zH_Kng<65uQ=yQth)%LQYiug0-)3BAd|^Fj&*k?003X#f2`Q;b|fb! zqo}9|rKP3VzI{8MK7GpB4uIb`&{KOULZJ{0!{Ge+^AHFGoW9uDShsmgeFX*vVt#%e zcDtS3=BB5o*}j!LtX9JnE9tI>b)N~gZQF+W`g&ZwdKJ%~Kj-wdx3{CSvvbXw7K;Vb z)6=N0uSa%vHWCsNT>kN~7NVk}5EB!F-rioMrKLeGmm?)51%rcw5DJ9=fTpG$xg_xR}T9?LVvmtK>)z#JT_4P$zVIc$p0m8zdpeB8Zz7srkr!~OgBv9Pd!#l=NDc<_Kd6c-c}psK10 zj~+cjTwI*f+reryyv|w=hD&ic9As!{h`fFKmi+wrlhZdiI7mK!{_HZZudk0xOiVb% zKYjW{UcY`#tX3--A0Ou&>Xzr&Y&O!_*~!Tt9v*f%=h)a7>FetwGcz+z;|B%?R`fMD zH%C5v_&`2>{74)Qhg1L8uU|=5R~PFyH8qu7ym)cd8hX8+eEaszt&fF;1@iLcOENn< z>om6~+#L)zv + + diff --git a/html/inherit_graph_13.md5 b/html/inherit_graph_13.md5 new file mode 100644 index 0000000..0ee7334 --- /dev/null +++ b/html/inherit_graph_13.md5 @@ -0,0 +1 @@ +0b54790310762b15aedbd1d5ed9b2ac8 \ No newline at end of file diff --git a/html/inherit_graph_13.png b/html/inherit_graph_13.png new file mode 100644 index 0000000000000000000000000000000000000000..37b586c8217e915d934afe264fc9b056d62813f8 GIT binary patch literal 1853 zcmV-D2g3M?P) zbJI@e{=i_@eP7peU-z}|p8J0O02B&^LZMJ7l(mNWv4Le-F~cyiYmp4)e;1hjqf6Q*1BeEIHX0zK9qWoEy&1Tr`_Bri>HOPhX ze+Cs9#qCg$QQQs{*)PJfEUZ@RvSRA%>!DJqpwVdDl-2JE71=Lhv)M2*GO}QQette0 z8X7qJ#fujxD=P!bvdGWRUyT%h8y38}TrT6|3W^O;?v zb?eq4C@2Wo+1W@=PF~&QU5raaHZU-Nq@*MS1_mN0CkJA&7=wd@C@wBWad9y+GBVKJ z-Hm{N02CAyaB*9Zx#bPm(O68n*mSv$*snF5U z0lVFf^XJdQYPF)ZwG{$^0HL9w&}cMBNJ!wtq@<*vr>6%U9UTY>34y_2z`(!&j7B3q zefoss$B#p;R`bTXckdqV-@lLX@o~h*$D^pI2%esv^UkZStqmrV38SNP#>R-3mlqiv9Go*=XJ;qz_4Or_ zlapNA#KZ(|{ECVS&VK#+H32~0y?aLpAtWXyhSb&7as6k`oFQ7Rmb0Uyqe*>z{em@$ zi;E-v{{G~|i4)|@moL9G2UpZ>Ihaf)lAD|R&mT3l;^orE#|Ho~Ha3RP(9lJF_wC!q z+mr3wxs&_8XU`s z3;@vE+l#MXzv9A$3%p}641>PDK7@sZ@!F+QDRep=WHK4z;^L5ykbq;yj`4hE=kM?D z&($FyAYjotEXGWYrl+SdJUoo*>S~zHW)v0{{?r^?T{l;-Vv+6IwF`cJerRrPhEytD z)OVph8SwpTYKDo43B<<6B0D=9TCEnozP@x+ttnm4Alwief}T|;+wH*Vj)jhdPo^z`(=!^30A@s?tt*dJ>&H8q9HmoKBRuyDya zxT9{aV8wf~_3PI|uh--1)vI{?_%W}~YPI6ovuDdbro-XDhYug1*XyBDsUVlj=Y8Q&ST>Jv|W}9SyBk zi&w8+x$GY<6bj*VI+yh8?Cj*O!k3zZJL={NTyitEw6qjeRaMB!%0f_35ae<>wr<^u z8#itsI5>FO$BT%Fz@bBjAdyI*P$(dgNVsMBSMl)hfW>0L!-o$M92^X}T#mrNKnxEL zb7!W$zCLtybpZfGA`x!hya};b42430goFf?l$3DG;!2s>pvT9@^KQ;sEEXu0N+c#G zA}lNnjg5`Cb?eqo&A}aYa|LtGlexLMe=!X6H+|KIvRwZ2s*k0vu8#LU8GWooaXVCG z6t_b~MsYh-WE8hUMMiNuRAdylLq$e$J5*#8x3l20ORZMBnt4$EVCIO75b`eo$JZbi r${&D0AaJa84ipN7LZMJ7l)3yHEO$3udUNv;00000NkvXXu0mjfmaT+` literal 0 HcmV?d00001 diff --git a/html/inherit_graph_14.map b/html/inherit_graph_14.map new file mode 100644 index 0000000..5f4602d --- /dev/null +++ b/html/inherit_graph_14.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_14.md5 b/html/inherit_graph_14.md5 new file mode 100644 index 0000000..ca84351 --- /dev/null +++ b/html/inherit_graph_14.md5 @@ -0,0 +1 @@ +b75aef7e5df38bbe58dbf4eda225a061 \ No newline at end of file diff --git a/html/inherit_graph_14.png b/html/inherit_graph_14.png new file mode 100644 index 0000000000000000000000000000000000000000..e590631f432600329d8c45dc31afed50e17b8ca6 GIT binary patch literal 2248 zcmV;(2sihMP)z=Oez|%1!96=3R;F(z!D(h%n%`52XIJj zkwFY9Aj%M`#so3O_=iA*0)jxH3^qZ)eSaAGd1SH| z{LuTICu!2X_F8+tXP=d`*FFcJp`oFnp`oGq^I`mG5Q#)=27|F}ImFQXe(31vbY^E~ zSAB2O{n3fRU~FSB82|qJWYPT2eEs_M5rBVvZ<~=c(`097|8hYzzc<<0*^o-5GweFc zpoQiShfW$At)Y{KMr-J#q0t&TX?_vW(a|U@EL?6Gzl1qYPuem(Jd8Vc?x3Qg0&2Ay zwzjqi3k!prn;QV&{Q2{!uCAuU@OV6AWMnLrgx?C0NCZnu%b)gFtJTQK$w5U$1tumY z;O_2@$jC^Tnwl^*=TQXM_gPS z;^N{E6chx7LIHDgbHv2NXyR6{UcD64|CYG8xM<}c92|_Eo*pD5B*4_v6t7>u2A|JI zV`Jl@wMeB>czAd$dYoyNBxwW!0XA;jh@zq*=;-{lleYlP4G+9)_ovc&a5@cm%p|7tG zE-o%eNJxN*iHT-@e}8{SrBcY{a@gA1A}J{e=H})AzHLu_etz)t^V9eT1_nYVlcBb@ z7M7NlNKQ_MwY4>rN+n*rcmat-0v?YC00;;OKw@H|R@(FO@{pgO50y%V0|yS^@ZrO_ zeEBk3T3V2vo{qbB?}EeOATu*_!FxI%i>_%pJ3CQcUXH}XL`uR;Grh?3QCnLJfj|I# zeSMrca|Vu%jtC76g;*>`a&j`ZY}taqz(7=0RZ(K1qM~4CW`@YfNYvNY!`IgriHV5_ z4i1LDzdwXRAu1{=G%=ShT|#_(JbZk7aN@)X6c!fZ$dMznYWno)6Si;P4qIDWoIZUT zD_5>WR8$mY{$t0Efyrb-Bod*$y&ayOp7`?R3jm<5t`0ptJrsYTPzVD914KqfqOY$H zfq{Vl0Apig7#ka-sHg~&lasTq-9p+^Q&Vy3)G2J;x)sNdA4fq!0SXEV5E2rC_3PJT z|Ni|Di^UL$L<`;ztqBhgKXCHoN%FIlmX;C#q@$x_UccSDcM}$iMZCSeHNRJ{UJ*hF z;c~eoHa2$Nc(GVa1OkDk&E;}QN=k~R{p{H@0)TXOc4}(bZ*QM5pG+nrMn*H zxw(;?oE(aOQc{wp-PP4a0FeIvenJQ#B_$=q!NGwT85t2ipHD7cyhz@^fB#e3l}aVi z)zu}XrKOZ>`26`ZA%qZDS67mon>*tg7a}Vwi-d=V|L4aXS@iZ~XlMukP^na~v9X!g z*WKNnQqyeOv`O>d$;pZ0+uGWStgI}wwzgtyYz)1 zQ>jz{fad0AOiWDR+_`gcQQK?igGc%i0!+iRtVX;_Xu~^u*Zy#)IZ1DK;V*~~U z&a1t@zaLXmQy3l|p7n6?GxKW0qHCHJD^?&SB?VWmT*33_&nbPy#lroU0GR)nwlEy+__V0Z36=XxN+kK)M~ZH_U6qS z^!N9J#bPa}-OkPq91aJmsi~NnngRecH8p8oahRH#VsLQqe_Oa&Sdy1}2?+^EOG`so zSQuC=7I-`!)~#EIn>TO5%F0UX@$BvGv3KuY*xA{^!@~o1c6N(?)H0b&JbLs9PoF-8 zm6a8EJRU48EYQ)>p?Pw&w6s7jmjeJSEiG~D)-ABvY6(&`Cq1HFVO@Xbqh- zG+IL^4UN{!d3uV7i1<5o(ELHnNE$*&C4hs=poQi)L`O%bbGbFp(9qD((9qEQ3jPb5 Wi|=67WPiv20000 + + diff --git a/html/inherit_graph_15.md5 b/html/inherit_graph_15.md5 new file mode 100644 index 0000000..1b1b0d9 --- /dev/null +++ b/html/inherit_graph_15.md5 @@ -0,0 +1 @@ +a533d3ce68f2ae1a6bcc41ba89da5757 \ No newline at end of file diff --git a/html/inherit_graph_15.png b/html/inherit_graph_15.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddc10d5605135b4fb15dff92ab2bd130cd901fc GIT binary patch literal 1915 zcmV->2ZZ>EP)!Q~evqzh~1D5r+?jV^c9|h8Qb_<-^cXqV___=x?d` zLefSdN-cYwxGc#mdU%mIBkN^1w_#an=s>gwQCvO|rie)PLW^wH(xCMEzv%Ylna*2t z>TdXbU~tZLe!uIweqX+vryYR7U@#aA27|#^TR7W5R#ujrZ7~?XnVz1m0`R}tu{kE4!DuwDctZ@vY>Y-D%x3ePxM&S}VK9~i zGbzLAVJ2lbJn3(7kd1jcc zvx|!hWHK2tGBOYs7w3@tYk@;dIxsMR-Me?g&(9Bs4jqDAF2~^DAapt%bUGc9latZi z-3?z~U*zQE@bkRAy&X}0O)#6yh>VPMnmjYi*7@hppJ;7uMPgziYHMo|A0O|qI;)98 zOq!XQi7i{UpuWByBGK=+sv z8qm_x0+C3Bz`#IcW@aKLCPpwPK0Y2jJw52?=s-X~01O5L1_lODR#t|uU%%qOfdfcO zOB2+puCB(zhYvA6J`S~7jl8@(xVpN|yRO#OR+N{Q)5qxm))B7^33#EQ&R(r#e$TS6r`r6@_kKCPNJx&2<`3d zkV>UEckUbl0s`jMIW8^^CX)$ub#(%hE~LYmGiO#rdxw#oot<*{@L^gk@7}#5090RJ zzu>rpgapdV%bWL@QmG^_FE1)CE+&)7M5Cjl)ZN`pjg5_DGMVVwwQD4iNa)q8SAsd- z-rjWe>Q#FD_%TI9L{MmGD5=$Idhp-@Ra8`vo0}WGc=3XtV=x$K)22;SSy@Ss9z7zB zMnfqnDf9L;GBQH$?(TH);zg>ftD{SoE>T)q8W9n_dGm%83I&}yb&47r8_8@o+g-;( zHSOim>-8j+O6k_ETU1?LO{uA=R8v#K*YNfArOTHu)6=Iq*N;H>TI=IDKIdQ zZrr%BXdPBU`^8XRUQXHB*?&9Sq)kmt1b~Kyh87%`kdQz!nT%p%WBK3n=g;{?+cWSC z27`ezGc);prBX?Hy`JB%t*s>hG(0@a$M)^pM}>ujL_{<;Hb$ezDjy>9Q~P?(XgY z0E@+fz`(!-$3{d%2<}O@Zr#dnZ{NOMFt)$HALZrc=GBGr{U)2CO8%v8anTs($Z2C7Z;mZ~@PrJrf*jXlOulbMumO4i69G^XJdd>-9)VN`gwIn)kzl zr4Sq(jF6BJw6(P%HZ~R-jRtD98eLsokVqr|fGbz7K&R6I0A9a-jr#g}xVpL`JUkp) ztroq#z5LlhB9UNhY;4&zZSyD;3WS7&prD`tQ&Up_ew|%yU*9c-&dyHW@c-7+N@%}a z9P% zPY{d6sH&>MlP6E$@9z(lN(DbZKMV~GK`a&n0Q&m+(ACui0FX+hxOwv?Kvl>0u^iI6cgy45x>gl;QL+lQNthyZ_y5wc6F}gTb)N z9Fr2!D*y-9pce)MB9Ul#t$ScF7z_r3!C)|K`9E-lB+JPIqdx!u002ovPDHLkV1nza BrzZda literal 0 HcmV?d00001 diff --git a/html/inherit_graph_16.map b/html/inherit_graph_16.map new file mode 100644 index 0000000..6911ebb --- /dev/null +++ b/html/inherit_graph_16.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_16.md5 b/html/inherit_graph_16.md5 new file mode 100644 index 0000000..47fed5b --- /dev/null +++ b/html/inherit_graph_16.md5 @@ -0,0 +1 @@ +f6bcb3b674831cc386dfa1c919a4ccdb \ No newline at end of file diff --git a/html/inherit_graph_16.png b/html/inherit_graph_16.png new file mode 100644 index 0000000000000000000000000000000000000000..dc587147f8051f61c5d28514cdce4bc17193df46 GIT binary patch literal 2157 zcmV-z2$J`SP)f7?;h@(^aFnVIB?Da|~V4K)|pfwJtNZ)pcC zZNda8JDQRifzd@lD29<;mG6sSq(Wo_9%{f;(i-bIiWJ z{kxiHJ!`LL&GPT_ti5LjWMpJyWMpJyWPUZm_lDTm*oA^1giJ>=GXL9%qWJXY&6}-5 zZKmHl34#zJ2*TgLE-jfqh`)e;h8l(mY>*o_ZcKSLGJg&ljb=o<$uG`B=Kl;?U@}vR zEHIfVMHbjEBsMmdl9G}?e$Ao$HUf)}kEgh}c)HV=QmU$|c>VhIAHU{MM!k!iDBa!N z+`4s(Cr_U6@#9C_+}wzcjwU!b7=Tl!PElD|34pb=HQwId96NT5xpU_N1OI7`j*iAk zXToSS8n$oW&c=-!$Fxl)U0q#dXJ@0;YO%7iV%xTDL_|a&2*R}FV+@S4gS~k10v{hA z^78UnzkWRl2?=<3c#xEoL_t9T0CjbB*xTEamX=0bTpZ=)<%EQUpx5gG@bmMVR)JMl zSJU3!KCW#l2@DM6!-o$XI&_GTkPtK)4VNxmnznq5fl+p_n3x#c-Q9Wk@F6B9|7tcN zA%XYr-%I0#3m2kRs{sfI2*An7iHeE}LPJA|kB?{b=FM#0ycrnS(Y9>aLUnaDwY9al zxw(;?oQ%D_y%evYpn!Y#?$O=djY_2=F)Rvc`-vG_U*j@6*-QMPy_od-m*+=Ja|!>FMcI zRaN2W=*YQq=UB985ioF^+1lDlzCArX+`4s(l$4YabIi)hA|fJ!GiT1=@9z)5n>TNW zh=`!5s0b@7D*$?Xdr3`AHA)>P%A|L&mX;PODk?aA`m}+#2C=cR8S%RL^XH>bD0uho z9RM{oHN1NDN}8{#s$&2C{U{U)Vq;@zYHC8IQt{=>7XU6?xWI`MCs3=^96WfC;^JcV z?%g|To>5Uzq@|^C?%X+ie0Z6*`9=9S1~D-) zQ5xU5b4L^eL2PJf5JgcGgM)*`oSYnKe);m{;-N!_r19s^pG8MUNAd36yW+cd??f{* zGqJk5TAJ_b>JrV(&BdmsrXR{XEiFxqiHVWM{{H@AZf>rD&q%hh;=FzPRx~v=6-!G? z4Safgd!_f3oSZD#TU%R2Kz#G&&9Jx?6&0eTrKR}r;lnZWadL7JOG-+laZ5{!2#B4X zozj|9S;s*RA3iL`#l=N_uct{Lkuzt`1O^&Z7Z;Z?ee?74dH(!4@87?tzP_G}j0`+I zJxBEq3JQ{5o12^C>+4HHLjx`@E`0s^mE*^c8~6)?fKI2w)zx)atj5Mhva_>kY;2^b zr-%0T_Mhtc#)?y4Uymq?tX{p^;F`f20eE?NNw4S3nF9>eZs?Jv)oKX~3nMc#lhDx6 z3Fr7d#;oH+nY6&Xy}hxqvEk99M=W2yd`#b!D_4?`kbsqy74Git!;XaS>FVklHl96u zHnz652!g_qOrk z*xA|9-``JncQKaoF42JIu#eb^IA7 z-Gj}TF@uzp6fR!8$b$zD4CYEoN+>HUlg5Khen3FLxZ(oH&CQjH^YrOco;`a;XlN*& zo}MU`N-8TWS-W;EYPA}bN=0pLtrYjll`AAAB>@9{VrOS3DJdz0g@q9m6hw7(wZU4p zwzg6~IGSy|I36AzD3wZ5Q&Z{h?*|5UwZX?T<565(%#Iy9$j!|iCa%$Pbai#5yu4f* z=j7xJyKXXdoGeCpOmXt$NzR`?PjqxNPEJk)1qCs0-aM{ey^6E5^H0b1^72BdRO0XN z&$@N%xP19COP4N1p-_;YpHERy5zfxe1O)}*;NU=Wb2AEs0sx&(M{R8_0G^(nY}&L5 z4-XGkty+bLhljzj1^+hhDwT@(`1lcRNt(jTj;stRXkXXekJFZq>~l@S~q zjJdhF!A>-YiHV89V~~;Z>F(~Pv9S?XS68g9t_TP=*q}Ui2rIw jMn* + + diff --git a/html/inherit_graph_17.md5 b/html/inherit_graph_17.md5 new file mode 100644 index 0000000..ac0f13b --- /dev/null +++ b/html/inherit_graph_17.md5 @@ -0,0 +1 @@ +d8e513597ab3443cbeeec420a9191c0c \ No newline at end of file diff --git a/html/inherit_graph_17.png b/html/inherit_graph_17.png new file mode 100644 index 0000000000000000000000000000000000000000..9114ad9e3d6ce92bf1102da38b0899453dda4dba GIT binary patch literal 1627 zcmV-h2Bi6kP)|HtKuSlWm6GSo((TbMd2nKed@$RehFd>+XP zW>aAd)XeN<(V{O#AA|@h1{Fjv&x2q@LS!J8O>*bdj$fQ6A_=KbHrFg_$lZt7sp($Z zob!3^-=}lm*L|+*;?Muw=RO>OLZMJ76bdEvVdhU5jmB(-VKht83?+52*=+yLpIb41 zf?*g9!!Z9OrzJ`X6WJ_&Zrr%BxUEo95|(9Qv)O{i(vsW@Wf?=wLWvq`7E09oZ_Hve z8qw9&^`Eb~n52wZOePaLJ3ALGKg+V1nwna){EJa@u{DX6kY7WwGBY!Sn>TOb<;$1& z^5qM1b8}HuRfW>hQUJiolPA&N-wyy-vt|tn3k%WM*obxO)&cnW6v||>M76UlSZ%}89`A|5gt5vfPMS+!E81|p-`ZysRDW?CdPgojVsapV4SUMMVYPym{+cI^sTzpbqeJkR6m)vJ(5Bq^auEX2LDjE|3_x3?E9EiC~?@sp8}5%j(d z8#X{B5@C9J8UXP6^=nK_ObBt7WpVWAQHVq$7>!1Zj*ddB)#Cg2?*M=c7cSt$i4)N2 zbf~VbMrUUy4j(=ow%6w7=8*YVmW9D!fLJU>Lqh`!3JN0DICSU`tX3<|o;{1Aq9PnT zco2PkeGBT&&CS7NGU4vsyJ&4~6^xP!n#4s-P0e4mwY4N#dU|>Y05Uc<7IxkK{rgFM zeZ4Tgckdoy7>2l9EFI>y zI3ezKyNOsVCZnUHLF-D6(yqtKw-jvcL7!HSn z)YjILVBU!PHMDy5Y5;)S?S@<~54*O#y&X=c6CRHTgM));ZEb~8sSLSZtyT-yVzC&- z#l>*BT#(D<@cDc=e*AdAdWK;zG&F?Gn>WXl&rfl2v2g8jxgypW9v;T^>(??AjeWcED^lLn4tN zFE0<7nVDhNyWQ>u|Pg|YuIS5i_EQ4|2Ub?cTOj@@pD!{I<#Ss9c{CGzw0(cj;X-Me=~ zr_({J)q>}FA@AkOm(kSJ6ji=pM5-}9K8{bHKEYzKprWDzYPA|1$1TVslgZH2(*wKR zj_T@a%+1XO#FME>yd>n)xw*L+=g*%OVr*gk^Jl`cEcx)^L(u!)y?aL- z4hQjgJOT4Amy0-^PGRhDILPGWWXOE}cq}ytA!KlHkl5{Z;&!{q#Kc6v0ds!N+1Xjr z-Q7*5rltrX$=4(r!X0oEYL-Oe7l!hSWM~r3EGhGEh?4pw?B7tLaXOt#-9pN-)SA$p zg%UN?ER?9BW}!q4H47zbs97jc6Y^`QuC6YbeNdJG3(P_Yu><&f33{PWC=?2XLZMLN Z<_A%3(gTFJ9%%po002ovPDHLkV1kM6Be4Jg literal 0 HcmV?d00001 diff --git a/html/inherit_graph_18.map b/html/inherit_graph_18.map new file mode 100644 index 0000000..63038cc --- /dev/null +++ b/html/inherit_graph_18.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_18.md5 b/html/inherit_graph_18.md5 new file mode 100644 index 0000000..0900c33 --- /dev/null +++ b/html/inherit_graph_18.md5 @@ -0,0 +1 @@ +1c4130c008bce8d4680d4dc18762758d \ No newline at end of file diff --git a/html/inherit_graph_18.png b/html/inherit_graph_18.png new file mode 100644 index 0000000000000000000000000000000000000000..c586f698fa11ae61d4c003130b72e15e132324b9 GIT binary patch literal 2074 zcmV+#2<7*QP)R`00006VoOIv0RI60 z0RN!9r;`8x2hT}FK~#90?U`*zlkFSEk4=r0^CiDBn_NsDyKxFBxQk>0Cp>sptR0gZJ}HovE4i z$o>1Y`@GKU+Hsx7ectyq2C%TOu&}VOtOuO=0f|Jilf&Wo{|+%Mt4Ai270-_u&JS=n z9Dfdn^S||x#IlC`*xWe^3JQL$6qYqXE|)_llPx;NU1u#U>j-P^28K0v1H+oTf%#+1 zl}e?ktgQUqGBy-?Ps=N1e0&^_A3sJzLjxuzCgAAkh^VM2`1<++05UQ%(9+TZ05CBz zfk-66rAwD!Wn~2bkVqu3v9VbzIqS~o=qL&b3eeQl1g%yJH#avVCMLqg#f8b4tHF&M zH}KbAe=+f|U%w(EA_6=f4^>rFYo=*UI`_ke4-kvRC@Lz#;lqcKl9B>vXJ=f#d>N&s zr2v4=&Q4fbS|TSW2MGxYsH>}kzrQ~wCno^_US3}RS#x`Pdm$E!QBzZc)2B~EB9UNh zYz&^Bo+vLbXYx8bJE2r6arf?Bo%u4E3`(UEb#--Xs%uR;H!dy?PEJm!uC4}``_KK7 zl9B?oTFqSV+_@9M!NC9kA0Hps+1a7Kz8;4T9fDLUMOauE!otD;{N2gNjvYf=TN^q$ zI^gK&h-=rb!P3%_S+BIT6lG;)7#|-;KtKReQ&VANWTaPTX=y3S%gdossSq9>jXK7B%ceLXTWGj)ue!_?Gt z(RtR^)-W(I!06~G0N~xbcNiWXX2#`mIbvdBU|?VXi9~|_{(b}m1Yl}v3ILFsn~N(~ zt{^x#81eD(sI08SxpU|A>b!paIxbwefW3S7A~rS_6%`ezsHgw{L`Fs;CnpEl+1U__ z#W;TaIGUQ8mZfEG|LN)J3-+IxnF+O8t@Ehm^ZAI3j6`8!ApoGVvJzHSR@k?1-;#A+ z4L{wv0|Ns90B2|C70oLyF2?NaEId6u_2z_!ha)E^2LN#7$PqX=IH07Y1fij!xOwv? z-oAYcFE1|uKu}N+wr}5#fq?<+-o0CAozc-zP5G&!0a>dwV<7YBdxJ1@iLpbPgQz`S;ztY11ZndU~R}yBh+509vgU zX=!OX`5X=hN~LmvxeA2>M1%te4lJs@r>6%GA3j7+PY*O24ZeK&vf%x%Pm7b26SMza zyLK(ugG!~s)~#E0VnU%1E-o&(bLS3PT3S$2Qi9srTD^5xEkA9pNF;)(sVQE(cmWR& zk0o>W@86GZuRu*_Xo=%RtyZeH5EG#TA zGc$wn@o`vKSm=ytG#dE(`y)C!8c9h>;Pd$?FE7`5EH9RrRv*Oz268FTI7;X$sht~53_Mnpsn4Gm;yXh`qhzo+TxX%Y&B zl$)DNv$L~AM5NVf>E6A2G&MEFXi7^d>1lFvb0eu#O4HNRL`2lp)kV$C&D7P^ zMO-eIMn*=6h)AQ+P+(vn`TF`UOA8Uvty{Oq+}xaAzI@5d>Fetwp-@N>5fMx*G&Gd5 zv$KhaXliPTUcGw7d~ZcX1sNL~FQeMJw6?ZVVqzjK=H;54mebSIVQ6TGsHiCLcs$tI z*U1_DwQ~Y{yg&Y^B3Klk&zMe%VFJEP3O*` z)oQ7;vy+;eo9WxPZ#rWg9Uau$+pBkOTU#4_{`{G__VDnar%#{K_wV0HE|)WR_q(n>UM&EyXYITxKytL!Fc7znT9&n$O&+ zcRqYRAKu>Hdgs~O+r!@8enEV(gBq91#hyKT7G1~H)s^{dW@d&RJ9eyC3y;Txx3@RE zy}i-b*N5cfWcc~{!NI`+z|u9?wrv{%0|WJruZA@>m*pQaGBV)j=Le!in`&M7W6gc^ z=+UAb`8!yR7A}{IprD{%q-c5kvF7^t`221O41bcAmGH;><;Sx2u;y-HSaUZpthpN) zy$7nKq@?xK!SV}OU@j3g0yy&2?aKQ-eLqKxC1Q2+n{07*qoM6N<$ Eg4Pe%p#T5? literal 0 HcmV?d00001 diff --git a/html/inherit_graph_19.map b/html/inherit_graph_19.map new file mode 100644 index 0000000..d0b43ef --- /dev/null +++ b/html/inherit_graph_19.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_19.md5 b/html/inherit_graph_19.md5 new file mode 100644 index 0000000..45a371c --- /dev/null +++ b/html/inherit_graph_19.md5 @@ -0,0 +1 @@ +6d4e15778a28bbd5a2575e6855666015 \ No newline at end of file diff --git a/html/inherit_graph_19.png b/html/inherit_graph_19.png new file mode 100644 index 0000000000000000000000000000000000000000..ea492d7fa9328285a26bb9e89fdea3d1664fe3b6 GIT binary patch literal 2122 zcmV-Q2(|Z#P)EC1|7;kyy06l4YQy zrI?|)fksMTsSy1Wq?RC=m4!kjhGQ<7EiR#AID<=8v`8-FLe|VU=l4fHFO52urs+%f z^WSsMx%Zss%z4gpE(5Tzu&}VOu&~TOoQVRlSZvPWaJDW)Ff0p4PEJnYL>YggfWzTz z<#0H+|4c|Mi-?~W$2eJ8S@RnT%c7v6p#eELIaBJme>fJF{}60(uxN!X4i>Gj#qob4 zA|g;yQo^joVlgBV$pS{S@GP3*nE2!TX<|_f23uQO#%4T+XV0F+_U+plc~4Id0s;b{r>BR~ z($YDLX-+yvM@I*ooSbm$)-Cw@`XVwi5^LA4#p%)~y&F9R&bv*s$TREspl~b~rgXK_Zdhz<~o0i^Uii7=Vk53+~;!$Jn*Bv_K}4 z;o`-M8qeqC?5GpP%rsU*g^7Hef=;&zr{Q0xSyNim7C@3h1 z{QdnYGc%JE3dOW>PG|4t=0-U=In3JG*_p0fxuVs-TCJw6tSmZs@E{#Jbck|ua~YjP zBB9{mU}l}4pHH5ip48jhOGHGSot@<4<3mcNlF6U1ukWP%B_}77P$(q1T&|Hrp-@QO z-Q7e)q*AHK!oq^ioH;}K`ufxEe=6$h>nSWOjHarE-|igm-o3+?};pOFp;NW1C zl$7Aekt15;oT)tk#KpyF^&b%tfsBj{?A^N;d-m)>N=gdi;^F`RHa0fM%gcjYE(ZYI zxN!r`&CRH&r~m*weE1MwzkUUu&u8)%7Z*1ve+dZ*7#bSVxGD?`3~>1HVPt1#0{}`& zN?>AQg3X&ZPrH{nVWypu=w_k(rqp z-Mo2|`uqDyM@NSm8ygwDTrMYFU0v$x>YC*HSL|ovzo(~%xLhthfBu}&mzS3lpU-Db zxwW-56%`ecLZKjmKtSitoukmuP$DAQw{IV%rlxA-@6DSxQ|8Uw+?>+V(wH13B_&a7 zYb%+Wnvz1Hpk2Fm(Y0&W=>GltbKW_Admvr9bSVHpE|U0iTrpPbai#%;^G3SR0>N=ODL5}#KgpC*mF1>$Ye5DSy^ewrBdmP?0@Fp z+}s>oE*G0NZDRE9?(R^jROsmFz{ZUm;qC2>^73*R8yiC;5@G-T{n)*GH`Ho1s;a6G z8ygD%(AU=o@I8MP78a9Ykjv#*wrrV(%--G}wzjs&%*;exT^)*wity;sBdvLyEx%nH zj*gBnGBQGWc{!Y&ou{?kvSkY*BO_s8U;rB%8wdn~Y3;|`@{enwPzZrQ01k(P#Kc7C z>FH_MI5;>=de2Plf978(6hfs^VPs^4xi$v|1^@s;p%4Jz?d^@Eq$C&{8^g!P2kX|Y zgG!~s?c2AZQmL52b8v8gp`jrp5(%7~oHYDBefkt5BO}S!o$N67#N7Cs31sZ?ZdZ%?VIsian`iHJz4RMMqOmzW_lBO`-iVq%Dhe#w3&{uK%ZSy@?8a&j_b zfAZu>5{X32P}$elM_ewK{`u!0s;a6YBBEo*j*+#sHTn7ZY3w~MEscaiAyrgVFtX0h zPO`VRr+|O}MmBz}5D_U93aYHEWQN>Dd94872RA;SkHEk{=;`TU)v8tK?(T-Gt1B*F zzC7#qibNvV+1bI&%nWU9ZAec~hrPW$fbUmSP*4!Ev$L^sZmIqu}v)005ax zhVJfe00582`>Fj*{paWBBOo9Eg@uI}8ykaKt;U@@cbK7a`SRshzkWTWQYqZs-2r^> zCV6>zh>D8R@ROLB2qJ>NzduY&OrWo?51CAc6DLj}Jw1KO*mQJs;N|5t>)g(Y*>sL^ zlu9MFw6xHR7cZ!sd5^*|RJ@*y3Q(3R@g3T49TWMJrkd(&NXE z|H(L579o?0gNU92_;&$fVPRomVPRomVfhRBA7_6z9-iP8JOBUy07*qoM6N<$f{Tt3 Ag#Z8m literal 0 HcmV?d00001 diff --git a/html/inherit_graph_2.map b/html/inherit_graph_2.map new file mode 100644 index 0000000..6fafd35 --- /dev/null +++ b/html/inherit_graph_2.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_2.md5 b/html/inherit_graph_2.md5 new file mode 100644 index 0000000..6b2550f --- /dev/null +++ b/html/inherit_graph_2.md5 @@ -0,0 +1 @@ +fd2d91a263df65c9be4996ada4b2d45e \ No newline at end of file diff --git a/html/inherit_graph_2.png b/html/inherit_graph_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1b8e2a73574908260bd574c5f7e1e2e09d4090 GIT binary patch literal 1929 zcmV;42X^?0P)`h6Axibf8)*^Z zQW3$->|zUzh#)D8Ac{dze?+~AW^|DZ#5?Kc70MeXX>AeOrXt?fdH;xhuRk|;X^0~ibjgTY`h7|uqpa6&GZO9TQz)KZ9H{C`m@m47dsTefgQ zAP__e1cJxEMiS#U!g6!{;Le>p&XvOWEl{acP%4!sZNguyh4BZ$nv3BySaUI)25T-m z$jZvX^XJc(S_a4H=qO||8T5MnQcD5An#(R)TU(*gXt?oGH`~n23~Fj>FgrWDWE$qP z=+mOD==FNsy?Yl84Gox_oWzC=8<3Kcf{2I+0KlnJr_kKo%=3{-rMPnCilZbfIdZui zK0ZDUi)X540C4r{RqWWY!(n-xg+rRFzrP=GadGhW_C{J-8YB`41_lO@mzRgUygcmR zzaO2Qo$&JVLUwjG=eK(GYDc91&#-;_c8A6@RWkqx3=DK=9%tc@=1NUX#m0>r@#@tp z2!;QC(q?C8V{B}U8%rb-$Ye4jf4N+a#Kc6jwY5R5RwFkz7gbeNXliPLP$)z|Kmbxx zQxOvr!}Hm*XAio%y3p3v27iBl6crVrzrP>1Zr#H8_&5$8Jc#7vWL~cF@^U*n$@t7tgI{~BqSgqAprm|H#diC*RG+yz8(^Z1V@h^#p%<#Hq?C852&9V(RyK0ZD;ckUeg{rxT03;+xU14>FtP+MCIi9~{wloX!b zQhrg(%`8tVt{?(P<2s8lMHm6hS-$&)yK{5ZnG!mwt|8pOxP!(cF= zv$GRPNlAG5@+Bf8BRQY)@^Tau6d*G*6PGSsLR?%NR<2x$+}vD@jEo>HEe!zy0oc8J zHvr(mg$sD_-~kj01w1`HQBqQZmX;Pger);&iR9#DvlPm zep~BdH^+`0`zt*?ovfv%riK8};NYOyb@B1>B8v9Yn-RaaL>L`31?;gpk;W7fZ@ zsEATiQ@L??csMB(3U2)3#R~#JLqkK{+<^lJsIah*h=@i^hx}mM>pU z0|NtA?RBAsh=>SMDwQV38jXg8LLt3<`z zV@apekyfiEp-@O&U0t02!-o$!e@potQ4b=bmX;PuPfsUPy=3>D%gxOV0HD+95D*Yx zcI~cRyLjh^kdP4W^|o!>cx!umdvW{rZS?l`Vq#(fTCLXTupAT=#Jyg%Y8Bkv+#r!i zcyl_P4gk>I-HqAVS)4d=f)_&|5TK{02kY0bH_~g3hQ;XX>w{PNaBwg- zZQ6w9=4Qmk#zH2OAv!u59UUFq;kLNA79wxw$#3^IKC7hhyu3em=9av((wyNpIe~p^=dho~@&!gZldV7CjVdwOXV3ckkX& zV`C%fbUM;#G`z#-LLa?ePqnqRJpbb*EVD3Qg(B@+BsjI7_j~_o05z+MYH0|5Bj}j6ReyjXWeOhEJ zj=Q@%Vq#+8;o*Vd;bE*>w+>}xWq(Y5)?7|x>(;I4@9+O(^Rs_NFq{T!E{4-!&BbsU zthpFYgEbe!X)OA*n30k3D|Ik_LyVe>h#CPLTmmf&27|$1Fc=I5!$$rA`c7S^?1C}k P00000NkvXXu0mjfOADLG literal 0 HcmV?d00001 diff --git a/html/inherit_graph_20.map b/html/inherit_graph_20.map new file mode 100644 index 0000000..44bf000 --- /dev/null +++ b/html/inherit_graph_20.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_20.md5 b/html/inherit_graph_20.md5 new file mode 100644 index 0000000..7cf612a --- /dev/null +++ b/html/inherit_graph_20.md5 @@ -0,0 +1 @@ +5c07f2c8f9b95724757561b37e6434ce \ No newline at end of file diff --git a/html/inherit_graph_20.png b/html/inherit_graph_20.png new file mode 100644 index 0000000000000000000000000000000000000000..8a74eba5cfe40d7c86264d6476ba4f6ced039649 GIT binary patch literal 2592 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 CA|)pP literal 0 HcmV?d00001 diff --git a/html/inherit_graph_21.map b/html/inherit_graph_21.map new file mode 100644 index 0000000..80448b1 --- /dev/null +++ b/html/inherit_graph_21.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_21.md5 b/html/inherit_graph_21.md5 new file mode 100644 index 0000000..17e1919 --- /dev/null +++ b/html/inherit_graph_21.md5 @@ -0,0 +1 @@ +3425d19a5d62b33829d30fa6da46adae \ No newline at end of file diff --git a/html/inherit_graph_21.png b/html/inherit_graph_21.png new file mode 100644 index 0000000000000000000000000000000000000000..c758b1d9052b2b258106c0208eaa2e9478a81c55 GIT binary patch literal 2633 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 + + diff --git a/html/inherit_graph_22.md5 b/html/inherit_graph_22.md5 new file mode 100644 index 0000000..f15d311 --- /dev/null +++ b/html/inherit_graph_22.md5 @@ -0,0 +1 @@ +eea86314dcdd21b7ab5f956c8b754992 \ No newline at end of file diff --git a/html/inherit_graph_22.png b/html/inherit_graph_22.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4996085faef5846c5a755147a72196f8a4cf2f GIT binary patch literal 2335 zcmV+)3E=jLP)cTRsi=Ppo?k&%&+k&%&k{U~1U(ChUYg+dYeCdA0RS%eU# z0|yS=e6i2% zGGv3u^oeW`nLg>Y2KgtFmzT$pBS(1j=n(*8#*E?2nKN%#)#zr_7$hw%jkvft;^N{) zWd4g6FOrdwK~7E%YPA}x)yn$y>qlg*e-guHkcST+a`50mE?l@kdwV-mrc5C*F_Brb zW&x0ynMqk$830~hUWA5*vSGspe0+QW(ChX1`uYx+94Cs3iinMkW#Phw0H{=|5nJn3 zdGO!?`}Xalw6v6tjt+u@gE1Hk1O)|2Io;>@?YH0Z@y8!a{dex%At50FrBcbMQ>TVa z)3DSa*REYdtJQM&@L}f9pHF&vI)Quw&YU@ei_8B#m!6)E-ENoK8jXgS zm>2+bIvxK0{*;uI5E~oobj9fPdOrXBbIfKlRaI3?nKFf~TemWP{CH`;qeqW&?AS3L zK72@2R21viugBfp-AUh;EnE2g_ummhV6j+8N=hOuEX*mVw6qi#7Z(Bo0$8zP1#{=l zmEwB6p7{89Dl03gsHni#*OzVEw(-FS9{|wV*~#wRyD2FtL8H--l9EDJRu;#PA4jcL z_p5j1%9VtKgmCKADd`LsFJ6qlzdtD{DKs=RNb@XRx|F=UJg#5APC!5aU0q$|z#}4qyq@;wbtSkp}bmQ&q-Q&246DQ*8>dJ!$4*zI-|R_wNVb8hJtI6kyw{v1OO{|X8Ugt9(@&W+X%Ynm z1uR&wfbYNmo{JYRGGoRJ0HUL#nJ{4j_4V~ko;=xMp3u-x{Qdpu?Cg}DVE6CecgpEz z-n@C(?RIi`T0rb+)Y|q8uRAO!)P?JXU`te($ac8$DuG}gNz+J766;g zMnFJ7pSeel9HFwZ61&|_O-&6y{`jLq0roO4{zQx!GluZ+a4Z%J0RaJYbab$B<3@*k zg+hVVYIQQmK&Y*)W$)g-)YjJ0*49RIbF))TG;P{6>GimAhl0GK&* zru5okvGl38yHK~;Y|@qWA~u_i_uhNYp)VvPgrJ}xcJ10lSy>qc1qBop6%Bgd{V`;N zgocLV?d{DUfBfNeufNPkAALl6dO9kVim6klN_T2+*laeZ_Pg)Ci(0Klp-`}S^JbJv zr9;k#AAUIKJ+!s85g8dtQc@DDSFc8;QgPzM35P2Np1+|zp;oK;>#x6f`t&It9v)8G z`_t>?<%O4*7lnm|Xti30xXEOqt*wnYbLKd$yLRnb5)%_yw{9Kpyz|bW_dO7XT!VOc zc#xf)&GzlvIeq%HL#(i{kn`uyOYQC=Rj1SSYYu?i++69PO(qlN<>kc2#u5}1L~w90 zWo2bVM@JJA6GK!~6jfDK(!9HN?PAlWO#|9PV`C$&t*vBdXY<7uUl0)yf!S;x=n*h| z`gAlJ4L|?#dJev;z->GkmNV9S;*?AWn`vuDprPSjT!qwFk0IStXLqo%W)(Hv<;W_lLW?JGr^JeD&2=sYhdENLXq&a{1;Rm5st3`c%{V*u(o8AmEYW^1Uw&U&X&D^ngPCWWuYs5OXAr+d>9292AWo72bCw;lN(hGhCgHi%50$Oe(=6WJg#ebQ@@ z+S~UeWd2<^8AJ$S;`ukMWd3FR@4c6ik&%&+k&$`h{1;U2dAXfCchCR;002ovPDHLk FV1g9%qKyCm literal 0 HcmV?d00001 diff --git a/html/inherit_graph_23.map b/html/inherit_graph_23.map new file mode 100644 index 0000000..1ce7e30 --- /dev/null +++ b/html/inherit_graph_23.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_23.md5 b/html/inherit_graph_23.md5 new file mode 100644 index 0000000..e958fcf --- /dev/null +++ b/html/inherit_graph_23.md5 @@ -0,0 +1 @@ +4f0c8835e4e7a131f54e8b49212d65db \ No newline at end of file diff --git a/html/inherit_graph_23.png b/html/inherit_graph_23.png new file mode 100644 index 0000000000000000000000000000000000000000..89f1b5a031b9a7b737237fea3c1512f21841d5a5 GIT binary patch literal 1612 zcmV-S2DABzP)Y5C`+dlWOjZRUpn9Bv~T8Y zQRj7aKF{;{Jm-Dh=j?f&Js=|^BO~*-AWUvBo6XAwLCB4Sm_Hf2-QGC4EoO3qAPBjF zAYA`7lKv|G+x)MbJ$rU;rTisycXwmA+o$Y{`o&sgzCkuWg2?7akZI@qKaoq9F45G~ z#OUZK01AbI*4EaD>G^HU-?L{A#l^)G7Z=aT_??}d)YjHwx7$&x)%biqs;a8yQc_YVEiGm3+O+`e-@l)(t}XynDisEUfqnb-v3T)f0L*4H z2?+_|k`u!H`}Z-KOl;e>4FIK5Iiq@u#lnsqJ18nD3Y(^|%=yosKPNpsoom;wv2o)@ ztX3;JosOEC8d_Rf0C2nA#K*@|S64?xMFo!@Jt8+ZmyaJm0+5xJHK*pkdGiL9O7+wA zPN$Q>!ND*p3e%TgUS5t?tEIKIm8htH->21TB@hTm@$%)%DJUoaz-Tm*l$1nUTN@^m zDP-C)o6T(Aycws{iOc08B_)MJhYk@RA1{s9($d1sn>QI586ht(kE*IF=FOWIqVM3r zgWR}r15p(5dcBmDm64H=5t7r<(Lq#H6dH|&^73-luU`+qkt0X&`FzyZ*K_gWMf7?- zr%#`rwQsXFe_&vMwzjqqTk&1PfKqD7oMc@l@i!S(B*f6hxvO7MEUOiWBr zU0sbvqhV-hC?uz_u#ky~3EXZsTeoiI_U+r`|3ps1*b6)RTI+}uoIVIjwk9iy|eQ+i?f z`S~navV`8=URJJL88nW;U?3?eiO-)uOTWCy<{JzK>3YM44Fm!K>~=djIXUR{dQ>VE zX=!OveK?r4`3n{-0AP4{7>!2r-Q1?8CVF~$2m}InJRa)n>q$*boi;x^J6pO|C=_I7 zX5#gF(P%V`kB?JbT^*D!2m(HzFU0&G!SDBT=FA!Vem`SlV+;-s&gmKiVKCodFc23P z$Gv;^LgvxQtXsDZtJR89sYI*QqE@TFn?F1}91<^FxDd5kjUWgdIBmahrL3$Bi^YOcspQtJTXb}ENI8NKasWJQX1&{)KYu;X^6@y5Jg(#{V=P;KGFq(hF#BZ^z+qU^1CVO-)6w*VEP2MSgxh1qB7<<>ldW zxukJVoH#*EP0bHI!@$4*@87@2X0x$n%NDY;vvE3|K{;x*T3VmNMObz_wY9ax#Kcfq zT1sqeEJ;a8^!4>&G#WW|>eNq~=z^sHoUgSy?Im4CCYDqTB5jpFDXY4h;N zS5lmjks)5Wazz{+9TmH~yT!L}-%eTA-`_7f91bxM2n4lzytYe!uAR`J^}y z2#60JJP4}scsyczd%HM1JS@I`{aSQ7ok9ICU%nLE+S)?ezlX!&5GyMy#i_gw>+wQN zOia+O;ak$v)4yB$?KbmUlu9LQ)~uPfE;%`w + + diff --git a/html/inherit_graph_24.md5 b/html/inherit_graph_24.md5 new file mode 100644 index 0000000..31cb129 --- /dev/null +++ b/html/inherit_graph_24.md5 @@ -0,0 +1 @@ +af26a59b44306ba4aa5823d391aec20c \ No newline at end of file diff --git a/html/inherit_graph_24.png b/html/inherit_graph_24.png new file mode 100644 index 0000000000000000000000000000000000000000..e073ce086c4937f8a23822c985ac46385412bd42 GIT binary patch literal 2179 zcmV-}2z>X6P)!)ztt{{7kB83Fa_UmE z{5|IbgWdOao$LCZd*7YiXB)u4z`(%3z`*d&hx&0sAP_iF6t(4dh++71kw_$e|2Sv- z;{-)fTPTXUyEu{=Nn?N_}5BdSQ5zPa!4c+y|HDBtcBqp1Y;hCIm4KTVa_n- zVVE<2jCqoilTle&xn%4AKeAxv85$Zwette8BO|eE*Df48b__C^jE-kyWPs1-gU{z9 zEG!H{p%DH3{d8O)5WvUBXQAXw;aAt6jf8{*Jb3UxZ>+q$9DF_>H8nMhtZIHNhiV;xP$kCImM@Xeo1P2ErIXM}jp`i#34F&MuE5+{J zyP;4hpi-&e>go!iPzXCaJGx#)MFsBNyN98nA@F!Sq^73A#Kc6eMt$|e!^5FeDj}E4 z!Dh3OnVE?-Yt{e&WHK3U+_-_hzCQT)_#iz!9adIW2K5#Q1PBWY!}I6Qp-?C=GBSeZ z=4NDPXQQN~1fHIrxOVLt06?Wup}V^qa=9EH9v%<>~C~gj6cUsZ*zPjPs4}7yNr1 z92{U|WCV>y0|01jY{Z8TALzJTF2|umhhSu61c5++wzf9#cszXm{22gn{``5QrKN$- z=i~6FvR#KD6Hr`4&ier#+k%+1Y_n3#yZzCMJ9hXVk5dwa2U>sGkBy5i{3qp+~B zKvGf?ee7(#<#IVk3%F9VfE_Oh=_=QNF;(lAfR)_Vlh%uQov%daNxiJ z6crWe=$=U@kH-h`1p8YC{Le0B>+f!d;5%eJ9g|Ksi~>-`1bAFgrX>-R;vjiglyitnMfoOI?my6 zNNj8@J^u9R6JfL2LLJ0 ze}6wwDwV|2(vpmgjnVPZ(NRJOF{n3(!_hfcLI~k(-IU$w`BB5<scXuZR1qD;iU!hQtRjXE!+S*#Z>oXk<4Gknd zKA!0F%Dg|emM>op0MKf+aB*>&F}JL&3`(UE!^6XP{rWYsv$Nsu?mlh4pPwK7+|<+* z-rn9&tJQFEalypI1Wuedp_5Nh6q=ixv3BiRgS2~ic+k&nZEflE;BYudN=kx{j}HO^ z0}&JygviK90DxMpHmJ9^xA(05OG`^JK0c0p`}Wau-QC@&s;WXrNXV=@?dG*WkD*HqNAe&(b3U5ecru$hp@0P6c!dDARxe?wK0Twn`h(3jj*z^!sEw}!QpUb z%=P#8M@mWxEG;eJ=H>=#YwH>FwOZ|zv5k!ltgWpwTiR|obym;}#;NHf@x=X9Cmsl)DPEL-_8>p_X4q~xb$2>FX z+_r5SR;*Zo^73+2R8(O9{{67Av7zG{jRre+?u1Y%L_|cyv~}jfyv<`~W`;9o&LAr* z3tnDc`0KB~=vY-%70k@c5EK*yKzGAz2*t(4h>wqljg1XzYirTa&;W@<0(WU3D ze*HSMTCG97^QH7{S58Q?5`pHa76}^_{YDo{5;47__vsz}3|iJRXmpFDfcRU0ofXJ$puf$HwRL zp-?D(eo+kJXE)5>Gchqinwpx3OeUi@f!|Q6RHU`Fb=qSU3I%!p{yjbBa5&`Fty^Sd zWQ54&axyS5p!c|rjt({TOy1H6tlibzS zMPxD=y*V|s_m8!|(cRrmq*5tSC={f=zJA)9jFy%bqEe|0);T#jN!G4iODfpwSWJ1tE(E{yZj0gf5*!>1nM{Vv z%uK9YxpGl^|FPy#DwV%m!jhn>s_M7({$qYsXIOeL=3$sKjCmO53}YUKIm4KTVa`l@ zx0R5Pu$Vd+mLOBiLkOt_@bBNCg@J*Afq{X6fq~(V<3E(w2T?t&Lz(~p002ovPDHLk FV1h@PG1&kB literal 0 HcmV?d00001 diff --git a/html/inherit_graph_25.map b/html/inherit_graph_25.map new file mode 100644 index 0000000..7fbd851 --- /dev/null +++ b/html/inherit_graph_25.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_25.md5 b/html/inherit_graph_25.md5 new file mode 100644 index 0000000..7443956 --- /dev/null +++ b/html/inherit_graph_25.md5 @@ -0,0 +1 @@ +3f9096f23c8f43660a8c16148fbbe67f \ No newline at end of file diff --git a/html/inherit_graph_25.png b/html/inherit_graph_25.png new file mode 100644 index 0000000000000000000000000000000000000000..de488aebbd32bd59e18c66dc5953cacfaf1c46fa GIT binary patch literal 2235 zcmV;s2t@aZP)~VQk!49;Toc1vZ6GxY|UqghRcl< zLN(m&sNjVEzK|pV=Mr1UExLLBXnLL-Xgt=kpir*IDB{X#VBUf}>ee zXu;8}DYW2d)Zp=WsI079HUIw@!6hapqP)EPxAp(0AQFkt+uOTp{xw#qKg!_XAa38j zjTbLoU~Fs*Ha0ehh=_ovrzZg5+_`gTY-|JoY}&L5PEJlpO-;p?En5Igzp_{?)=H%_ zkJa|S6ns7(At50M2neA1X77ovt}fVYHXsG|Z z#=_Fl5^}j5X=!OlOG`sYNC>1-Da_2wkd%~!p`jt<<>leQg9ngGrC7gyJzQN~S0WXS zthWE95R1jwvuBT5-|Rh^oSZ~MLjwW=0`TO?6C6Bv@E2vex~z!cqNAf>Yio;&iVEoH z{Qs1m5!VcsmX`4K^#uU9ySszUW}~*Y7XJSJNK8ybU|=8u0|Nm}zat$vas*Bom0RS2r8jzo#kG{S>xVpL`BO?PwMn+o2=J9w43JSu@moFg}i!nSrjP~|+UTRaF(9K7C3FZmzG?)KpYfR-(SX9y&TYu(q~FbaXU)e0-?f zmRj3P{-vd*P%4!O4Gl$DSQs_-_3Kw$ym(RL+~u(BJKX#C?@?P@i}UBttBGxf*-z4J z%+1ZgWHK=@FaQ8(Zf-_*cQ-XI5{VEM6$K`f2_BCJxm*r!Z*Po`j{^X5a&nNKo(^AM zU&O@3puD^s$B!S^nCC+NV`F1sU|@igCr_fUuMfe&!2p2X-d^nAzaKU>HaLCyG&XMB zh=ha$YVK08MIsTRqobj(uaA_J6bOYvSXfx#=+UDP3WebDcnjt@Iy#DX@7`hi_U#&d zIXXHbJUkpip%7VFS#WlCMsRR2>g(&ZS{nce1Ol8obqc$7?ZSx@Cs0;ahO)9UYCJPD zQ{&tfCoV27G(J9_XiH5^4FNzD3dN#!hYlSg$;ru7`|jPlgu!5twzf7x2qB)Ho}{p_ zkQ(Q5xg<6=mTG_h{++N`EOPJOJu)ybK=kzVh*&J9#+6DX(bv}}a=CoL_zU^Z%*>?P zU0q!S0QvOk6Ol+H#L&=?jE#*^<0B&@gb<=tY%Z6pwpKz2adUGcMMXvP_Jqx5lYRU4 z5ic(y@M>?3uVN`pU;P(p&?33OVy6l#p0Qmm_VgcVQ_E|CMG5e+AOv&%VpVjxOMB+Av-%8 zmo8nxvuDrL#wsf-@%;I7sy(y0?(XhOiVXmYii#-F)z#IZsi_J6{{FDHw+DyAL1SYh z_U+pTUteE%dwZj$rG@gFmzRgMw6vdEQ*(1ODk>_Vr>6%uH#hM4e8^-nD3waBVlRZT zu`zXDT?~mtqEQII^qu+3moLc9&PGsB5Ij6QAQp?YUYnhr9XK2g1Ofq6Dir`gCX-Pg zpQl(~OWI$I}7ZDK=FfcFxo6Uwop@6%)JFZ>3_S1eH92~&maKK`*Ad|^(<;oT8 z+_@9L^zj@O6@?o&ZotCA0&=+=k&%&LGMNB?_V#ut6pEjU%VM!05C{+x69X$NE3~$@ zB0W8wI$oBFy%6Ey;YdkI!J|iy;Oy*7RjD)A3_=JxJ3BExK91tzVvT<6?d@^+@L|~5 z*}=}v4xOEyaB^~@im9bwGMTu4|31RQ!(nA*1#@$AOifLpq@?5rc4!6p(V}5C6B83e zDwUFkh6d8#->){-($Yd+zkaQ8u2?K4A3uJi+FUM|6c-nh;o)H-5{by?&z~2Z*V)-g znwpx((9n=te_LA{kw_#O{Wmo=k)EC&s;yF~NOg6!TA|R@)kPW_8Z=&*HN~Fmdxj4m zK9JhlTB_h^X=x$V)zzfBx|-C~)R5NJRx&X$p_MP0Oh)SJ>WEUQB;DQJYDJ7TYg4II zFMc12R-=)(0J6N&rQdb&@MDnXspjidzcQ~3gg%%vmnnDYXW=)|5N3*8Tf}>ee zG*+pa{#QstvmE9Lju29Z>3>Yq&@7ApX^Do0hK7cQhKA-h=fBZ4rgoG{m;wL*002ov JPDHLkV1j5;Mu7kT literal 0 HcmV?d00001 diff --git a/html/inherit_graph_26.map b/html/inherit_graph_26.map new file mode 100644 index 0000000..fb7e025 --- /dev/null +++ b/html/inherit_graph_26.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_26.md5 b/html/inherit_graph_26.md5 new file mode 100644 index 0000000..edd733e --- /dev/null +++ b/html/inherit_graph_26.md5 @@ -0,0 +1 @@ +b17aa7145e0a462a4c49cf5300ec805b \ No newline at end of file diff --git a/html/inherit_graph_26.png b/html/inherit_graph_26.png new file mode 100644 index 0000000000000000000000000000000000000000..493f7e20e284d149e0bcd63b5cd93f9a497d8b08 GIT binary patch literal 1921 zcmV-{2Y&d8P)CV#l8gtJR93p&^ekF1jr>LAioxwOT|)MWMO586hG6t2u+g z0Jq!C+8Z}+L|R%J06?SBKq8UAWHKQ=Jsl+_CCJFgKt@IefS;fEef##oYPF)XvlDW; z9930Sh>VP6<25!m;=zLl7#kZyN=gb!OG^OhtSYa=yW>t_VywrB?aHVe+K}ZIdcXT z6%|NJOGAEsKAM`EaOlt>zx(tRzo4K1d_EtC4q$ z5v*FZ3dP06?Ap0EEZ$`{{1i-jnL_IoOR32&W6!wM0IsF zlu9MCva-u2qBzut5hnFvl2o`LP7#*XlP(< zuDZ>}XfzV7R_k#Ne>%;FqM{;FSXlVi?0Q)6EoSA)l>h*j%LSQC7SQ+Jy?e0PY;e2X zu-omZt*u2&OpIUu#Kc7QHIK(be0)3{4hLj18K$PDaO~JI4}XSX(B0jQ&6_uK+Iwtl zEc<%x+O_OCR4NsUi;JOFtFe9icBH1J;^4u9004)>!6|oqe0;#%Ty^W|=|O#cJ$ib2 zFflQKp`jtKUdo?N!C=7!qEILh5fOnWPo6-fQU&zgwrv{>1_J~F0ivR!AQTD%`ny~% zFMG|JH4qAgU>F7`Po4yy&-d`zx^*k(y)%s0kJ&62E?mI5bLY_2)rITVucNlM7O!8w z=A1h$%v0Lgxwz;yF)@MUw-~^`PQhToJ;;g`D^OEYgR^JP z;?bi=9&?W$KgRRt&slrAN!4gHa~1~xG&D4@hi_?Vf!S%7l-!tcI?=( z18He#NJ&XSXJ;oH_u|EiC@(Mnr89MObfCGp8R6mKNJvP4UayDUZima|;*{GLLZOiD zw*YRs_4oJV%a<>xsi{F`W+oC76JfPlIqMV*g7OqoSy_p&urTE02yM) z(csdhOTQd9HZ~SX(TI+YMqgha6bgk`0~$!DpflelbtY3&Q>3e_i?p@1k+2(CvzfTvZjW(?!$E8| zo8S0mvzZJH4YBr*A3w;`r%yc^(}95j($>~SMn*>Fm3wyVY2LqoPfRA0M}td9VBH8I z#BR5fmX;Rca=FOh;GoBPt~$-dqBW@=!NS6zP$+!PDV55AYt?GC&vAi3fP{nuzw4w@ zDWp=V*ZAz_cXoV@M&n_JgoLo)(M%(eNFb3&=AC}kYeF~nlA*LWb^0MBMxC=_DD zh7DdmbLsS}ESukAD9e+eUO|G1&1PHbE&LHIwodd4LJ0^h5K2I3flvZM3xpC7S|F5w z_ + + diff --git a/html/inherit_graph_27.md5 b/html/inherit_graph_27.md5 new file mode 100644 index 0000000..b5f74b3 --- /dev/null +++ b/html/inherit_graph_27.md5 @@ -0,0 +1 @@ +b4e9d2920e9c64819d337fe8e5b8b062 \ No newline at end of file diff --git a/html/inherit_graph_27.png b/html/inherit_graph_27.png new file mode 100644 index 0000000000000000000000000000000000000000..6651aa9f0887b3f244554e4c884adb250ec38069 GIT binary patch literal 2193 zcmV;C2yXX@P)!Q-2%Bzh_gkvL?++b0*frWy#E$=0DNl14)`Fb>BB+ z1m;W~g_W*ClO_`QKtyjs5i?1X$R1v3h>onV?$pgTE1YCQ%Cc$Md`L>o-~A#yw-1}G zoLO-`Fxc`*pGy{$wU5CaM7ZYwFxAQ%zD-RJ7oN82)UEii)68sb?*I@cDei#l^wj-yZ;Q;=~CwH#Y+SR;*Y7 zFE1|~J9Z4KSFZ-}?NjLF;Lu_m;+S=OS;NXD6hYw?La1aFr1-O3w zI@;RWuypBC`1tr(LW)TiI{x=isZUQA$ogz;p5{2nM{V2D_5G8TOyHQ_wL?fTAcwL_{DyJ{|y|P$*DYS&5R8 z5&%F&MFonBi*e(|4REFE%Q#W;BIAZluA zuz&x4lRAyXPe@3Bt*tGRlatZg+l%PvXaIm-uSZBo2>5(HjvP6H<;#~NB_)ME_ItUN zN+sgs<6&cCgQG`}LN1qM-MV#%iHU(+E{8-SF{iXfk;!BxYa*3Ok)NNBn3xzuMMXg_ zmqR9#0RY_H-BDIn27|!>;G3y58V&B=y$b-St*yo9&!6XQD5E4MCjR@-p+m%6?%%&p z0FbV(t~vMZ+_{sarl!*4t5>fQilT^Ct0jaG;_vTIii?Zsb)is55)u;V@s}@Oh?A2O zsjRFd{r&yK+S;0^R4RJiU@#CH8ylk2>5S$#7C$2+gC2KxcM|}ludk1&)oNmAXGcax zM(Fk7;bB4uF)O!FD4ce#gb*SUiAZT_>8zSKJ3Eu$;NWR5gTe5_HPP$!gvDZ!$B!S= z>k5T}SXo)o@iuPUNN(P|Nk&IU35UZWIXO8bF)@)4LP%_EEXmH!Hd;GV6c!ee#Kgqw zGd(nKTP|C+3;M^1{lME1^&*AQTGc z+&fu7J3BkLySszK;mo;z@=`r@Y;SK54u=DZqHyZeDcIWDPTR9(%NDb>Q`D?~(xA!D z&&S!bXVKQyhLVyJC>lX=brgBVk*~<_Ee^7VsCGc@$qpC4-eBV$H$K!0RZ;) z_5gseurOq1W`fJ*B0M}Cn>KC2`1m-kUAu;BEiEkw4-bcjhX*`8J<;6UjNss4h{a+A z1_nZ-(a>=V3JQ>xmiANU)Y{sLy1F`8TU$dU5+Nxm3GMCeFc=JGa z+}zwyP*6bc&CAP!Kp>#6o*^M2=9_)c0G^(n^rbs5FAtkHZw8yqMpac6s;jHv z;^G27KR-A+I-;wq3v4zU0MOCV0gXoUQ+b`7oN(d71@L%01Ox;iC@2W&>FMBdxn|`y z#=d>~AeYM#7#IktR7%fRRaHSO7EgQ4{BW966KiX0l$V#ItgH+k9v>)hcY=x)pl8o_@R$78Zt=FJICoTM&M1#*cfSRYa>lfP2|Ie57X8(8Vz~z z;)Tg$RVo#E`}Qq877B&r%9Sf*XlRHil}hsd{d=Rwy?XVEw6wI4!NI|4^IENzsMTtd z@mpG2$h&v%=<(ODUr9ql!?fnSyStk-H8qjGzP=yIJu~(sZ{EBijg5_TldsWeNJB%z ztXEG@&zzd)s>$f+D0%km8F~KvIT;%po3-BF-cDLtTIli6&=6^8XdwOl{YKAmE=)D* z7B!V6nKTu{?~5r@{Wib-G5kF&z>_Y^pjN9FTLQyR!d$5sEDmET28+X(ioxPAred%- zjHwtbj>)^fq@<)@se|D!VwR~0A&&t3XA!h8{DH7otk;XJfq{X6fq{X6;cw)B-fvpC Ten}cu00000NkvXXu0mjff7vCf literal 0 HcmV?d00001 diff --git a/html/inherit_graph_28.map b/html/inherit_graph_28.map new file mode 100644 index 0000000..12b15cc --- /dev/null +++ b/html/inherit_graph_28.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_28.md5 b/html/inherit_graph_28.md5 new file mode 100644 index 0000000..7124137 --- /dev/null +++ b/html/inherit_graph_28.md5 @@ -0,0 +1 @@ +f7bf1f7ed4be9db7c33056fde7c9cdd7 \ No newline at end of file diff --git a/html/inherit_graph_28.png b/html/inherit_graph_28.png new file mode 100644 index 0000000000000000000000000000000000000000..af105d980eefa64cefafa419bc33755283b79297 GIT binary patch literal 2117 zcmV-L2)g%)P)Jn{5knnuw$})3W&k(af&rkJ$Yo@J2IGIWkwo(cGkvicxpwW^ua!dcN1{|JQBqQ3)@Em8Ej0gP=whR>8FaDH z*bKVZeq++p(@|btKHoB|#&1(>zdEu1#4oPCz8-qLe!gW`jY&_VGo`n;7dLL)!0Xqq zF*rB~FE1}7B_$yuA_4$#{P=Oy)ztw2mMmFnZU2! ze>$X6DH0PCv2EKnYHn;!j0gk*6c!fRTAod?O0hLJH)HeW&2V*fMM_Evcsw3jT3V2q znTgEIOe7{ILaWun#l;1O4jn>YUmuE!ig5q_eQ32>EL^w{p`oGHkTNO1djIKAsZ@xJ zj5L`Wn-e3;mMycjG@D_SViSwS@b>mbMMVYd?EZc;8w<+_kHu0HC(E7RANI=<4c1XlN+1v$Nsk z65ez5xJE zpFWMOtSm%FM`Qo~{U|Rl$DTcVCe>+f|CE#zu-R-JJa`aYU0sNej|TvJ`t%8#Hf@5J zmlqBnK8(eS7b7h#jk zZpdUZ(bt}op$e_k|?%W{^27~ByIzk8`5fKrjq@;wh^Z9&| zl9ED=hlhs=m&+x0@7^UnJw1fQViA=}McEAo1F^TaCoL^4X8oJnKQ}j*8n?H%69A;U zyPK%hYU1eVNCpQ7Df_^{03n1}-APnb6!od9s+v^u zcw{me5sSqZ#iZBkiJhGtdH3!eWxsdt9%Y|RPR*fEC`f8*Dlu1EbAF93TC@lNU@#cq z>FGJ;+Oo1TsMTup_4T2lp#cR21@QItopilGAfT@8?d=f~5(1r02TxB=jEs!n*s)_K z>lq9N8XFt2di83HwEOw_QPrArgtObLUO~fKI2g$ahFc zh(#LKuU~J{vyIg>o~EWI6c-nxsi_GA0|V&n?3{4unJgx~UJo{#4S#=s%D!&hI_lce zxaPu~i!CT92u@B;c=6%|_Q-%OoqW=m@r(^0GP=L2@-&*W@!2;9NPUg$fo^4=Y z02?-JKyq?2q*5sy9UbxH$rF>;=v00<91ezthA=!l3gtNt)>bf?OaMS*VK3*50R0P z5Q#*{%F2SXv$I9M&0%crg+d|H)6-|H$=BBx+qZ9rkB<)`BO~GC<3qJDmcU}MP+D4w zbLY+>Ffb5n)~vzM&=7#1PvP0dH790zKp4x&$OzGDwWPMTmVEj0#l)u3Xvq8b?JfsU)92e>QvHhYuf!LZKjieSIeLI-QQF)#^$2S11&u zv$K;LkB*L#moHzM917ao+evM0E$Qy=o{{hIdmHKK=pb^roNB^nniE0@X=rF5)z#I+ zU@#E9UT@OSTN2aY;2=?{RHU=BlT=q%6E>SoMn^|2ipvtFIv`lJ*sO`M*l4UrRaF(~ z=;$DX{5;(!BqWg7*jTIj_@$>&ntu*XPEHVsMBs2ZXm4+ao0}URJa}L;|G#aqsnzQF zmhi_B92|`1=H_|x|J(fQgXYhNE;bsQK^Gg1&7g~o#%9pPMq@K3J&j7GQd{bv`4=#u v*a#uj0RB4 + + diff --git a/html/inherit_graph_29.md5 b/html/inherit_graph_29.md5 new file mode 100644 index 0000000..b2e3f64 --- /dev/null +++ b/html/inherit_graph_29.md5 @@ -0,0 +1 @@ +98e9c8f60eb4fc56cbf0e359e52d7479 \ No newline at end of file diff --git a/html/inherit_graph_29.png b/html/inherit_graph_29.png new file mode 100644 index 0000000000000000000000000000000000000000..42ea2a2b8b2852e7f120ada5c859b6270d89c795 GIT binary patch literal 1655 zcmV--28j8IP)x2aLL z`8C1%UCsK~Yd!nnal1AfBuSDaNs|1Z@@t35WQtT2C1W;%k^DzZP0fFQ?VI~+hoUGM zilY2yWHwB z3rS2&yO85HnVHjF1BskruNNtP9|zfo-D6lzh>>) zwcNRLhb>#SP+D5bs#U8fFE6LQz8-+Kwl>1U!?9Q_6c!fp^yyPFGBWu3^(z3$$;s22 znCV`BJa)UCo}M1BzS+*nL`}()B|kr(*w|Pa8ylH3=b!p3EiJ|4@u=;{$VjrXvH(a; zO(h~Cf~KY>va_=(DJdZ*Cx@Jz9N_&0M*1h2Gv?l9Q9E ztgIv?Bt+BRCX$M@#9A} zZQ4XkObiDP9%R9S1r!$-tJjXVx6NiFKR=(qz(5WiI)ueyVfpgq?A*B%i^YP;Wb%ug zOj==K;lGNCiiB2=A3qj==<4bkbKcgiTSZw}ncBW}>y}UyMYvopA%qa=>FJ`TrbZn% z7!0DIpg?VZ`}R%f^?Gsp_HEJM-!B3J0)*XeSI6CMw+IXj6rG)&KKJ*vepOYK+V1Y| z7J%sM>k|%#Lj(s0i=m+*b^ObhFG2{RX>WtU;B~J;2$7PKB5G@E{VFHESglr3R8%B< z)yAa%4b7iF9{{)8O>}hhm~-pu>Toz5csw53+uNzGt|l%nZq)f{X=&>3z`#I~l9F(_ zTtr7lGdw)Zkt0XE<|~RqM@I)MSFY3)dwhJn`a3KvOuY|-!9a0wG0DlvY}l}Y%*;%7 z@7@i7%jMFvcT!T4rWpJ!Cu5m(u_PuY5)u-^!-o$s7z|_1UAJx>rKP0=2L}@y8%t%e2oS>i}uQ_YhtkE31qWt#JU3LEadCs0aOIuqT*REZo zy1JT|FJEfjd+uEC)Q+~7zvW~slRmS|n>UY>Cr@(b%o*6s6BidpLP7#9EiG)^xRI=^ER04YPN!2{_riq>l$V$P z(LJ@cw$j+xNI*aUDJdzK&1Tx$+i||^6Fe!S;?tWr^w68 zBO)S#w6rvqELpszf>(bLnT zwtxKiAs#(? + + diff --git a/html/inherit_graph_3.md5 b/html/inherit_graph_3.md5 new file mode 100644 index 0000000..58cc88c --- /dev/null +++ b/html/inherit_graph_3.md5 @@ -0,0 +1 @@ +371755ab7582dd54e54910a9509bc365 \ No newline at end of file diff --git a/html/inherit_graph_3.png b/html/inherit_graph_3.png new file mode 100644 index 0000000000000000000000000000000000000000..960bf1f5b6e300e49c5c829d940d1ecf8d4a00c4 GIT binary patch literal 1768 zcmVP)!lWQ2q|IchXB(`28G^bM3%rcFrSt2S3MJ%QKa3W1& zZA}xwYL%6OMjwKL3W6vG^`#G;L-a;QWDvfSZp|5#FGHkR8%4F53}xAMJ{-<-+~(fg zd^vdkVDQ|p*Z=-=jpw?@00x7>U@#aA2E#v`XNOv?mU0}IJs)BiiwB)f_m^ki63-5f zQ&YVG4SC`uwxm=FRmoG<3!n~tatC5h95V8FhgJ)BTNHUtuW)u_@AU-}G zDwPUSsT4y)L(poq&}y~Vzkfe^dwUTV7l*2(+?ww-`K|N<@-T zsZ?V9`t^AE@+Aa<|K9vnRaF=r9p&3nsTBG7`CjYQYBdTA3t==GVK5kQ;=~CwH8r8L zvl9Y=04XUcP%4$k&CPXNvuoEbynFW!MxznQ$;oJFXn@&l#?6~I@$=_T95`?QB_$

niN@#Dvlo}P}9k`gpDG@!P&78w~C zC@LyKXJ@C|nq$X~VcD`}sHmub(P%_LK>=!NYEWEUjJ^3?0%`EXvxd`XG`M%~9?Htfux;Bm96Wds&CShlxm^4iR4Nrj zA`vPoD)8mY7Zep01@vpCdIQA^q&HOm!sh7Fqkm{L8VZ)?=4Jvw!^6XV=k4CTn-UWf zDK9UN|FpKY5)n~mW+qivSNmPx(9l3irIK%FW@b`dT^-+k{`@%sAdAJq_Z1fxQ+<6s z5fOd={+)zEAsGw?e%x-iQ*?AR4Gj$ibyiOeSy@@6)9I#dTdh_S2n6*0{d<1={{8y| zfWChH%Aeu<`Sbkv$jFG>xIfRPiyug@zj%T4M#4WLqVDc)(r7d^UG9bbnvRW)1pwIX zcBG`F_?^3B#}2ppXTydK{PUJATioUj3=H7bty>rv7{J)r7;HA1*X2Malkv~XmoGH&p*-LfAE9OiT>w>gsUu;zhi8 z@xpDasi_GqEiEDMX|Y)F{QmtL*RNj>>kR&wZN0(x7cLR`(fjo2 z)2OenM`>v(5)%_4m&>tg)hb-Ob`42MNg?l-nwp9|d-gyklVRu1osh|7d^s>vqN1Yk z;K2htd-e=TNlB2)<%o}u$MEnlqN1Vz0R8>_Fqupd(I6BGarf?BT)K1#n>KC2+O=yj zK0Xe>{VfnFW?OGC{zaTnFECSaxm?uS+e>fWyrFO3zPXK=OePu}9Q0Y#+H5wj{tq8M zP)A1x+3j|+TCHxyv*#Lz!$B=AEpF@k`ue7g`SIgN>hA8Q(a}+_`8_>7L2ED=4D|W) zXP<2%BB#?y27`fYHXC(xbdX3SqRGk0Y0oe@IZ3Zyzb2>CNkslV^A#@?&phJ=(i_OX zVDNW=iD)u1+-YrXrB9ze5fRbE#02fzw~rJG#XPI>&0Of6)!Q_~H)63Exw*NJNF*2; z8Nuq+tMTyR!}*rwllj)ml5rNv$jE@%Y@Tl!K{MZa*}rxe3kH^qj0FQrM#h4HB_m_O zz><-%VDNdHE-x>iOC1b`cQO)D2Y>_fpoPI;Fc=I5gTY`h{PH&m+TRoj=}8g*0000< KMNUMnLSTaK?p4hI literal 0 HcmV?d00001 diff --git a/html/inherit_graph_30.map b/html/inherit_graph_30.map new file mode 100644 index 0000000..2920d65 --- /dev/null +++ b/html/inherit_graph_30.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_30.md5 b/html/inherit_graph_30.md5 new file mode 100644 index 0000000..b574198 --- /dev/null +++ b/html/inherit_graph_30.md5 @@ -0,0 +1 @@ +6f97764c059edfd1f39d922d3e036fc5 \ No newline at end of file diff --git a/html/inherit_graph_30.png b/html/inherit_graph_30.png new file mode 100644 index 0000000000000000000000000000000000000000..493aad30538dfebe3ca04c16b2fd73121ca73edd GIT binary patch literal 1989 zcmV;$2RitPP)4=Z-&Yoe@)rvW3vB?7n$KA^=^`yHEp9J}LNTYMr3D&|#%kWj z1GP{nD}pvD#p|I>O7VJVlTy4MuW3@bT#nAp&i~u||1`YGFT1Dvl`=Iog*$id;N{Dg zn46n}Kp;SVem+uDQvm=~RaNNi?F9gA+O!D?2?;oJ<_xxO-3kDZN~PfOc&;kP3U}vU zj-sL>WDfBzmC85sx*3qxUHA^3bg zhK7bvUS5v!@^a+l-G5g^QX<2r~NX=B~4mTP=J`27<6@Y!N=#XH;6^^7vb~ykVqr| zfaK(4golSisZ=5}GZS*T99dae$jZtB@aL0!=+Gf(G#co1ItT;;R99CcG&GdW*WTWa zj*bpYO-(^87Ne}J3|ubPW{tM;XJ=tn z5}~rP5`lq%PH9V}QXD>f7_VQyhDM{o%*+f12M1AKUys(-R>a50J2=qQv*CC;5YXVIXGnBQ1)wr}4K z4u=Dy(Fg$O@9)Q#FJIWWTCK+MjB7#|-;c6K%Z;M=!v*tc&V1Ofq0ojL`7e}9yel(2i3 z(^jk1C@3g^udgpopFWM++FI<`u>(hr96@buEu>QEvYv>=V%)rW6CXZ&VB@W=t(csg zL{wCiTRd8=Uu)G`F*2F#KPOL~B+l~e*)sxw3=a=GTzBBW0a8|0#*XjZyGIy?AqIni z5JE_5YAU&P>lPaq3WcPwu#g@9`0<1Acsz3d{(WLJ8VQ%nB^r%}jhjp+;_K^6hK7c0 z>f6d+U0uzN$HvA805UN#L9|*e2?z)vb8~ZSe0Fx05JH^N77B$H*GdQ>Nl8gWp-`;I zlboC!QdL#O#$#h+NmEmk%RE}DzgoXmb3bg++}uoLGTDQrJ-OyT_Zv5E1OS*!CiV%p zM_XGPv|25ur>8M6Fo62{dc?-Y+FhTLlEQxX_4P$!Vj>I%1EQj$Fh4(!vuDp*tY;Vo zgM)*Jj*fP!_PDq>_IpT32zwnup%5h{B@l^3*t2I3($mwCo0|&&Fc=I@X(uKoI#q)s zPvmkr^78UfS62t6Qi+j~5#;CRTkLnYN9Ne`Yhq%;|h^J4VLMRkE zT)TVsZj_dmA|N0DF)=X+3JP+#-efXaje~=O5fl^zhGB62{CW8K`B|*lwQHBtwKI&> zkHA`pku%re4lQ%m{7$-l{d!!uZ~=97b$I;vu|=%AyBp7+KWE2_hlJ$h@v5)$H+wk`7V@=#k_3$a)Xxm@maEd>Pyc>DG(1OfrXVzE_xEgk`X zzHUe)5{u8rj~`d$*J?dkH7h+hnKM5>PxN{{QK?j9a&polrqk)jyLa#G?$u~C{uuilDl{Bl9`zqqE@TP_wV0r?i(2yA$@&)WO{nqV%}gd5Uo~gH-BGWANl(AD?9%6 z>lf+i>9II0jg5^Fl}be>CMH&-y)^eCpFVveN~MxLU@YeeA%rX}ERg8vXma)HRjb%q zJ<{oPq^GCH>N7h#yDGmNX*q+vgOf{})RipWfPXtro;)G`{{B`EJt6-*kKA^;r?`*I z%uJ|MD%8}}V9S;*o-W5@cx{tvwOUV?;BmUUyB)^=EgpHzub?Otd(bAOcs;a9DP9k4 zQi|6@o0Q`9*gf4B6&3xRbx + + diff --git a/html/inherit_graph_31.md5 b/html/inherit_graph_31.md5 new file mode 100644 index 0000000..67179ee --- /dev/null +++ b/html/inherit_graph_31.md5 @@ -0,0 +1 @@ +900c39a50a2818dd255eb8bf48da1453 \ No newline at end of file diff --git a/html/inherit_graph_31.png b/html/inherit_graph_31.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0a10a94550b5d1a1cd7188633ddd5d49c03f71 GIT binary patch literal 2322 zcmY+G2{=^m9>>p!nQ4%*kJ4BY%9_TSbs7wY$`UgD)yS5qR7Tc@VF(r7vCWK#h$gBj zx){n58B%T-`_e)QElO0%|LwW=x%au}Jm-DSbDsB{-|zgE&-cyP@8K+s+KhrANZN%+ z@C0)axU`UPFeYet`G5&dadRd>>wnH`&6O+&LOyXJIC#etEpo$2@`sh5tXCw7>tR}$ z?u>gvie9j+hP_nPMpqmRt5~KPteAq*g>Cc+5?g|02<3q-`I*?g3|XQAiRh2h?@+RZ zGEz1Gj8Q(A|6ju`*;xADi(jp?w}=i`@SCCqy!1m}Fo(!C{a z$Bvb^ov-r|IealnH?-jRF#kQ&+g)sJb%=?N4~mJ2sj1L?Q?R4Hun?1*o4fYlH(l|@ zjT`D{q_K@nv&d7SEUMtgbtxH{ZRY06gM)(@HMMjmQ-YC_^78$A6jUEICwDv|0tRg{ zqb8-KY%nC(C%JRYU{H)TR!UmB!0nm!!O?XJ!O7{>yMJA`i20;GXl|}EIy!py?p^z+ zC|vZ1@rHvYGyBV9Z|e7;hD4&Y!-8lHJ3FAeYP6bKc3T@BvJVQ{CM6}+ z^7e}?7JIq7+jU_=pd9!x0R~xES=|nEsIFb_K%4}Mn zh;mP?Bd4JIUUg(?Y3beCT0(gEj)8&Sf$e-gAETmDI;yR${ps5`IAmdI**ZLo@$vEb zw7l#{B1x^Stxdmuia_&_V)HqpFY`> z$*MRUPT{!so2jWOHO(u?<>h5#9FE}Xih6Kj3=UP@yxDqn&$+&-DH&&HXDw}QJeVqm zt+6ucGHRV%^Hb^ys9jc8nIh4_^2*BBttp7Rb#)z6^mQ8}9a~%5K9R_YMl%)Lu)!yD zJ4=|8m&eS^L=_ems#{q2ot#WgPA0m#iWT%oKtwG$aX7rJz8<5ml(n?JFtVFi;VCX5 z@pAR^>-y+Lj%TmiQK23=G*pMj<3)a73T~iqgFj^B3Jd}sBngjEA|ugIUteERaWS_0 zufV`;md-wg@EGIC>(b`ttynC!ki!v!$jxzz8#itQf$L=N4&CqR$;in;S6C^2mywiA z$^J}ZSjv8aiD=L_1{DoV$^n^lT=>pY^o62M!SQH9fC}Cm5V(VBu z9D&G4OM}azn7M~{=E(uKUrbKkHh!qN4&Lw<+`5$osmo=gULa_;QTSb}s}{lQYu|Tk zq*f_#dqaA9^U(NuvZ1i2hg%>Y6cqGoX2!AT>eY=|9hxdCD!GY#zvkvDOZ6c=xbh={0oeV9zH3Ie`ITBz36*0wx- zD%IcLUmx?iY&-^@k_@V^kjuSQKGE5kW+fULs+?^Nxi7nQt28LqdV!$5zh52(gF#6k z#d(yo7OHtT5OM@)r5vIb(amjdK){yZ08n=w46tHhadF4kg0{ONuFYwN#^J0_YDpnj%@PYd39*A{`9se8m;w+aZYZo zxPgH|!>+TeM;NKjrtDzdlaoyuTg*>hG?+f`a!d%|0X{>c<^8v=r^7Xm#m{x>6j%AEiEloi9d{6M$u?A z01RebohkLii30%vl14^G0I&cH8z}t3B`%wtvAVii!tvU>cY~{&8=w%(upq0ei-1r}6L@-FWMEk`J3Cud zU0ptEX=!=pGq87s!$Gl0@aZw0`OhjR#a_Gad)7)WBog7!q0NBQN2ydPWo2dRWRr@& zzrV4m>96odW@cu9ED{Ah%{9)o2)lG;!(F^u;x?OOP z3A^k0b7x0K36i@zKYrz;>YnI}ab`T;?Do&sxoHigefwCQolc%!UV8z2-%vqlo8nhI z<{I#&IZ@}%d7Uuhx?^qP2u{wH(tlGbS|GulM>jIhX<|ZkdL2&&w zG&p!=a`G>p0ZT}XjcpirDg~W8Ffg#+e45w!dvZlz&F;JwP=Nt$dw-8qyhiNLZ#Axb zq{gv?gd!jUFNTJkwRLn{Vq-1Y98TGS=gr&!kw`9sfCtqDK4{4s(nUYwEjFd6q^71ysL}e?8i7VK&`Z7^9+$@vg^!*Jyg774 z&o@I_1MoM(AUQ + + diff --git a/html/inherit_graph_32.md5 b/html/inherit_graph_32.md5 new file mode 100644 index 0000000..8850d7f --- /dev/null +++ b/html/inherit_graph_32.md5 @@ -0,0 +1 @@ +f18e67bb83dce1b17811a9b79849e4b5 \ No newline at end of file diff --git a/html/inherit_graph_32.png b/html/inherit_graph_32.png new file mode 100644 index 0000000000000000000000000000000000000000..47a64b5e1fbbf11df19e3a233de3b6cec34cb1be GIT binary patch literal 2151 zcmV-t2$=VYP)MrEa!a;WQCRGj*l&B}<+CoAaPVTOvqQpO56^WbD|nV_kLE8T+W`PgO-(2)EX2^z z5PW=mke;3nYinzxv?US=4jw#+moHyJsZ?Tod>kDe9mvhi#hp8M;Njtcn>TMR>Pcv5 zC@d{4(b(9C*x0|nPb7q(xVRWKH8r3p3gO}5h>wq_>xhkwMMg#jL?RIYK&#avHZ~R& z6&1L8^{PSLmGo|Y&%_5fc-$r0z<4w`LL(6Azy}d6F1QU0odkKze$5mW?}b z-~dTUNuk&G@82gBMG=igLkJ-xARvGg7Z=lhp-@N?5)$b3)YKH=a=GNeg9l`Ic$jcF z9HLYzX}?aVBj)Djq`SL&N&ThrXJ%&7>%P7|0)S|>TB1^^h?SKUnVg)Y{Sy-tgb-qs zwooWsaIJ(8A`*#6NlD3~p73})5*!>%{QUfgm6a9A%gdwvgM)*F#bS{cFJ92LnwlD7 zW@bioIvpW|5FU?5s;jGMe{XLu0YFAZMwZlFP45g*SXf9B6BGaU{S2-7_Gf8n2>{UP zbZ~ZdUN*L@tPCoZ3S(nqXm4*vZf-6F0)fGJe}8}awYj-DyuH1l(P-f8?2MV28Js(J zZb3XnQRwLCfQyTZQMJ3fyVI}j?Cj|45DJAzPELl8j}P|l-HV{0AjHJP001-^jZxa( z-rh#luzUAz$Ye5TwOZult73N z9x5*{FIZb!qo$??LZNWk*trH;Sy{o=)fF~2Hp|BAbh<@rTU%S$*w}!gC}d=0z{0{} zL5!!Tr_r@j)S^FW(B$Xmt6{b`AQ)@JsmkYIf#pk1CPgpzrR1WY}tZq*RH|I$!XPj-QC^c;o$+1NQBVPP~_$1 zVdu`BV6)jMD=R}qMFpIkoZ#>8k8Rtwp{J(@Y&IJJ(9zKWwOYL@T`rf4>({Tt(a{ls zfq@7L3PM_18tm-sjM83;BS(%vE|)_r7DFnP8jQ=z%0g>vE1o=g0uG0R($Z4gy?Yk| zfdG6y9~Bi9C@n3eABwWGvvK3b4S0Kd`Zam;<_(#dnOPLC)9FZab2HIuwdCv9ucWrNc0t_t zx<9JlSPUK1O*&MjWNxS!eq9U=)i3kgAH$!6$$tAYH7b?rXP3aRN|>FB!Q?PQ#b9!n zp<*yO%uq3y9A>B(Opd{)zoew3f3psTKZr#`MF@EY;6Fd17KYyt7K_#Uvuj{rU|?Wi dU|{$Y`9Dz;Z=u*czp?-T002ovPDHLkV1m(D70Lhr literal 0 HcmV?d00001 diff --git a/html/inherit_graph_33.map b/html/inherit_graph_33.map new file mode 100644 index 0000000..1852348 --- /dev/null +++ b/html/inherit_graph_33.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_33.md5 b/html/inherit_graph_33.md5 new file mode 100644 index 0000000..aedac57 --- /dev/null +++ b/html/inherit_graph_33.md5 @@ -0,0 +1 @@ +b21a407fceda05a0b24beec873bdc191 \ No newline at end of file diff --git a/html/inherit_graph_33.png b/html/inherit_graph_33.png new file mode 100644 index 0000000000000000000000000000000000000000..22754198c5b532b219e2b6d631076a17c0021c4c GIT binary patch literal 2039 zcmVZK4dxP!wW^v{o=-RyL5B2 znRau1UY&DYzw38>&$aKa^E>AN1OkCTAP@+DKGe?*B9VwkQPl3W5JOmhuvo1A>gwv( z3)`%I4x%V(H$_o@{XSWQ^~~JdTrGhAEo@t4nt7_Lt5;nRVSQ6wT@8gov8bK323iPz zIK(srvmvG-m<=(_e-M#KgocKORm;C_Oe2v<}x-m zhTFGqFMb~OiT+5hu+>^Dk|{c!2_t(YS`J?Av8495>gDZ z+WD75p->9hXE=1|5EKdpR4NsG zeSJ|}TntxNS0>-1N00FM@nejQjX@|B;_TV8u(q~dQsYwj6B84mR4O5t%faPxQBqO@ zZ*Ok^Kx=C&s;a6mJUooh&`=Z<6u{BZ(WJRWA`uc267crzTPPF?jE|3_tE&q#nG7{G zH3$j{!i^g@m|SjdZg6&XX4dAyg$pPvD+7zgf{%|6Qd3hA85zmMFQ@%yDl03YQmJtL z`gL$P9OFNx3H)+R)8F5Z=H_M;6&2|jW}bx$y^u|tHi6A%|dwY9iWo0pAmz!HImm@Vb6*e|D$jQlp zR4T>h&6{!L$Pq}TQiwz%qicHN#0f~HQk0aGV8@OfNK8z`>(~Fj$v38bA+xiykVquB zckdo#GMPmT16W|E>FetQ0Qmd+n>FtK{ri}kn?p!Qh{2d+$Br@EcwAf@wrtsghYug( zz<~oOFE7WNH*c8RPE=GB+}+*L*Vl)wTeq5|Au}@*g@uIx06w1&9*>8Skr50I4uZvE zAvZS{c6N4%i;KhLY7P+VNh%;n(VfWW{&W;ZcLaBwhl91{}*olb|F zH*YexH)Go8cjAeO2^>Cr7!*aJsi_I}_Vy;Ni7EWDX*O=$2msJ(wea!rF&bN2TMMO9 z37t-d&dyHAWHJN<1Q?7L2n5Wrjg1XLLPDU?XyD`HgPEBbkj=kt-3m4(pIQ0&>W2a%DHIC}Ib06?SBm^8PsKf`i#cXy+zstVoR-I$n| zz~JEEq9Wdq_IcA36&1nT+Z#%y5^Oem#afo)mrWBK91KTCM?8Q29DF|CXzZ?CyO5oo z4GxC`KR-V>IXM}P*J`zk&Yhi|;pF55ilT7-{CU{g+Umt@-@e^s?ZyhuD_5?dyu2K0 zwHmi>-GWRe!@GCyOrG1yN`GlhEp8_!Ca`<=Zk#%G3SzMs91aIho;=aJJ(-fPw6qj8 zH8se|$-%X2*DP9G|8h;UVZ#QLmX_kurAv7B?3rF)Lqh{zzI@4?&lkes;o-{~1_18d zxx*NzrKJV!?d^z-jYU8}0D^*o(AL(5sHiAJM@K^_6hfs^F?lO0Dv+0#x1ww6=;%Ow zeLbwLtq~R$2C-O-&dyF~wOW(rUJ55CC#HTgMt^@lMn^|cT3U*Pgail#f+as1E(e#( zMN?A~T3T9=mX?Ou*;%u57{Vei_X-LMP*zrk}vrN4jw zuGgnhsptR)RO1OkCTAP@+v!QTUD VVI0~*bUpw8002ovPDHLkV1n7N%i{n5 literal 0 HcmV?d00001 diff --git a/html/inherit_graph_34.map b/html/inherit_graph_34.map new file mode 100644 index 0000000..4c6e840 --- /dev/null +++ b/html/inherit_graph_34.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_34.md5 b/html/inherit_graph_34.md5 new file mode 100644 index 0000000..4dc15b1 --- /dev/null +++ b/html/inherit_graph_34.md5 @@ -0,0 +1 @@ +a953eba627528415b5ccd344e4f22406 \ No newline at end of file diff --git a/html/inherit_graph_34.png b/html/inherit_graph_34.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2836f5fd6d6f6efe457fccdd06a23c83584f18 GIT binary patch literal 2031 zcmVc z*)JYMQB(*;QGfk&vIv_AyC8JTE-ii(Og7ev@xR8&+ztyUYwS?i#M@P7s| z5y5JRi3nChOtcA*NF-=zXjt|9^z?Mp)z#Thks%w#L~H$^Yn^{BQK?iI92{Kr{Fas$ zeEX#xO(*}6bc1%KQ}iQB9RCpkqFVz(a6io!|?Dh zb6+BnKp+sJo6+CjZ!}gem#^u{VM>cNnEjn-B_t*$!q3kS_4V~&vHs`F zjEoFSO-(V^91aH}kq7`F6bj+#>4~PMCPYL;AU!=Dk&%&zjEn^E_sS6!6$Q0gjn>vy z`1<-HFE0=7?(R&!+S*#YeEAZSlamMy4aK!<*WlpbU{a&0{4p^x&}cMJsZ?OI*|>T0 zCid>#3jk0k6euq*$I#Fa1Ofr1QYoCBoh_;@kw_379gX+z-$SidV|scTTCEmEMMZf0 z_%V1q9?HtfR@CE}nHdxm6qxJ~Pg$ozV>NJ)A(xppqa&p4u%a<`UG=!L#7y!WF;2^@o z!{O`eiz`>IVEgv%NJ~p&<}O!TrBWd=F%gcAj>yc+giI!bhldAZV`Cwc$smzPENQI) zQmNEzFVfS~QBqQZ*w|P^MMXg-lR+w#n#>ay7iYDW#aO)(_4M=r0Q~*^S2VA>x*B@D z9zj7tX2+a8dloX83;-Y&i?MItKGf9I;MA#8C@d^Qb8|DZ&j||)!|vU?(bLldA0Ho! zG^C`YAU8J`0Kn(-!QpT)GBSdJfdQ~sEM#S6Ve8hd5R1i_nVA6qjE|37R68Ld0eN|O zOs$)G1rUm@NiUCRzfb9O+~9UT!A6oihB z4tRTeL#NXrD=W)jJVjB^YPA-dh|A?NpLgxr#XJX}&qrEX8Uz9Xjvqgc6DLj}E-nrL z(9zLhQSGI^91E~mEa>%mqqttLH(J%r^@79UfW>0r(4j-j{bR?DVQy{?U0q!W4h~*c zhqYL3qJswy!r9pwjg5`q^Z84TJ$m#gGBPr-W5*8o`S}@rOBORRF=2G=>goy?7Z*?z zg&Q|+z{$zUV9bF72Q1c3QAYp7z)(_Bg2KW=w6(S2;lqb0Dk{Q<4<9V9ZEtVbT2r++ z9FEZj`uFeO7#$sjmzS48+*~hQU0pFZH-{fTelS~y@$qp0fUB$Pil2KmSiL9OvSkbM z^Yd}%&K;v;V?#p&-n@CkTrX^_g+k%71_FRbj~+42lgs5$DwT+ch(JI<0C+qe-o1N= zu&^+QL?VQShN88#mC0LLT8ixK>{UHeOG^vt>+9j*;DF%ZV5Fv|qP@Kx6B82_)i#BT ziwm>=TRxO-&iZJ32aO zjYeZOzf!5B2L=Y1>-qV4`t|GA^v|C^nb_B_UulIxK@SfPuc-Fo+za&g_tQ;HO|)9A zHi(aoj?zk{lGbXqv`(ipnzxW|sb0*^&e9)0exyHr`ec-2@v|?bWhu(b%jx9g + + diff --git a/html/inherit_graph_35.md5 b/html/inherit_graph_35.md5 new file mode 100644 index 0000000..d01de8d --- /dev/null +++ b/html/inherit_graph_35.md5 @@ -0,0 +1 @@ +147289e70bf5da44ec351fbe9ba6fcd8 \ No newline at end of file diff --git a/html/inherit_graph_35.png b/html/inherit_graph_35.png new file mode 100644 index 0000000000000000000000000000000000000000..05d9a98a34a9a7a2029a7708fc130054f510ff1a GIT binary patch literal 2187 zcmV;62z2*}P)LIcZ8QD<~UAx8_7(%jNU9gLEA&WG?lO^!O|wDSHw z&9mM2^*ryz^WNhKFfcGMFfcGMFf0c3Z3mCXv!p1>`&Woz_;V;IDERNUeVX5PP!#1& zQPh8ajwFUZn8nRB%gviNf2}K9P5?ksQWC7Kt&y0RIA?BVW+wFY^^umA_OoR!3$@%#FJHcdi;D~H-o1f*YPp%XTrTYF>`+rv0}YM;`!g;s z4wI9UblcL>5`KPu000jU4_H`OprN4w0RaJsjg3WMU?2hm0|9)wN%rj71CdAsi9`Zh zTU%sgWWdp{s_rFjm#L=Ti!D6w%@{R>{+Cwq`=S54-pX& zsIIO?czF1{I+ewbjEsbijt-6;JBE>w5d;SZ0|17Hhp}zjHrU$QB0fGIy1KfEiHV`t zE|yy;6oSj;LR(uKiHV622m~-UH^;tx`ydbqz~k|ttE-F9&`{*(=PT$eEG$G+R1_$R zLTG3x1OfpvGc)1h;)3AdU^F!~Dcv83!@-RkH!v_TK=+lGmt%N%m^RW<&urO5MMeE9 zIy#!D%9AHg2msR8*SFxj9XocAgoFgTT~<~`D2gIdsgw{xh^MC~DJUqQ$JuN)iHwY- z+aEuEBxYu2q`bVGjE|2KEiEk~5{c+>nM_8swY5oaZ?Dq)%Hn5aWYF#Y{(b_0jE;^H zu~^z_K|^fWy#m&*wuM5WwpHd|q@gb?EH?oLWdN)-Cq+uMnTh6Z`{>J=e`kox+1 zqN%A#1_uX~?m-|B5H6QH@1C}7*+R~rKTo$eZrn&NU%sreZdGV)Z6(ps(L|Ydmi?Mr zxpF0dFITFKjm?5{D=I1=7K<@CIf<^WF68Fs!ok5|-uWC3hyJXstqoUKS4gE&*x1-$ zW@ZLSNl6OxDT+dOcQ^j|=O2}{J32bjpN))+=zXx+Y{bOGz|GAKn>TNUudgo-9XbR6 zkV>U0<#u&-T{OR|t1CP_JWy0rgzW5WjHy53qohs+n)Kom$`Eo@^N8|MA(>Q+oI4UYCP*qh00FcY&@b>n` zkt0XI=kuYbr-!Pls(D{?01y%qg82A&G&VM(va%9^fq^hFF#!Ozo!LSxyJlLkVg<6Y zvXGsfjfW2(DvZ_E)}p??o^H<;;2s_xiy8?4N=iy-Lp3%wqP4XZ0RaJUaBzT=lM`B6 zTCjENR`~h(!N4{dF2sHv%emX;RW-QB_G^U>AS1({5yQf_4!8XD5| z;ny5Kd>C@M9ARN$FgG`czrR0#FSY3V_wSLFm4%?7AaFPwh(w|Vb?fTtA|xaPg@uK< zbLS2sA|mLq@728&)bgi+)YMd*IdcYKVPUYaumFd{!J0K|aP{g{SXo(pcU(tDM>sh- z!QI^*{{H^BaNz>hty>2ci-n4c3Oso509IC3;BYuFH8n+FUmsX37672TyBiXTwi}3Jp)YjJ0g*Wi! z;qThD3-O4q%9{hGA4wvx%o zNrir?R7%8R@x1X{TU*J{&=B4J{P{DftE*Eey8HY4Npo{E866#6QtoeK&oVGDKpGkv z6pCO%2pJg}A$4_iWMX1s&YG^SF4EZ8NMte@85|r`So`gsW_kShG3o5=RH}I)-Kwxq z0j^dvsgqeVG5lUEWTxNdw>gGCAGQ59r*6bz@voM^utb=fi9u~JW@1nqjF}kJ24f}$ zwZWK)L2b + + diff --git a/html/inherit_graph_36.md5 b/html/inherit_graph_36.md5 new file mode 100644 index 0000000..b3b4abe --- /dev/null +++ b/html/inherit_graph_36.md5 @@ -0,0 +1 @@ +69ac0e2a5bf9e21ab1ccbc02cadd57ef \ No newline at end of file diff --git a/html/inherit_graph_36.png b/html/inherit_graph_36.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ffcb55a6b4d04954df5d39d130bda814ba4782 GIT binary patch literal 1854 zcmV-E2f_G>P)9lnggWMjG(X|rw?jcgPsl3@1( zEedlh8G_W(LZcV_k_z?351FAwqj<>B4+>F2RI8`l7TYRPvmqK*mTOuFsd?TX!s~Xr z&6iCb57+P0&ht2~S$gqy(d*qo}Q|#ofDi;cz&x zX3ZLG-MTdxQhc)5`isq<&tE7LlqM)FEJSK*Djqy|0Gj@Hhnapurb$Xlf=ZO)BT3TAr+S-bd zkr61BN|ctCg3IN4)i}F8Ap{K#4e03T07X&Qw{IT`3k!YbYqeVB<>kRDJk>%bGcl2`t&L4>gt$Wm&=8Mf&w%(H9;T{1l{jq2>47eFfag<$%NCVPkS`L zG||z~UayOfj|Ydtfy?Cr0K9tj3ZFiGV&WEy1&0qG28Y9eR;z{6>4Z|L#Q69)0N~=q zi#T=a6jUk|jvhUV_V#uhI&{dV&e`?#dOd1tYOsI*e&pun;=+XsC@U-TnQyUJP*hZe z$jC?(7Z+n_Xb5?Ec|Pwq)1OkQ#I2!Y|J9dmL zl*f-B69A;Iug`DZ-o1NCX=y1lzJ2>Pp(u)Ub#)O!2+7LIA`J}Ab2; z-VWBTT?+tkyWLDz`=YtI88({@qobpE_wF4oUAhFZSnM-jp-?cd!^6X|Wy=GNuiiHX7F z9;vT4t`gx*8IRB%p7VKYtWO zp}4phH8nM8ZEb~4rwgjzKnTjiqO!6woIiga8jS{tiHT4s6o`w9!<8#nker;n`{)$9z{;7qQuF%vhmNkjBPFkDT%Gaq{NP8}jz;TQV^*;a88@Y$l&Se`dzN zfBzUSY5+riMISXdZjGMU%d=FOY^UhC`O zOjJ~q&x0BOBqt|(U2SF_I0+#b92`V^e7r{vm&-+3TH1p2WM*c1jA@!?o(TZ+`vd-L zk3&O4ICA8O&zz%p>4=Dk2!gVuaqiqX#Kpz={7D=vze^!xn_%|xyHt2Q zp5NtlrP#T1r{8$6{4Rz6`|W^be%K~pVVi)3Z2}hfIT#*4etac$u&g3;nt%}U9Ke58 sK?}t`2YX_ literal 0 HcmV?d00001 diff --git a/html/inherit_graph_37.map b/html/inherit_graph_37.map new file mode 100644 index 0000000..0150664 --- /dev/null +++ b/html/inherit_graph_37.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_37.md5 b/html/inherit_graph_37.md5 new file mode 100644 index 0000000..631d2fc --- /dev/null +++ b/html/inherit_graph_37.md5 @@ -0,0 +1 @@ +f296e65aa64eb00a49cbbd1401298168 \ No newline at end of file diff --git a/html/inherit_graph_37.png b/html/inherit_graph_37.png new file mode 100644 index 0000000000000000000000000000000000000000..755e9e7865345129e4f86fe15cb8804befc35467 GIT binary patch literal 2249 zcmXw52|Uy9AD@!#?oJ$MYU1%(6X7yP}bwUaLt1w|b*c9D_RAA(8M58sFVFPOM&Btcq@E!baH&$}wx}}b_C5S* zW)XN&5EXb`T%m1gs(ZGt6bdeSWv_>Ia~8C;6*E4YlT?15;WlSA>*j&=f^KqT%} zQAx?)?|!?aM6!jRxqWu@?XkthMR{?NOPoe@P>?3cG--=pJ6+21X zQ=-}f$uT>3?XpFqGeQ&M;vV(SLSUkzj~z*-{s95fd-gck*@^d8*q zropriBorxE-Nvv|2@a>{C>^_dBx+y(6GshG(~<$Q`_}P=1;>*oMcv3dpTbkwq0=B% zh<9T&;oG-hkl$3o%d3m$yw9E`fX(KIsa952iK|!EvEm~1<^mlLHCo{=qf0QeH&++A zMG<-X?4qI6%I$+VS(=}wYdRKkF6{(uPKZ4(HSP8l4VOuO1P6HxC5woFA%#gX6Uy+&sGZ86+z9)(1IU6Tp-X8GN1_R_FOInAdhZE-SNo z>Y}~K>r>BM*owchFiQCN(fN_{vvy9?l?%;%K{7o(J#E2tqN>+;W6jORQPbHk*r9Dq zrac0IfTg#pd>(C#A=BS}d4Ww2ZI1tSlJZOa`!Ll}Ui><$88?ke+8xd76@rilv^Vn) z*?4*?HZ(N2xVYRZEM(M&4Lgwsn4M54w3{?s7s7afrN3jb7z{?{{rie;&(BQkKw_i; zr8_=Y?wtSW#Np`#;S+J^@WR3u(!*90Dn`Q{QF64HQM zKT3A1isZSM_PryS96z4Ym@vw}Drgea!hozT0O|Aq6Xt9PH!ck4DY(bZ|II5F;a_N;3Hwg;FqQ^nCz~fWR+YC{Ns7ke}aW zn)2d>K9|eo^Z6>rk3SIFD&j{S#@O3;T%sNm2$>bPcx91F{xd`kXLS;HVNRSF|5$D- zNh7;gM=np>vnk5r>1k;j!1Xh?D;I=ca&wbqv)R`&GfUmb3dWaJRu{$s1-}=0(MN$P z1k`x+6y3f1?tT9Lq7Po)-gX`y3V@^jo!JV)P^i&gEc!O$acL?0<#}iztE9tE|D7q( zI-N>2N?7?W^sv6Z0C1=qSLaEru0|3Fgr%XC`Qg5xLrZ#xv2DVlVq!;d0%I%|YgWuR z3>&)U@FZ_0b#T1!jT*)0?R{OZ`W*@i7~p^~Ny!SZJ+K+E@bHD^VgQc*<#DsPHQ>X? z(nTcNfZ}Uw5A~2xH^HY{TU&qr;1tOrea0szg%f{sMMe3`%a-JU_j7uBdSzv0w?MiN&C_|GtCeG$IIYRwzZf_>I|H8n{_`hd zLl6f(-?F9H-F+zL4mZi^p;Qak}MLc5ZxCb;Q4*I1<1R|pRkNr7&Tc0_5mfa zLuFYdCLt@Hd0hx#ue!sjsi|CEUn%!13w+^5K9(_;zoA1 zIJSoE-^>hv-&97)I+h%l0ws({VRd)I0n)G57r)x%=H{yE$lkE@j*YF?)Y8hGNBYu0 zDHA{C>N?=>%j_HR`)!Nn?|&v|?iKlG=|bPj^9<{>4d3#PQOS*GfGbfTHNZgLV3n5_ zwg0i8Ud{OOc#9(wj_L-bbCz8*W8{n7)B@w6C;GHT6~27>mBsKQyqWpG zwRjuNKwj@`W9{KJryxs3f*CA#o1jS|{#4L57j4%FuhobDYy5;I<)7PaT`TtRd%(X5 N1cP?4qFDH){R5+nV`l&W literal 0 HcmV?d00001 diff --git a/html/inherit_graph_38.map b/html/inherit_graph_38.map new file mode 100644 index 0000000..4c1b4b1 --- /dev/null +++ b/html/inherit_graph_38.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_38.md5 b/html/inherit_graph_38.md5 new file mode 100644 index 0000000..ec74e61 --- /dev/null +++ b/html/inherit_graph_38.md5 @@ -0,0 +1 @@ +7a9aa45fd6868396d066061cfb3ff273 \ No newline at end of file diff --git a/html/inherit_graph_38.png b/html/inherit_graph_38.png new file mode 100644 index 0000000000000000000000000000000000000000..1280b8de30d4210969d7515ba411b4b3a45400e2 GIT binary patch literal 2052 zcmV+f2>bVmP)dl38noI1DF z+Pa(<2>X1_IiJ1H@xAjsX9Fk{3WY+UP$<7U%*upBBH=R(6Xysqls^v+hoh~nt?gW% z+pw||!!U6S!~A1ES(HDSrKP0?0RLN_TV*-}wY9ZBT@dBZrna^g3WZ`-p5p*5l)oHm zI*Q$)rlZ&$YPuglB9Wk}smakYtYTtf0wR$JdcEFZ8h#nmNu^RWHa0q1hE>Sra*U6U zJ6eWS%+JrGrKJT63kwd@VDk2AEqc8kb#--UZ*RxU%nX8pf{>Y+iP+d!06=MJDZ0A4 z003@oZitMGL~(I3wrtq~;M=a@>+5SPIlnxmrKJc62tYwWfl*#6l|m>K;>3v)juB=D zY+|~hp&=wDCc?+Z2RS)8;Pd$y9v((XNeN0yN^tn_VW`z=czJoDpr8Pglar{bs=}j3 zkDykov1!vL?Ao=<7E*p2)M_>6=jT`D-@JJPZ*Ol0D6$_mF`ZZ}MsRR2UcP(@4(Goo zw!vTq_DonhJ$N0hLOHpr9aJ zxNrepUS4dy$B!T5$&)A0>-C6_k4Ir)A)K6?*3>AGNO0i50rd9vqNk?^0RaK1sHniu z&=79kyosr)DI7U+1Q{6_?3nZC&!e-m6C4f)fq{V#i^bTxcdyBHsIIPtN~OY$8#ln? z@vPFf9_!UHr*Uy{5!KbzXl-o;pU+2TW~Np3B@zkJ($dh=(*uPNzau zhtG6ctrl%Y-~hUR+dSfa=9F*PMw0Mrzi6B^U>4OgT%x{ zl$DhsJv|+%sj0}x$w7O2J3A&LBLfu`6}WiuB6jZFi9?4Dp|i7dRqe&aMM$MmJb3T` zm6es?@pxA2GljW2<}~K#=cBH!4p~`Qh>nh4rNLZ%xm*shSPW-pXA~6`VaJXgR?opK zxw*OjKY8*bv6PmU76O2bjEta$;8A2adL7Z3Wb7g*XeY`+1Z&44-c>T{sMu3$Ye4$e*XM9 z0YJ1`Et^YEPbcN&bnwm6-a#3Fsk$;rge&yOS| zBpCg_WJsI0)Tw@@WG<`0)fEj|7Hy}H8mtRH}}y> zkNxoD)z#G%0HD+95EvM^Zr_H61}K$EOioUsudff4m6Zq$4K>+cC={}Q#6%_@I zMuWh>KrAdQ;PmO!M*SIvL4SWgwr$(CX1$P*5cc)v&70xs>Iy!eZYVrPxcsHmtl*YkV%VbeuMM#A0Q9j{)!f1o8p#o^eoW5~^SBPl5f zp`oD&4-ZFIR~Hfz5+D+Z5FZ~8l}g3dt*WX*NlD3f&r7S-;`8UvkjZ37OG|@LC|vW$ zYhPbqw6wIKqoV`a+1XfJT(n4^C77#YPGeYD82tVHaqZeQ0Kn4H60TmoYH|Iag-yO3 zK6~~o%FD}niN{{8!L<;oRAL_~ng z<)WdX0neU2gTKE&ghC;Fe0(r6GQvLM`uqE#QmMZCy+cDoaq!?lgoK1(&z?O92?=43 z5-aiY@RTRp0u{Mt{SsaV_#n%>FDSn zI-QP;j*c1~x>wfx^5qL@Zf+*y + + diff --git a/html/inherit_graph_39.md5 b/html/inherit_graph_39.md5 new file mode 100644 index 0000000..f3dbfab --- /dev/null +++ b/html/inherit_graph_39.md5 @@ -0,0 +1 @@ +697328374644a9c6525c1d51dc143e93 \ No newline at end of file diff --git a/html/inherit_graph_39.png b/html/inherit_graph_39.png new file mode 100644 index 0000000000000000000000000000000000000000..303468aa932b7bcb9a5107a494004e98e5755849 GIT binary patch literal 2295 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 R3d8^a002ovPDHLkV1ii>K!^YU literal 0 HcmV?d00001 diff --git a/html/inherit_graph_4.map b/html/inherit_graph_4.map new file mode 100644 index 0000000..e998c23 --- /dev/null +++ b/html/inherit_graph_4.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_4.md5 b/html/inherit_graph_4.md5 new file mode 100644 index 0000000..2838e0b --- /dev/null +++ b/html/inherit_graph_4.md5 @@ -0,0 +1 @@ +56b6100a586f07f8f4b4aeb9297e21c1 \ No newline at end of file diff --git a/html/inherit_graph_4.png b/html/inherit_graph_4.png new file mode 100644 index 0000000000000000000000000000000000000000..0073b57944e17224cca400f4de1bc892e9a34ff5 GIT binary patch literal 1679 zcmV;A25|X_P)Heg6Czy}iAdo}P}$d?EkKh*mHdgxzk(C-2y zTD1x~oerBeZ2|xsK71Gh0|SCFYPA|?&YX!=3O^l_$%L}9GHlznZJ|?%SWF6HbaWJ3 zwroL4N(%Pw-3ysahOx0RSS%J;EEbfNm0@UT2+7IGsHv&p$0a2t#bWnAEtkuMf`WpD zP9rKYDG0q@kJYPJqpPb6BGF%0p_-Z+eE9Hz-H~RbgArgs@k&ywtUXRV2Hw(sW-MSUS!^0RH97KA0I&3x@Mn^}{+}wsX6wl+AO zPT1{s)Ya9&C?D+^(u05a?sq|{Es;p3&(Eja z++5OVG<5UkO=@XrA&Epnj~+eZ$JlH(QYaK;x7+E?ojat}YN@=uJY>%Q6o2mAIZ`MT z6bJ<9*|TSqkdQ!6o;)EUqL(jUl2WOpBS(%hsN=r+lqM{=H_3+_Cei1?y%Xc=Ljr4jwzpYZK$ZECn+xPF^Cjc})KF+u8+O>;n zYio&!$nW=)SS;pG3=vTv5TM127t`3-*qr@E8edvkN;`J!pv=rnYHDf{%#oLuM^~;~ ziE2)jN=3(x9pn4oym`Z)aG%ddB9VxOhllz8>({Txv>@hv$%v1S2LJ>D0c2!kgpJM5 z&llW7WM^md@7J$iFNhr(8NtPi7cnw2g2~BA__#>Tj=DI9f zwhX`@>+AFRAdyIro14q`f4^yum3bG$x^?TYbm>w!91f^ds<5%4?jZnR(W1XnnVg(N zVPPS5@7@iQ$%KT21l+xQ7ybSHf-xM&h25S>DwTrcI2=8C6cUL<&^L2|qm8exugA)j zE8%v#@$~6a!3mn3Po#5(Iu5B+im9n7OifMkr_&kroa5u;n3$M=)oMjaNeR?yHC!&&yz=5!I|2DMs^<;$0&v9S?yxjgFmva+(U zefxGOl}Z#86hNs|@|UK6D=sb$H*VZOXJ;qmayis$HBwSi;PrYD7Z(Qr@OV6MyWJ7R zd%a%l*|P_ByB!LJ0{i#x$A%3XP*qjM@3XS95;mI+8jS|~_U(%(hj7GVF|J*^hK7a) ztX;bn3WWk+zI>V2y397`Z + + diff --git a/html/inherit_graph_40.md5 b/html/inherit_graph_40.md5 new file mode 100644 index 0000000..fc23444 --- /dev/null +++ b/html/inherit_graph_40.md5 @@ -0,0 +1 @@ +be92dd9e2db093d199a3022570b475ef \ No newline at end of file diff --git a/html/inherit_graph_40.png b/html/inherit_graph_40.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c2ac9e94e4353461b191a790050015d76be74c GIT binary patch literal 1732 zcmV;#20QtQP)zlW!l#Kl6~QrWR?TW*T@1mj`rInxPR^V9*Q0B+E$V z$}x&E4~39XK_c`n!UIJF(O*I%5F?X7&1z~m-{`QWZqtSsbmIgO2tqU9vY3V;3jH8C+U+`D&=-Me?A)9Hwah@haL zfcpA+0D5|Q@bmMdtgMW@ygXW4TS-bvVr*;-fcW_M1vOl3{r>)bVq#)wYHH%Zfdi=3 zYCeDdOk7+X4!0+TU$lT2}D}q$BrE%JUpDok00aa z_WyfGr_*7vSnSv9*RLlvH5CArN<~mm5N&O3q@|^y)oMvkPbWP+9r(54_U+q8S63GX zgMqNHFwUPpkDs5PJzjl%Jr5o{V03hpPQ7-+AX4Xswou3ft*D=Xv1jT>mST97rt_V#wZe*Mb!?c1I7^7He_&d%oK$&)N!zT9PAvtibI zxR;j~rKP1@x^#(0j~+SnH8nNS($ZqTwjJ73D%F%`1KhfG%U<;M_I5ftI!H@PBQi3Q zsHiCPdOayADWs;RlAN53!Cke>bLY5x`7%$RKDEa)nM`Oj z8nUvoh>nhS(#y!mpt-r3($dl?Yco?sIi(jC7UJRIL3VaFa=DzKpdbbZ2T`e1T)%#O z#&I`o+C)@T6afJN^!D~rUS5t;sRVv)4>>tGR8>_G7#N7jWa7w?Be=V}17I{785|t^ z<9K50mz0zs2m<@}@5kTYpOq_DVl)~#apDB!<>eFVd3t)<-^I)ud3kx68jVJn30A9B z=;`SZUcP)OeERgsq0eA22>t#2F6VZ2bqVj^zqen<#>NVF?%WZ+eEA}Dc6JKG!^0EK zd-v|0(9zK$SS%KY_P)M8p}V{LkK>80Z)0q1Oz7Ncq=*`Gx-445RVvkj#uHnA zv9M^q9+j9MB*T{&lHp4X$?zqH%R`&1-!)78-8dO82tqr*{;?qOm-9a_B_t#yBqSvM a1^gG?h7>rH0-MqR0000 + + diff --git a/html/inherit_graph_41.md5 b/html/inherit_graph_41.md5 new file mode 100644 index 0000000..e0c25a9 --- /dev/null +++ b/html/inherit_graph_41.md5 @@ -0,0 +1 @@ +2dac71cf5be4e2b021e853ce24f96275 \ No newline at end of file diff --git a/html/inherit_graph_41.png b/html/inherit_graph_41.png new file mode 100644 index 0000000000000000000000000000000000000000..5341bf7a7c1ce5abaa01c053b32fe00d0aa5bf04 GIT binary patch literal 1872 zcmV-W2e0^vP)&!OE;KU#ud~B=C(^p=P*v@!~I6Ls__JG#ZzA&cCdK@*js9isDzO zp(uWZ8j9jq0>)6q#l>iDZvNde+!E;efWXk`_Lk=@LqkJoY;45i$B!{KHio#kIOON& zBQ-S@0C4o^QFL^4005RQT?&arf#1PH2R8PR;b?IUL+L{|*s^5{N=izw zX3ZLum6f5XsR;nk-QA6dhzMx4TBy}(JbLs9X=!Qr`t>USASo#+pbh1%KC{`3fq?<1 zTuMp`Mn*=UR4S2{mIjSRgEME&1e8W!@yiNTSXhYo_;~2`dT==Z_h?B;35JJ<**GdH z3hC+T005axhRDcB7>!0K6bcj<7b7z>6PcNr0H!}}Sy@>yo6WFTEQpJXLq$aeA|fK# zeoakHxO?|5hK7b9m&;LFT8fa65SJR~>qiJdeSJL)1_Ky|K}JRf3JVL_`L6V3XJ@0U zs|zNR2?ButCr+He>eZ`p>eMONY&KL?RpIjG%MgpjIDh^;OePa}JRaL~baWJrjg6?R ztPB{9zT)!=_4@T|7>!08J9f;;Of!Ushr67&YSk(P1qESna1a3S?AbHCd-sm5n@lDY z6civRCE_@_qx?NU%%qwVw^pD z7CAXN$jZusR;xvMc{w}Zl|H3XiLkIR95`?QA3l6Qc6K%ZVArl)5DJCJ$;p9MtA$FX z0stp70YHC$KUS_>8BiMij#{n$qo}Be{4A}ltpot+>+AD4ZtK>qq_nh@jjvt1Mi_=6 zR;!f|LP%hhgoK0;v)Rnn9S#Qx4GkrB zyWQpA_tfwG`}c&y;gBa!p0IU;!9aq8gNei8aI3GPqJoY4`}+w1^6}$GLI@$r$;m{g z)46>fMx&7|Uc8v-_4gb#-BQ zco;oBJ*cXxLPA1<+wmJVY+&DqhK6GO`t`6{t%!+RTp zFDfbu91aI5DJg7y)22+ zR|kbc5s(`HDLxxYB9S0GJRAmt0aB^dlev!GpMS z=MEAR6LId`IppT%V%f4~sI9F1|D~*9U|~f86rs;O(LOMJ{ni>?Fg( z!%lgt)k?a$y1eQ)K0Z#KKYvbMym&z-CMG=U>+I|#0|NtWJT)~%T3TAj*w`4Gd-LWE zF&d4;Y&Mh0$w|`E(lY1O+S(d08ol9{9m<`W1qVYSk+`fSCMJ5Eo0OE~GSB65-5xjr zAUZl4(b3U!^6n1%p8AD^gs`i@eEMWEnN!T+aMK180_J~t zl>Y{PU7`F*Lqmhhl_ya8{R$R>#`y?XL(N{U1Fhe$U?FIn54z=1{0cP`#jj99QTz%u z6veN&J(Roq-4%u6i8+QMgtTG$7oil2NB;H-g+ifFC=?3CNB#m(o=CtMuXZ>90000< KMNUMnLSTYxD}OWq literal 0 HcmV?d00001 diff --git a/html/inherit_graph_42.map b/html/inherit_graph_42.map new file mode 100644 index 0000000..6015872 --- /dev/null +++ b/html/inherit_graph_42.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_42.md5 b/html/inherit_graph_42.md5 new file mode 100644 index 0000000..13d37c3 --- /dev/null +++ b/html/inherit_graph_42.md5 @@ -0,0 +1 @@ +f24935155f9b08b0cb495138e43dc352 \ No newline at end of file diff --git a/html/inherit_graph_42.png b/html/inherit_graph_42.png new file mode 100644 index 0000000000000000000000000000000000000000..361e9d26643658cba9ae9c4bb68355113ee69d83 GIT binary patch literal 1810 zcmV+t2krQYP)=iMJAJNo)0k+b4Mz^B0w^E z5g?ho2v{&Cr>Cb=RaG_LGA6JPHO&T-r|aKkXlRJ5SFiHq$rHYO`GSXs2Z@P^Y}~jJ zfDWUXO!=0~r|^7>!0sN=mqS^Co(|9$Q;mf`fxCA;qFB zL`}27A|@v%C*$eqNp*EKa{134V9d}lTwGj;ii!dtG&B^IN=0pLEio}Mq^GA77Z*od zTpaNKSG05IPPAGrI-L#=4-fM5^Ko!+5bNE(eVaRX?l3eoM0j{O$BrGt+S+g(%~%jLMaxsjZlOhiP4m@`>ZLqh|lrKR-u_Y)i(Om1#2 zc6N4V=}AaPATKYEkdP1n1_lO5NJyZvvJ$0IX;#0pWzKtYPfriEwY8i)d2)imV~qb1 z#PEHO{ zQBfQ^bcm{|Dh?btU{Ysub2G`w$=KM~aQygj{QUgbzkff4g@v3tb&7z10Cw%#MScCx z8^Q6K-o1Or)~#Fd@bKX1(W5M1zMQnQG%@y9dg|-z85|rG$KSqv<8(P8pOo%{#Y z+1W{HX(^qZoeU2T)7RH$@}LzM7)V-L8o|NAY}vAfh=>UG?AZfAdwct=^qAZ4T$!`U z{{H^h+1YXb{(S-i180ogv}qF=85t;*N<2M1vA4IMG2UP>Oc}3Sxe|MOdt@>hd3kv( zUAlBajGv#M$$C~+KieH19%l3A%^W;wObp)M-uU|Z(%9HYWMm{!QBj14hojT!#JVLVC1hu3 zo2=c_)5GB4AO!^l#K*^@R;#DI+#jQ*rG@J1YOJlT2?+@yH8qvCwl)j~gIRjq-Q9Wo z__0{8yu94(e&>osE<HCnY6i?~x-%gxN4MG9u{pdZD4ALHO|D!-RJ_olbc1;)TgvtyU|%efw4% z2L=WT*RNj}K7INmG&eU3@87?lHt+T8*FsZMlVCI&C(O6Ew+pSUt>U<;sY&ST>zk6_ z*48G})zt|GgF)!+?G?0Itw~LSAP8^Xyb&528iav?f#1?22!dcR7=*^gMqyxJK=}Ig ztMK5#17T!jqkf{?on-2nd)l*VM&>QmGXGx10`F zSJ!D*i^&JN(9qCn^L>1L#AkbZdz_q{X4IrosZgm@zpZDi{)P=3#PQgj!FYbv?`&8w zch?es4vT)tmZY_{b-pG1RsLkZ(wDplkW5|#NG2}=B$F2blF5qzlc(#{)YQMJL*frI z#biMc>VSXdL5qY1kjv#g^Q}QbLPA19LSlOU15$?CK|H52*Z=?k07*qoM6N<$f+Gih Ap8x;= literal 0 HcmV?d00001 diff --git a/html/inherit_graph_43.map b/html/inherit_graph_43.map new file mode 100644 index 0000000..1e17a9b --- /dev/null +++ b/html/inherit_graph_43.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_43.md5 b/html/inherit_graph_43.md5 new file mode 100644 index 0000000..b5432e5 --- /dev/null +++ b/html/inherit_graph_43.md5 @@ -0,0 +1 @@ +662c85a3cef891e3dfb11a4007bf70bb \ No newline at end of file diff --git a/html/inherit_graph_43.png b/html/inherit_graph_43.png new file mode 100644 index 0000000000000000000000000000000000000000..262549618d1eae630bf38222894216b4ff11ffc2 GIT binary patch literal 2023 zcmVbk!v`rDwT!T#{?FI9XvPU$f zY|a!b%zUFoiwYB=|H6Esp!Y{Y!IC1AN^6!cr3UFVrs!iPnVU-zw7Q-@dK{hhVl_*j zU+43e=en=^I$y8z_1yP4n*a+73kwSi3(L>L`92_*%U5wY9PxaJVfnKVk-DOy;y>TU z7JZ+@;c&zp4(H#0P8Q2N@-G0D-v&$!F+*u->2FuVGJm9{rJ0S}{b3y}3mn!EEDTsf zurOc^@q=V!WT3XTcD`l&b{32w7J9>jg5^Ei^Z6noCE*_ z2M7OEhUo3>g-9eqU0oe^?%WBvTn?R1hoGP!)YQ}%^Ex{_q0wk?_Uu{4{POa0Xfzr$ zHa7lVp{c2GS8$CS&8{<3vOh9UV=F4jnSahlYj-0NuNHkBErU z)6?np?c2ujef#!Nb#*l;Oh!zn(@{i31oidx5fM>-em+U1Qi_O(pgnu`(4$9>82MpgVN_mT{=@ZV(i=4hN7gT1VckZ#@O}i*D*3O z0$*QW06;=Q0#qs$jvhSATUmpN~&*%TtyvoW-eEISPK|w(lb9U|81(iw# z0NA{FGkkr0QB_ri=;&yiK7ATbpFTx!a4-NsDwSfziWTVV>%*EgYZ!I>{QMvmi*f1F zB@`4C001styoi*P6l0E1C^Y^Y85s$K!GQAea)gJ6o9LRYo=&H;s&8;`&|=ScJRZEf zyo`OFAtNILk&%&5sZ=N_DM3a?hQ+?wg3X3lx^yW3K(E)s$H&KN?#-Jw(caz;gTa8V zt}dK8bB3{j`krt90v0b`jG&+(ba!{d$HxcL)6+P7_%I`%!{I=q(U=$l08&y?P*_-q zf`S6Pdi4q~UcA7qTepnkJv}`*fBrmrdU`N1F@d*l-&)<%SgY6F-ECFh%tl(T*TdV} z+oZN$ug9`w%NVhMfB*;t0u&b)qq(^mRaI4}udlbL?^m(e5JI64E-o&(fB!xL0|Tw* zZrHE^nVFg3@pxFfb}d|8U9INp^?H+IH#ax9y1IhH;UGUhAC8WWjGXoB*PE>s7Z-;E z2M$23R-?MQ8r!yQgNKI)0AONb0%EZkNl8gaOG^Wf$3sm`jm0HnwtBPab9Q!yv$Hem z>gpg8i5TN*wHgx>6WF+Mqsckb)6i9~{qjt*np;^JatXJ;F0IXO8YE-nrg6&1L0xRhzYXv*~kia6myp0ZyGdg$EBF80TrVS|}6>#K*@omarLi?AU?&`g$mp%2|8& ztIWxJh@6}pELyY(iHV7DbaceZl`GNT-;a=x5S%-A?w9MXTelAW{{Hav^h8%z7mA9C z5D*Xm;Op{}oSclZvNCvic|ohyA}J{eTrL*?pwVd1-`~%uw|DPe<66FT>sDi2AP`{7 zmM!4(`QY>U7#J9UP$)ERU@c*(9+%6VRbPI7K8Oghv9WM>cZZXc6EqqP_V3@1qM{**4n7uRM0nFg-m@ot>TZ?AbGV|NcE=tfQlYdV6~<&TVUJqc?Bf7>@%3 z1L^YR%k<&H2Wo9?rP0w*v-1W92B@W_g$xD*Bi`NJP3`UNCixE^KBSi~Uz)Ae)zw96 zwVL#LJq-^JQ(Ie`MSVX~&zim&CMPGUwY8NhD=W#~-kz>qyT%yr=;$D=R%>?d=;$al zG&EQ|w>2z1cFw6G=8_ph{7n=V7Lu#0E8|_p@4}KH=Iqrqi|yp*<{~^i97Hs48WyY} zDk>_ldiCo0mhnfiv$KO#DxFsi3)T=JAtCcE;jd)DeEiL_FklVA!hkgd3j@{=EDS7e zDlL6)pXHy8i6Mwcjj#XF!}1U3f7hCYg@uKMg@wgt{tI@be%$Wn$D9BF002ovPDHLk FV1k(I&(Z(@ literal 0 HcmV?d00001 diff --git a/html/inherit_graph_44.map b/html/inherit_graph_44.map new file mode 100644 index 0000000..7d927be --- /dev/null +++ b/html/inherit_graph_44.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_44.md5 b/html/inherit_graph_44.md5 new file mode 100644 index 0000000..bc44c73 --- /dev/null +++ b/html/inherit_graph_44.md5 @@ -0,0 +1 @@ +967b6c978e4c21f68444b82609288749 \ No newline at end of file diff --git a/html/inherit_graph_44.png b/html/inherit_graph_44.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a4fbfa6e6f12c600b10c944fd527d725cfa21c GIT binary patch literal 3222 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 literal 0 HcmV?d00001 diff --git a/html/inherit_graph_45.map b/html/inherit_graph_45.map new file mode 100644 index 0000000..0f67cff --- /dev/null +++ b/html/inherit_graph_45.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_45.md5 b/html/inherit_graph_45.md5 new file mode 100644 index 0000000..14402e7 --- /dev/null +++ b/html/inherit_graph_45.md5 @@ -0,0 +1 @@ +8182d890c88d5f534f698ab345ecff73 \ No newline at end of file diff --git a/html/inherit_graph_45.png b/html/inherit_graph_45.png new file mode 100644 index 0000000000000000000000000000000000000000..92621a965c93d3c73a98b8fceb32e4dfb9f9b38d GIT binary patch literal 2277 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 literal 0 HcmV?d00001 diff --git a/html/inherit_graph_46.map b/html/inherit_graph_46.map new file mode 100644 index 0000000..1097c8c --- /dev/null +++ b/html/inherit_graph_46.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_46.md5 b/html/inherit_graph_46.md5 new file mode 100644 index 0000000..91a0c6e --- /dev/null +++ b/html/inherit_graph_46.md5 @@ -0,0 +1 @@ +19c2ebb20ac252d9eb7dfe6b45549053 \ No newline at end of file diff --git a/html/inherit_graph_46.png b/html/inherit_graph_46.png new file mode 100644 index 0000000000000000000000000000000000000000..cfb56db38ed74ffc5021e9811d5eb40c1aa1ce2b GIT binary patch literal 2127 zcmV-V2(b5wP)YlGUZpQ2dgBm^K*B$F^nePIhG~+I3zcFj7M7J$QD@B_bo07jbo;xf+j2h5 z+I>DS*g4lZ=eoY;3W ze?Xy7G#S>}&u_%z@%Hn0ynn107K33s%*@O@0C3E(&M3)dQ79Cv9uR|JODGfyD3wa1 zdj1;3!eIPg!IF%@SY=p}F&L}NUzcPV85yXms#@zXRs>tp!Z6QYmt?PAy~5z&AXomI zf2g*k#S&~?pE=e%$)r*#s;jG)+&?un6#)SOR`Ipkde)qi-qn z_4UEm*B9mGFMdTSROunNJ&Xa6dxZ? z_wV25>Ln5hwYRr(<>BFB5{t$3_3KwEC@3H&Cnpk#L?jlANhXsm=x5))eNdcW=cv*qUh*o%FWHCiHQj!qDA?#B`ucdN=Zqf$B!RVettg1#Kh3EXV19y zr%s)sqeqWYQBe_1O-*rqa&mG=EEdy&0|zK6DT(Uq>p7db_~z@InVBJlLP5ul9ixPV z1iEwQ&YXBtQc~#2lP6SAP(ZP)o^Je&?4Iz)QC-pDpPcPqVyhLn_) zP+D5rzvt)Fid@O^^73%*+&KgX2jleV)2OJZKt)9b0HCR<3FG7AT-%>Nf1EQW`N5f>L{ zQs2P902&(`arNp|@cG6+YiDO?0IR=-7O~hX+34sf+1uOC`6nYHnw*>@A|ekD52~rD z;pztl1_%I+kB<`(QD9&o-MxF)Vt@1h{SC_<9UbK4cP4$v<#I|+PX29thWdtvhKSGSQ*(1O zXRocTC3|~&(r7eXT-UB$2Ffb4R;O*_r**9xleUfg}?Oh4At5L0(=S_XAL= zRA_B&1po*H0=#(ff@@z|S~{n{i;D}!#>SQ#27q6C{-;l$!ok4-fq{XLN~KV#RM2QN zW_=YE6(KV-(?E_ZvqO1#IT{)o;OXg!y?gf}F)%e{c_HFq4`(xLx zT^Jr7p3{H!039A4j*N_qWyRv|?v7ixZehoc9S98#MMOjdva+(cZH6gdJv}|>?Ci7& zE#_EAm#Ov-9y~y0WhFd4JrNQT0yj4|^!N9}&dv@ZkqA*yQ4k7+2n`K|P$)FoQZE#r zgM$Og%F1x>-aUv!B6xXup|Y|PWo2b1Z(NwdaP0sfJ3AZs`T00;;siWAJP;BRf^FNj zp}4pho}QinthU# zucx}YI__qWskI{_nx3AfuC6X>X=$O+(NQD&O0JiEe1UWf5R*q=tSW}BF&6_RqM&#xiwuUX!;*}_SY=p}F&L{1OELyym0?N7V5~A`?=DKEQftP+VAw21 zNk&930sLzXVqq};diZ?)z*@(^U@#aA27|$1Fc^&g@gL!3O`_lQlzspJ002ovPDHLk FV1hwl1v&r# literal 0 HcmV?d00001 diff --git a/html/inherit_graph_47.map b/html/inherit_graph_47.map new file mode 100644 index 0000000..a843a57 --- /dev/null +++ b/html/inherit_graph_47.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_47.md5 b/html/inherit_graph_47.md5 new file mode 100644 index 0000000..533b902 --- /dev/null +++ b/html/inherit_graph_47.md5 @@ -0,0 +1 @@ +ec04d2670dfc505846f88bd0ccb00f34 \ No newline at end of file diff --git a/html/inherit_graph_47.png b/html/inherit_graph_47.png new file mode 100644 index 0000000000000000000000000000000000000000..d406e5c49cdf5ae14941110176b9aa002bbc3e38 GIT binary patch literal 1639 zcmV-t2AKJYP)?@00006VoOIv0RI60 z0RN!9r;`8x1{_I5K~#90?c7^PlYbZo@b9}e$?P1FhC#E4u#0LgT&Fd>T123bGP;S? zmdp^sEFxG)SCSWDdC@Q^D$x1|L6V9Q9l<$zrADyqaAk+pJQdk#&R-Y(9q!$^&Aofy zo)37j-+OqT=eNgq@3tQU2qAt(SPD6g+ag9Xga|1Vib03N(K~%iDcp(U zxGfyVUCUfrghV$vIe7y><@B+zrk&z&IA%N{LSk_^9N>9AY+NBiE`+3nnwCfoH7$`G z$u(_FO$~0}zAbhdX(6XtGD&hx+uz@h4<9}RA4~a(&!$?WG>@V;ZFO}uy1Tpo`gn`Q z0*ywKkytZ*elcrFCU&yYovY|g%kw6UCcCyl)YucLj z=FOWho6V@Gs6bm=TX4LxvNGheHlNQ2gTa8WU%%qisZ$sj7(ioVBMb%uYHDhdjw^gw z>+9=-*=)wHUAthn+wtYg7XU~qmYixyB=<ojCu3sVeQ(rFc=J}rUI|m3xz^~y1F{#=H|j^G-7;wJmFY!swJJW zX%5 za;ilrUhc7E+q|UQv}@L^L2+?0>~?!_LOmW2TrL*?K&@8e(W6Jf{aagGLyljtU;#!( zMp8`!z@PiFo}M14R4SB|l%Tr08Xk`aV`F1cV>LB3;mDCAvZy7Nc)1H@>%0JIXxdq` zW}&^k9S-b&qA$MBQGxx+qZ8=e}6v!z+^Ik=XsdTW^fz_olYlK%CbXEn}U}wU!uOg9#^kk z#qjVjnwpw|>rC6*+fhA6k4qo`}gk;eqSGrN~MC|?++XQ_3IaMa&l%WRav2?P0{Y% zyV2d<4VTM>va&Mh_4?rAXoVttdW(vR@aom8kg=hmA&icWqNu1SBRNYQHEjy++_{4j zCr;q?>(}u6{RjjC`2PJnCMPEW{8_2xcDqB?njScC09USD!L3`jFg`wx!NEb;Y&NW0 zw+^MHrDByLDb%!4G&eVc + + diff --git a/html/inherit_graph_48.md5 b/html/inherit_graph_48.md5 new file mode 100644 index 0000000..084d4a3 --- /dev/null +++ b/html/inherit_graph_48.md5 @@ -0,0 +1 @@ +6383414edc8afe38c237ba9bd1d4b2f5 \ No newline at end of file diff --git a/html/inherit_graph_48.png b/html/inherit_graph_48.png new file mode 100644 index 0000000000000000000000000000000000000000..75ad2df51302980f9653a900294974b9f7ecb985 GIT binary patch literal 1885 zcmV-j2cr0iP)>r4~-wTZ-2rD9y>C#F1qWPykl9^lOnx>{(^L}3Rw5Peh zPutUzaz3xlu5;bjxvu+r?t9lc8$dxpK|w)5@n1ljX;3H>u{0Vj>Ay&ZA}|Oc+N!Fm zw?EoKXFAbnv?Lmh_P<}37DW*G1Hk`(G`I--ovT-`{_ELL1P`TB>DEsF#d%QtVkm*< zIF!J1oLMPwK|ulT-Mbf*SZ1>ssi~?%%)f38JE+-1^$>c9fTwqp7J0v9Ynp&dzo^uTUtkefxIk^?G!6c7n&_;pEAa zSh{qn-?g4NaRMzZEuhos;BvXh&CNwhN{ZLo>+9=r_wHR-EEZ&CWnu5$y?)P|Hv(S4 z0|NtSZf?f$&N7)y*tBUAcsw2sA3lr) z3l>17QhB__!Gi};U0scwoE#)1Bp@dz$LV}~dpq{++lP>l5GWK1yn6Kt8#iu*)oS&- zR=HdbjYfl0r%pjE7GvkmooH!k@tBiZt;V54hp=wlI_%%S9}Nu+XlQ8gIbZ$|@CttY z`ZWN6&*ul6j8G`VqD6}!5D1W(n(EgWqtOUDosMJ2jv*o<0%>V!7#|;Z>uWNZP+eV( z&dyG(S+fQJ5E&T>xm@n#mz9+TjYb0iNJ~q@iWMtRS67Fam>2-QYZZw^j^oXnH)C{k z6xXg@!-fqTTzt)DGs?=!@aWMa$12av%*4dRgkSahB4B|dBO?I-7K;U3F4v!^0io0>Jw9>s|a36B8ZB z^XARN+O=!Z-Q5iyj|aeat-ZaysI06+Z*MQg#>QYY8a?(927>{F5F{rjJK4X_YoG+Y zMTTbxFgZDi$;nBF&0?{*_|3FgEEX(Yyx6Z=$HvBxl#~QQ2$V`CPMetPC@n3;*|TR|9&a8zcz~v+CIH{Ix|*6Arw;kz#fylJ zj)qh!b=VjT2Fzx&-`DTx=s;s*Bf`SMkdTl7rBVrl!Qc?-!i5VcDk=g12m}IfI2>HQ zd>O#E-Q&`wOD-|5U%&1cuhnYN*4BnCTekRB>%hPOK7IOx($Z4w*s%kNiHXqb^&a!* z^Z5`8g;1;2j+@e8FyQIar+&|YH-gedmz0zsG&B_1+1UsW4+opgMt^@lq*5uaT)6@O zC@wBWUtb^M;^H6>2w*mwVYAs#Q&WTJ=x9eQxm=E;M~|Yet`1_c7!?&2Ua!q!v7lC~ zap1rKa5x-1fBqcB#l={%WC;MEr>6(~{rv!du&^-Pym=G5ckjlnTemPiK8~a$*Pp%x z0s(|VAy_OH3{zk(Za3m7kwaeg>P(M!LGXh)$;?!^6XFeTIjJNn2YR z>FMbqHk-|@&*0!7X>M*NdcB?yLWo|kC-2_9bDW>~nGizWzI{t{Ivx4&;e(UCyStk_ zd-lx9HZd_l^m;upnM`DAYKlC5{Fqp+Rze6N@$vEG_U+r`^XJc`y}g}${P^*wYBd-P zM61;ji^W2QhK3xqc*@^yx09DIUy`n_F7oy3SGU*nMt*)i$;->jnyF_{R2)h8w<#?i3?aCwX6?yVM^%?6vzcCoKowaUd75fR}O!(GR|aN$BEBqVsu z(O0bkfxvOhU@)+J`EsxM)9G}qT)EO?yq{%Oyo;vzd4jrv=K@t#RZd;~Y=;tf20wQ6 za{+3Lp5ssg&v7V$=QxzWa~zLNmZ$&OQp_$~1SW)N@$Db-6tj%Kw4 + + diff --git a/html/inherit_graph_49.md5 b/html/inherit_graph_49.md5 new file mode 100644 index 0000000..9256724 --- /dev/null +++ b/html/inherit_graph_49.md5 @@ -0,0 +1 @@ +094f3dcb75e03601e3aad53d8f87f28f \ No newline at end of file diff --git a/html/inherit_graph_49.png b/html/inherit_graph_49.png new file mode 100644 index 0000000000000000000000000000000000000000..f9508fdc2ff49e434c412e4cad34972565381038 GIT binary patch literal 1862 zcmV-M2f6r(P);{3PO`i%GvcN;n=HNJ=7z7NLY+sHlHrnxrI=O8JGRDKm5bIJY@xGQFPE zI$iby1H-%5`>uDd^_zFrUTcGhh=_=Yh=>RXUmK#Lq8tQ4@cJ3ah^##liDa;_u(0v3 zwsl`O5(L3Z5QN`iLSbRynkOXkV<{{wq^+%OfnD+wauNB5 zA&Njm6oJSuDuTGUII60uzRNc%DvH|L+EvbI^<$5Yj-t_Mn3$MYm3T|>ONij>NpEj& z=l%Ql-xaI1wUy!F;nhlQ&0^2Z%~4lZ$Nc>Ks>EB0RTII)#00syxrBs-aNxiJ&Ye3) zb91xtdT3}U<>loI{0<*JY%;;o(a}^_SDUnnii*O+!(+8l{Uu3FO(iccZ%tyaiU|7p z`fzh|qqMY?{rmS5A0LlGp&%(K$vE*%O-;Oe_ill2Lqmhfuez`>} z)kyW1rK_upzP`RSiM{AP!QUYwA_8Y;XKHF{kVyX2ReXFrlarInj+338O;1k`IXOAp zzkeTEoS=m@~Yix+8ZY(yfF;N;{)L_`F>zP={@<>lo(dGdtu@o|nGJ<73T$G+K5 zZf-7}ot@<6?H#mdTx*x1-5`?+-K5*8K~#KgofGBQF?P>}JOR;wi|D~t5>bllwB2nq_KvGLDc z*38UI&YU^J&Ye3sdGaKcm6cRhR+_}u>2$=!#qsFTBXV+bu(r15%9Sf5CnuxPXo!rA zq^hcl@bGY>PfSb<#l^*hhlk_o>1lFptyys;={QTIwc{Ba}{a9LBQe0e2XJ;oncI*Ja($W&GR=e!6TL~)`fu*G-0ORB1 zI5{~j+D;;opx5gc*!6n-H!H|;ad&qoHZ~Ry4-dS(z47(+B_t$dNgt(BY5cxv(-d?7rrWhI;GOkCuySp(M40wBco5cGv1^{VkX*fDM($Ud@nVA^? zuU@@ketw?B#6%N6K@jNa>A~9C8Vd^xqW}PQ@810#qw#&L`0v2g)fF2X8=gLWx@0>C z2ZseE{qyI~eEj$kxm<3v3BrPd&Hu^u>(}Y(>LNBamZqjA)M_<4oo>XMn(pDy`F@G1PlfP08*(GK@hlb;R0D% zS;kLwbv0_W8mUyu?CdPFv$MuHE-!hqu%*;$8BO{T^<-C0PlH}xMW0~*i z>0w}CU|IL!;^IO;KmZDb0);}s+qZ9Vb#-NKZVmu5Gc!s{OVMhz$mMdjY}tZducxA- z!X%EJogL4gKPNCSkkHUjN=iy7D=Xu~i4)wtdl!3qd)~Zx!|~(CF*7qmB9ZXm!2^yQ zIl{w-51F2x#>;ErD;;HJWps3OnAq;!yT`U|+m>~Ii?N_Co;r2vs2~Wxi$}@-fBg3- zxvZ$D$mD&3Ut-%>WNi^eAR>xDL==Gtq6kC~MIeGG0ue+Jh_J+tVRUr#kIX~lC$c~U z27{pi`1eo9MdSw{kw^xAb`ByUA|fIpBL7VO14t}#WHtk<-~a#s07*qoM6N<$f+RVO AcmMzZ literal 0 HcmV?d00001 diff --git a/html/inherit_graph_5.map b/html/inherit_graph_5.map new file mode 100644 index 0000000..817fcc7 --- /dev/null +++ b/html/inherit_graph_5.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_5.md5 b/html/inherit_graph_5.md5 new file mode 100644 index 0000000..c4e3273 --- /dev/null +++ b/html/inherit_graph_5.md5 @@ -0,0 +1 @@ +1dc04388623e810e6b8e13118667ba3d \ No newline at end of file diff --git a/html/inherit_graph_5.png b/html/inherit_graph_5.png new file mode 100644 index 0000000000000000000000000000000000000000..4eaa0717c892ce66fc502293a73037a8891d0103 GIT binary patch literal 2333 zcmV+&3F7vNP)NslhHBBBSD5Jf5){nxjzWolXILNqhdhHizmvM?1?%9>?r&iVQM(bxO)s#A08 zJNr+!xpY<)X@83uu5Udgi1b_W|S`5a-rKhJS3&4N+mJLYCUQ$z2|F{r?F_B44O@&6I z8Bi{?feVAd7y_1*48|CPB_)F~#$ZXwusRBb0)>Tzw$>Q8u%u*Iofj`&pt-r()*9m$ zv#YPaOKWQ@GBY#r^yyQyx3^>7ym^R>jKuQg%K-pKjvPUGc{wjeCX?a9g$veFusY+x zxv!(Wy*=FA+z=HNg^-XC8=IM@*EuOE32WD`<;t6zo3V4}PKZPzJbd`jhK9DqDoI&W zQ-k&E*Tcod1$*}FfkYy~hYuf+kdT0cgamBcwhcO+4$jWbh>eZq;v5|vt+D$*#&~e< z>)74hjpxswW8=n+$j{Hmh7B8Rtv4t-oep}v9x9cJmz3%0>Co%-`1b9a4ee}?Rgy9~ zIvVrm&qqN)0ffT;T@lB|#_|SOB9TBYmk)?nC=}Sdc{3_2E1}V7aPZ(k6c!fZ*|TR5 z3Wf0W^h9)YG}f$H!;9IlVFO;ie2L1+N_cp9AUQc1H8nN3cI_IzfB%l~@Nn$fwTri} z?CfmZyLS(*t*r z3F+zSP$(2osZ_k(;Fs>~tC(F)=Y=d-v|8ky2MzM*ygxpkT;$p`oD^A0IzxU0`4!&73)t&YnF>YPFi0 zo100e(@{}T5vkQ`QmIrV7K^E@tc(}q=;%n7E?uI$ygXX5Vg>p8`%_R*5Z$?Rhtks0 zNF)+bX=y1JlboDP-rnAnnVCsBIXNVk%PA}@Y+O6{cWi5GBTr9HN=Zqv*wxwDna-a- zPY)hEpsicCQea>pSFcnm$<@`Bu3o)L+1c3?5fMSTxw#{X4Gj&Y#Kc58aNq!)IB|lA zh;njrXz9|Wl$V!B)22=1jkTq&!^KBOM^ivR0NuWQn=&#o$ji%%0MMsTpGGtXgN^S< zxPJXQ#l*z?ZS|xqE-oejR9jm+WV_JNP;zr~qu}6R?(fNyC)`1qJNbJ_PEMxi=xA;` zFffpmN+q|QpPx?vsJ_0QE8D((J0&G05fRasFJH*P!GSay4Oee47--U@N%Y~vhjHuN z*Kzgg)#T*lL=h1Y)Y;j|+wW*xdlQC;sG*^OJ5gI&TFBnso{Ec$d42r&@nhK7UgyNb zM0)k=70sD5hq}7DXye9>l#!7!Xi{3@I$V5XV1_AT1l+R)V0 z1XovAUK^=Y%6*qL%co&0s-`TJ-ocU#;tR& zV^2>HYHMq8>eMNurluk;F3uv?zQ^k1(Gez-39YTI zW*5GOIN;G!SS&_oXD5FC{E5kvCj$WYrPy0Pk~!!* zzLsL~@061#Pli&d#F;Z^@aWMaUR_~fAxcV0e!I{5`g(l*`V~s05}P+~hD;_K^ugWV z!N| z&krY0o`lI{0sy>z{d&O9MH#axPWHQX2JsX!VUxvH8`)~K>Ilzm15<} zm5@rMyi23eU}tBCtgI~DzkeU@?(UGuWN>kDL2Yd;&-Zzu!pb;E(dV3q5@?8jYmW>FD|M z=hV{D!mHD2we;@YyFueBDk`X{scAs@>({TTtgMU-1_L!VHu7$^`^U7lwo*w+2`~Q5 zn>T~*v#zd=Dk>`I+qZ86+E-OojVouZR!c=iMO0K&M8(C$R9#(7Mx)W{t|pU-ii(P; zy}g}R_Wu2Q(&=>6-Q7LnSglrTc5&_V=g$Mi#2T(c#S;;=x3`l7r;qFFuVG?Z{NOu(}Tfa{KJ5x zB%(3^;Wlt#FeV&Ap|IZ84h#l^!C){L3 + + diff --git a/html/inherit_graph_50.md5 b/html/inherit_graph_50.md5 new file mode 100644 index 0000000..bbcff1c --- /dev/null +++ b/html/inherit_graph_50.md5 @@ -0,0 +1 @@ +b4ad23ad2af44336a6c0a589c76a923e \ No newline at end of file diff --git a/html/inherit_graph_50.png b/html/inherit_graph_50.png new file mode 100644 index 0000000000000000000000000000000000000000..128bab992139f6c3e16a45b4c8e78fc16eae6ade GIT binary patch literal 2332 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 + + diff --git a/html/inherit_graph_51.md5 b/html/inherit_graph_51.md5 new file mode 100644 index 0000000..10c4d9e --- /dev/null +++ b/html/inherit_graph_51.md5 @@ -0,0 +1 @@ +3d958f6fbf088cb6f04b10638bbfc957 \ No newline at end of file diff --git a/html/inherit_graph_51.png b/html/inherit_graph_51.png new file mode 100644 index 0000000000000000000000000000000000000000..5aad9b5b9d60f9a6e7a2ff79a23b3feccf742a80 GIT binary patch literal 2596 zcmV+<3fuLGP)wsrhF+*4ta+HBNpw=dG!3Ky7ThU?n8q1;5t$T?sUeZ` z{NcmRbwN?&F`4uEYwz!zbI}0h7rTpeRb*oe(3D z+$2n`Ko)22)v)6@Cz!w-4z!3P1Tsj1BIdGlr(8ynGRGz13+V>B8`NJwze zkd~H4TU#5=&CU4x`?GcHR)T_p)HC z!$D$VB37%F^z?L6Qc_s6W)0td`>oo>VzE$ERK&`aD@jR7!EU!xP*4DXPN$=!q{QVZ zw0rk%dU|?PL%;m;%jDjC)j#~&FS9K>uk z)6~?&z`y_i_4V~6CMMoc&+r(HMk7>(&bn4i-Ci?sSX$`T2?R@^bY$Dk@5R z^wCEybsl--5tlkwU$?cj39VKu{`~V#wY>v#Hnn_U#jZ=gvRlDN{sWU!M>{h({lNRJ{KB>uPySOpJKzt+#{_ zLYzByPI!8Hik6lZwY;ydPfVRURs8hRPeKSGcI?<8!o$Ob5JHrcl!&aXEOnfR4jmE$ z0|Ua#%S-Ipvu8|tA|fKh`t|GG#$8fUB9fDnMM_GFTaF%o{Bf5yRaI3&Q513N)G1ZV z)!)Ij*zI;jR*(vlER*LrhGJS{@r4%i!Q3U0q#7MMaUFoy{9>yus$poB82~A8{rBGwT=7Y7Z|@CrG9Jcl>V*pz zGGoRJ>gwu@qUO+&A+Y(}6V1VC$|DC|VKsBZ)ZU+Z%NKsJ{uf6sfCr+H;gAYES zu&@xP(>dZ7H&P$h>(j@_hrz)?`uqFUrPT1I&d0|GfXvKH)~#DdLqh{KH8mtBC*$Ym z2Y|P?H;SV0(n~KfZQ3-Kdk-%Q7A{=KtXZ?DtE=Pi;lmUa6#-XFZL`_%@bEyV({bN@ z_l-#pTv^s!i_K=EqN0Kg8#eInyYISD zK8x9GMyu8G<(FT&EI+Q7*RkYeJdAryea}7jV6)kH_0?D1Ud0_ec#v$s6};3z^XJd!yYIeZ z>C&a>^?Kst<7sbiS52cR3I>CLx8HsntyZhvcgd0^IGs*vYHC=vY}uIgjE29zKSz!n zp`oFH?CfkVU%u>8KD<$kj*cGH&~RlRb^iQ$Y&ILIsj296x)Bc+jmB7VG9GTrE4_k( z0=8}2#?wzf&73)N(CKu{nl+2!;$n3c&d<-sU@#C85<*N&3=ci@5G5rgR8>{s>+7rD zYj^_^A0Lm!V!2`8{{H^F^Uga21OyNp8%sh$0{Qv*>f^4Xql5PL_FEpCr>7^Cm6d$_ z@yCRPg)wj5JZfuesjRGYSvDDsMk*>Q5JIqG#R@g<;o(7bbv3oMwFCwRqSNV^J$p8% zPoH*qk}O-c42Q#k!C+8h_uhLi(b3U3olbR=I95HQF>~fjzW(}ay1Kepy?Qm5E?v6m zoP>pi@x&8P5E>dvY-}u{p`q$BbS#WDC%1~*^C2fE=P5-|K9@&NCI5E*cl5Nnyu94y zJoR1iH@QS|Ge}cQCLPk$l1Ya&wPeyEO)Z&pNK;ED9n#d2NryDGWYRI}*$=bX{QuM; zk=!=iOf7_H09M@rEfUF1qtR%(@3aPqL?V$$Boc{avhiPfF=h+A-pz>s0000 + + diff --git a/html/inherit_graph_52.md5 b/html/inherit_graph_52.md5 new file mode 100644 index 0000000..3b6c49c --- /dev/null +++ b/html/inherit_graph_52.md5 @@ -0,0 +1 @@ +280db5acbe7ee9f6a85acaf0a3792ac0 \ No newline at end of file diff --git a/html/inherit_graph_52.png b/html/inherit_graph_52.png new file mode 100644 index 0000000000000000000000000000000000000000..857a269d6225916eb49e13bcc418126e2478d61f GIT binary patch literal 2512 zcmV;>2`~1EP)T(z^o%^}E?CU#p)7$##gW)sO0U7UN7gk`~HDr`DQg#{2KiM-e5MHHIgKy-j84e zg1beQG47dXo^cbb#bV*hFTZr_V>X*fN=llpP$#6Jp@B7P*065fI+Bx< zxq9^~U0q$2m6c&I7zhao@$35I^ZV$dkCZ#Y7fdwbpbBqb#g9v(g&p-xJFf4`e>`}_NuJ$p8@X3d(G z>yOVbDk_Q(KKOuvfdR!;e}Tm3bLzXHprC-5m>5o-I)yC%`9CQvEM#zSaLU(t{q@&z zI-Qi4mvi{=VdCTCdH3CSv0AOHUAvaGYu9=m*WBF9!Gj0s>+2&aDT$Jj5*932;I;3_ z$OzTd)zsJ5BS{h_lS!E=ckSB6@#DuC85yCgs|$eNe*2AEw{BrD7Ad{%%LE4pd(ChE{{76GH;*%C&hYfpPXqAPS6@+DTFS|jCn+s0 zRctF(tYFEKB@^ZVqj$EPoE$D(xIk-bE3drribowPD=X>f=-|MC1E|$%05lp627>_r zolZw&WF(D^jjUO-#$)`hUAs7c{yefQvuxQi3JMCy$jESuAvZUd_V#vKT3QGX52viG zjHOGLPFg2_@q4Dea^(t*jg6F+mbwXg3}52%Mt*)i5fKsO<>g_w+cBHXz{KmhYuBz} zG#XjHd^y{;ZDaoY`E1>~)u#`u)k;N01$lXSJoVI5*zI;oN=g9Ouweswy&j!Thuv<+ zZnv{#%NBxyg0S1|6crUs>hHDJUZc3U7=yvUrcIkTapDBeJ@=f?{DOjl$jHc`p`ihQ z@4x?^;o)H{77NYI&D^|s6Bu0OIXAsh||k3RY+01*)pm`o;YHX8{E2}DLlGCVx2_*bjd z$g-?_@9608>2F|QfW3S7($v(X>;W<}GYJa|l7Uw?K7^a;J2vf&6@|n_3PJJwrrWtezGj%a=AS0E|<&e3_n#86BF6Gbt_3pNu;Hv zk&%%>ety2!zTMs3$g)gwaV$*@7A#mmeSJNNiHSb@X*3#-CB)5}H~Hn4Ux`2yLT@aFJ9#R_ur?yyqwO?PLCgM;lhOs4-YdmG^8wx#x`gR7cTVMUubA3 zk|go!tFJO=&K$QfV@m*U`6VPI5Ed3jeSJM=&YYp5q5>EdwasQjrBb2S>j?=7nQ{(6 zL7qRY&1U29;lpg-zMcL1_j| z&F7zg?za5!l`Al%I{Aa&YwFpvXJfP3c;k&XJRZfJK7E>RzWD|KlgY%fW5?Wf{%^hY z7K;`wLZ{Oyw$RW}pX)epw6(Qy>eMNMgM(SMY84iXg-e$%asB#r0QT+M$BrF40MKf+ zL`O%nZ{I#;{F`sSNnBjqlxK&D{AsmX;^X7__S}PDe+FA`ox+Ns@%o zXyom;-$t!gE3u@drP0~hNo{Q{+1c5C=MWwq&e^kPaX1`o+O&x~ckZ~gk8KonI-O5J z!{|P0U|;~7%|=d64tl-b>%k&lOr=i#FfEVtN=i!Dvu6*_KKm?@k&)>2dcwlOsI071 zX5r%EVvI&3F)=YDCnxjp!w>V`d+%}V*fAC@TBKZSYy*;>p02$7n27N3aNc?69W)vZ zDJdyrWMoiWT&&#goK7bl9UTA!2M2TX=uwUwIf7QJW%=^u)Ya8-^ytwkFM%fVr&6h? zsi~o^u8ydvDD-+gOO`C*haY}W?i#-G%g)Z`!i5VMjYh>bckWztIvt&zoysQB-y9Y% zUd-2De@#zM59`;j=l1Q}Q_B0VXti3Nc;X3SV`E84Ng*~iR#}Elg{joZA3W|4n>TO% zw1|9Ad(^t7hBy4vkL^*`b@xj=9?2vG}W975EB8HW(HV8$UtEtqi#Q43}q zLezp8hY+=3#^Lkqhs9#~JL3=trVS5KkBp2sfdAZwSOkK*MwaC(_d5oGKp+qZ1OkCz artx2Y5ZH%`0ekxZ0000 + + diff --git a/html/inherit_graph_53.md5 b/html/inherit_graph_53.md5 new file mode 100644 index 0000000..609cea6 --- /dev/null +++ b/html/inherit_graph_53.md5 @@ -0,0 +1 @@ +c4bc7e47d1cb52a1860f0e09cee5f9e2 \ No newline at end of file diff --git a/html/inherit_graph_53.png b/html/inherit_graph_53.png new file mode 100644 index 0000000000000000000000000000000000000000..f5514960696412c1e6cdc89fd6d3111c81be3d54 GIT binary patch literal 2242 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 HaOD31h@2(x literal 0 HcmV?d00001 diff --git a/html/inherit_graph_54.map b/html/inherit_graph_54.map new file mode 100644 index 0000000..167be6c --- /dev/null +++ b/html/inherit_graph_54.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_54.md5 b/html/inherit_graph_54.md5 new file mode 100644 index 0000000..2242861 --- /dev/null +++ b/html/inherit_graph_54.md5 @@ -0,0 +1 @@ +8b23818f9b56796fd8e9cb05fc3540de \ No newline at end of file diff --git a/html/inherit_graph_54.png b/html/inherit_graph_54.png new file mode 100644 index 0000000000000000000000000000000000000000..55f963edb6e0e8a4046711b90eda69c4873a9478 GIT binary patch literal 2377 zcmY*bdpOhIAO9e%wGE58BsP^)Zgbruw~!WXi5g#&yL{()sVqkBSyRr=qVxG3AtbpyEudwO)Jph1gowho0K8ChLi^DriDtAprlk+r`@nzYn z_C`0z^qxWQ3LhVSLJC)=)QpthrH!ACExPU@*n>ejBViecg5?12G}OXtSkjGJ#7U%jeyeURtW_ELH8S@ufM=fAFxH8pK#BSnuf; zGDq)L)a}eniM|4}ObKPvN>+Ebjq#P$T_Z2tE_)FOg!(HSRl(oC*K9JIs;jG82L|>Y z&4z|GD6apSJQWjzGmYEex^!+%IK?5hbio98o13%4 z9J2!SL#Ppsd`+=wC?SE1xrOu*u)pxa-w*JFnw8A>X>Y zyL)tYYRWxqu2-I6nl7tl@PqT0MSOn1RWp|&;AI6W%gI%iSfVBGaJdm{^^J}BAvi^Q zH@E)IL9%{mM8v_XO9Y6%KY>G(p?D2718jW_HRO;h(wdwJh2il3ov1=KU7XP7J zrs3V)(U{~rckd$a(rCSXb+xrQFa!cAD=QoJ=f{P{i2S}G$zw;3V6a&1K?8%~GSV@} z3cc=PCKC;7yR)_yMe13f?8y9qmW1Ggf;3|VtKV#e6S!RN=!Lzpr%#{8fXO~8E;#l2 zWN2up5U}v)DsN-Md8unUMBCUn0Hv&?R9n9~o^FmdCzFpRB_&mQze8TPQaPxqI@bG7 zeF$c=p{i=HB0@YJrQzx2;o%{tpkU$XD4Rs3YCL9uOGQOR3yX{Gt*yY0d^x7{rl$RF z&6GE{_aD!gfwdJf7$WiU@lLe?@==SUiJ){X8EmwXkph6u!WXjrTBk!+_?*jD*49rN z8a`=GO!g0%6Nw1l_YXxM5yin)wFasl5gMaj#{Xec5+fVC@2W^)9>tl z^`V)|WH7PU;sv-+l~oRhb!|Jos>@SfU%x*3mlCi8q>PM=^;r~RztJuU2?*?v1cs!)qxtx845YD5R&h z3vbtkf$o4%Hic>C_S|j(2~=HM`=q1^pSm5R=JFNJ|rs)odf!T3PM7Z}Ux}YwmXpF6=AhbyJfR3MH0>PcAD{U$Y-& zvlBr~O8FoZYFb)d4dL^x^BnBuKE?Bnj*Qo@X%j|ya>yIWw+IjQc3aRT%gf6b;m=H7 z1x|neeq+2Ym{D4~2UH+$^;?fb_!-u7L~UiA>VY?lW0>5Y5iE?O6?ZX5CkHGT(8&S^ z63Lfq%6q_bG)Y-4wWB(8>JLuc4~6UFd|WNzMEQ~bpYr;1QQE&n_XIuTP%n%KDQ>HC qgFLb8l-}lO{;&AhsX_SZ0@;O|Ihnc+BGX`P1e`uew5qUhPx>$Jm2lqx literal 0 HcmV?d00001 diff --git a/html/inherit_graph_55.map b/html/inherit_graph_55.map new file mode 100644 index 0000000..a1d068e --- /dev/null +++ b/html/inherit_graph_55.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_55.md5 b/html/inherit_graph_55.md5 new file mode 100644 index 0000000..9d5145d --- /dev/null +++ b/html/inherit_graph_55.md5 @@ -0,0 +1 @@ +db03ce377c6cab9607db3688869087cf \ No newline at end of file diff --git a/html/inherit_graph_55.png b/html/inherit_graph_55.png new file mode 100644 index 0000000000000000000000000000000000000000..87d88c444c8d80303a187239420910a93d8341f2 GIT binary patch literal 2133 zcmV-b2&(sqP)bO>vLx_@G6_nNEJ4JZCo)o@ObA7KoHFsPbYx*Kmb#{!*ig55-GAIqdz#za zOqbPtKL71^eb2eR*LT02b8R~S0|NsC0|NsC!&*ZvE~KWWI#U$&$6AV_D8FDfc3AdyH6>hv0T zVfcr^G#P`{VVaD=>im*TCK8Fz)YSBknb%U5>u+*$5}~1?P%4#HboGlg+2ZiJySwq} z)2AQqW3A@3l*RtcHQoIDJX%{@p;oJ{>TA`SOsQ0&w6qklv9XAVh`^aMXCM}fb>s2z z@u;t_H#jaPCPpua^z?K*e*9QZlbV_efk3cYR(}eNty85^p{%S7adB}tdh{rYii%cr zmHAn6Ta_jo9v;TNefv;XSBFD~4k0r$6YlQr$jZvnHC9JQ2S!In4UT>O{JGwzPa=_E zY-~(VBM=DS!b04;cMo1(UbuDZ7DOTuA|oRa85wEx zII&oa^73*_OiVx^5FjTf2M!Jn-=(duugAlO51~{l5gZ(hvuDqO#bTNCY))TaUynzR z9zmf{ATBNr$BrE{y3T@v0z7&01Y)rm{{H>|fWwCmBR4l!cP>H*Dl03|($WHoq7WV) zj^yNIlin8RrqyauT3U*>wl+9BJ0meM@w;LoJ;OFOu`X0y@U+zgFIV>CaJ zNQC0zVnjzrBPuEi`T6SyIR6^U2MdHx26Bw{Itvm6f{JLZOh{y?a+r6A%!fr}_4EPfriAx3?!M zl}a~0Gc#k(Tyn-3bJn9I`Zbt8-sbx>E&`cv9+}&t*xzk9=?3} zVsf1=EiJ^`+nd)05t*s>hh)gD1R*t49FE1x)X=(pi+*2#QU2fR00RW&-D8T3QP3mZx#=^pa zL49Fi!RQsxQha=TkdcuAfk1$updf^VgdjFHcG=pYp&_W%YMeWFPVX3sq9Bz@;o{<= zS2w3;v)Leo80@LO=4Fh72M=OkU;v||qv+}BL3MRCyuH04kw`ExF#(#U;pgY4(+36y zLZi`Ocz75>p>WBZUcGt+J3Bk<*|SGi3kV3XD4UhC;wIa>cP|_q9MICz0v{hAlR9T- zXMV2cSe*HQe9UZZM|9)MK!{K0Za?;}YySuy5+}sQn ziv^)ji1hSy3=R(J0xT&hK~`3lS*?eM2fVzz(An9E0|yQuG&B^!!NKV5?FEO!F__n! z-re0DUS3|v%gcjSs|5fI4i2KTv(xB0KY#v=YuBzprBdl?FJHcdOeO=D%Y}!B2V7iS zP*PH&8!svMXJ;cUEDUaLZt(N-!|vU?ar^dd)YjI*(a}+Nu7rdHHpgZuaIqp`6O zJRT4J{{GmpV+Te?MvQ)v&FO7yY*1HMhqksh@OV7<`uZY1J|0`QZZ*12Hk*yHu`%%Z zeE9hIz}MFoLZJ`|2?3zX4m*c9k+>QUYsMTuH*VjkHVlk1+zBoZ<{K2GN5=E$>W&&d4zyl&iFHcMe@<8QDrNJ~qLqbTZ6=6N!P zM%{lV0D-#W3W0*lQCEwrpXwrj>-Qn z)6>&`qz{JQ7=tDwgggiE?=|qk@EbtW^!v5;z`(%3z`(%3z+lK<9wF1}313GU00000 LNkvXXu0mjfA|4nb literal 0 HcmV?d00001 diff --git a/html/inherit_graph_56.map b/html/inherit_graph_56.map new file mode 100644 index 0000000..0d24209 --- /dev/null +++ b/html/inherit_graph_56.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_56.md5 b/html/inherit_graph_56.md5 new file mode 100644 index 0000000..6ed2546 --- /dev/null +++ b/html/inherit_graph_56.md5 @@ -0,0 +1 @@ +eb65937fa4a4f9712c7122be27564e60 \ No newline at end of file diff --git a/html/inherit_graph_56.png b/html/inherit_graph_56.png new file mode 100644 index 0000000000000000000000000000000000000000..582671b86feb866073215543fe9c099564a79a29 GIT binary patch literal 1674 zcmV;526g#~P))j_IoTP z_8^Yq3OSCe|9i3+3yJaZ@dg0JzsKTCG=arp`Qw5Z3k!?I0;kg%7w40pg|WzBCSu5j znTR2qKVl-k-w#0$@bl--q|`J1E`P*Cp->3T&CLjh!%3-A#Su3gx>cdxAe27>{)xw#4Jovohv#-cFM zn>TNek&%I_swx6N2rzA+~z8XFr!b#*oLdOb`g6Fz?Y7?md?)YR0Vq@)C;rKNcA;K7{M13*?*76d_n zUav=eeLcFnyV2U(D&|W|OVQfeiZ5Tjh_7k2T4694B+WQo|H+oK$B!T5@ZrNKDk?&C zb#>g*oT#4Z`WXxcJbCg2SFc`$Uav=ac{zG|dc=HjadFiDJ3gNef*@dMXh_oRGchM7 zs;H>I{rmS(R#t|*ygZbZl||)ECKGPlxPhXgBJA6@4^>rFICt*coYlvYnVAWNLIJX-zaP;U=s8lLcR8*k9zaM(NUd*?(wP9djKzu$rI*R7zW<(;9glCt8 z(P%6=cI+5QrLV7#c%G-XZ{LcshYueT0P^{KqAyfdHkZrqZWRpAyz1rQfDao2as~Qp|t-`c-`Yh=^9N zUQN%QJrnc2y}bm01_lPEojaDhckhzXX#6MEGgDsnkV;oq7gQ=0Hg4P~#tI4w#K#{# zd;rh$*t&JA7~8&mJ0g(?y1TnEGBP5oJ})m10MO9TfR2t13=R(B{rmU0cI_IpT5Xip zoSYnJwOW|XW;h%UJbLs9O-)Ub=9JPO0Nidj!r?GZpFSNG=Qs`?j|Uo!CLuji`{{H# zF}HmAasWUe5I{yohNSuAAlpQ0wHm=-5W!#&DwPVr|HMy_o}P|KB!Z!#AuL2%1>&c^NAw*dg- z>z0_;YPHa4G%%aZV(j|$>(J?R&}cNW>nE7l_-@&uhnX?VZ#PE91iTSryPZOzkeCmJLe$yW zN$=jhqi{Gpr}ZwEi@LhHrqt$gxx`IqEI)qypcgM*M8({0H+6J$Nbc`+I_cZDZ*lRS zo*rs%Z>Pb*L0Nic>et@hPJMlS;`6bwF|yn3G(0>k#sYx=IUEl1`Fs=%2FY%>PkJ7v zW2%jH+(K$J8cR5it7rEUF=F}u{X`8`t2OGTv_? zFcUFk!%W1G&6L;9%FE0DrVhpeCeB1e^e=$YBxqqQ0C=A7O|}LGgTY`h7>xPIe;%4F UY>>GvH~;_u07*qoM6N<$f?hjB(EtDd literal 0 HcmV?d00001 diff --git a/html/inherit_graph_57.map b/html/inherit_graph_57.map new file mode 100644 index 0000000..cb1f2ff --- /dev/null +++ b/html/inherit_graph_57.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/html/inherit_graph_57.md5 b/html/inherit_graph_57.md5 new file mode 100644 index 0000000..8cb1250 --- /dev/null +++ b/html/inherit_graph_57.md5 @@ -0,0 +1 @@ +4da67066f45e1e4983bae352a79c0f14 \ No newline at end of file diff --git a/html/inherit_graph_57.png b/html/inherit_graph_57.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc4495e94bfd66fcf89d1141b9400d59ace4d7a GIT binary patch literal 7111 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 literal 0 HcmV?d00001 diff --git a/html/inherit_graph_58.map b/html/inherit_graph_58.map new file mode 100644 index 0000000..d25b947 --- /dev/null +++ b/html/inherit_graph_58.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_58.md5 b/html/inherit_graph_58.md5 new file mode 100644 index 0000000..f577aaf --- /dev/null +++ b/html/inherit_graph_58.md5 @@ -0,0 +1 @@ +8e0f39d6b7119af0dc3d26be54548934 \ No newline at end of file diff --git a/html/inherit_graph_58.png b/html/inherit_graph_58.png new file mode 100644 index 0000000000000000000000000000000000000000..746f964b2a891ec4350c992779417f0e74b228ca GIT binary patch literal 3312 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 R*T5A9a!*4aU7= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/inherit_graph_59.md5 b/html/inherit_graph_59.md5 new file mode 100644 index 0000000..d8dde91 --- /dev/null +++ b/html/inherit_graph_59.md5 @@ -0,0 +1 @@ +7a6f3d9dd3aedb5299517293abe5cd55 \ No newline at end of file diff --git a/html/inherit_graph_59.png b/html/inherit_graph_59.png new file mode 100644 index 0000000000000000000000000000000000000000..eb30583cb5f1948cb5358f5d3a52dfcd6e6dd1a0 GIT binary patch literal 189303 zcmZ_01ys~q*f&ZDf{sckAtfLn&4AJ+sic&2NQ#tnr^um^?hr%-loq6s4gmp`?v@S- zsr$_My?3p<-utby);S(wX8wEcXYc1%dqSQl$zHp1`w9jI#ZZMN&$UB# zH5IED2wCaxa=o7(vznDt%IDdXSvR*=GE>N(UYq^PX~P0f>WcS9#hG*CROSBnzgQ^3^RVyb#<5(; zL{WREnrUAXPM2iXlz;R{Yazd(UgT$~s$70(OWDVc2;?gf_z~atY(?f=_2XapYE1Bw zja4$a>ehpe@yCxIZ9m6NmG#s_e@bq)bSmoe)CIEsKYz$yQ&Lj8{`T!#NwZGT3T94 z$;b>g`uhGVHdIzukIT!^*W|UGcvNgq?>76I)NLVJ_Jd)gs7Xg813Y|M8YPA`F9nS3 z=;Xwc-)1zA)dt2dOh-o-0MF~??QJ<)#-J>Ed>1|rtIwd&d05{SY1VynsW-J_s@`+; zM?P`C@E#(bRnxpV5dXf-Slr6Wb6L;){CtH}-UtTygc6@Kk4PG^zW-=^Rmt?Ion7BB@1K{3mWC1pC>{Ce<S@UoQ{VI9riFco7#Itd+nZ;<5jRTEwF>hC$x+{PcM6g9?2z(j+K2czv{7 zR#i=n%Fz4oezfgmO^BH`shNJM@#`NSwbhosCDXG${rINTq@x=K-QC82dU|R)T4qKX zu^PgZ@n&Ymh>)Qq`Yzrwv1bBpz9Cp`W=e}DhMN}F+GUp@}A@k$#a3JO;0(|!fm&NVKYY8CqT z?%!8G-?}(gmh$0bd|GUVO?F_LgU3*vB?EY zsoZ3Zb1n>rh?<(iuHpFo!oosa!P($as+e!X{9bY6xlTCJVSDDGcC|z9k9;**rA$$H z=br@{gC);e!p71cSS8%I`laA=_Gj4mBwf(CU>_!`vvQX^QvQ|=k44{2LqkJC=7#6B zdP`Ri4eQ)WQPZWAF1R@2JJ%XQL_`FegT`yyf5L4(A|^9)>*#d$KN^li>C_Br4LRmT zLa2Q*-OZ^4es>CTZ&%lDr|(TI0Ni zhmZf(^Kf&2b24>%dt0?vP5XAoaU`XH!>HAWTX+`M<>vsGeFXSMoCZm+A4 zz0=Y+^1d_y$tO<;V9|1X&i=NxwdwyjsGfTURRpJ7nZu%73a^bvmpv{H&dz`=O>}H* zO9H!YlCV2>PXar=sAxm0JB$20zu}7)Ec!K0)$hM8U&6t;)pg_L{)$RKKmf*vr=Mj~Zf^XN|6ONbV*2l` zSf?_YzAjXM<70N5%Zovy~iKp!_CQ$+U2-@YI#aX@4rqR zzm4FmAE|L>)vdI~oH^Q=|CY>?*ZR>cx~KvM>QD>sxeX^C0VSov#@J^8hXp*vl>60l zF74suk}%R6Vy9e~n3$0p*KXgR*{GUkWMm97?@h6XsVgflcR$&vvK%RS7Q)J&+iRgs z^7ZT2OP4Nf_i#3D!!DRxTa%AvRMaXl!lajtyvxP)2F9_oR@}I|+rx>?^{n}lgQH_I zx7ii7_X_qEuA4*1@C@eOE1<#yAe=6z|}1;;!4{1}W%X`Qf- z1-$>>UtL{AwHW9&yLn<~t0~->Lr_KU6;s>c7?&SQ?|F)FGfs6)O>z+BLCn&v##9X^msrCs-Ynv+7qzFzUIhAar{BTQk@<)UPwzl zpKcH#CnrDp`e(~ei{pOZFB_HP+k1Q1eFm4~Gcx*YswS77)AR7ewntEun{-?k zbpGw6LIVx%j)+J)wC;dcukzLNiNy2A8uc2W<*L+sIA5pa_bV>uMD@B)x>XG;f}fh3 zB@Wg{B@GOy;V)d$R3`uujE;_yF4jZqL$;Tg^^n+pnZ@le;gAa4-*&JOACF zF`sVmuCN}Bu^f6Ios!ZGv(GuUrCMn>tt26VwX?IMBLtsi2r$J!^` zt-}fZ#LL$yUwTgWsjIZB#4PqC%G=r&1qYv=?)AegvBBZ{_txjPu2C#-Flf%E+BMJ$ z3a04Sxr{r$5Rn~>11?>gBwQfeYXwHEphJ{7e2uzhAT%r=`Q z-H0xp{I#XXH`!WP+#t8N)SItaoH71a1hq5Xy?>wZdxykKTbf+)qT<>lw! zr`pa1QP^%fy(>fmxqMdMU1H0v#WpvgiKv(Dcf@MTFPfT~=!%&g`0VWLItr7!%R{*% z2S2FhUZJI>&4{#D+>fRK{3FNCqFp1y&?9SL;Ds~6vOVn8qG*0nci}FWs(LFOy^mN_ z6k?o8jkpPLt#3VRN_#2VPKFsA60&10o?C>igW72|@1hHHs}r|l7!V{!SQOq%fyskn zOb?kC@BjPpqxC%1Pv7UHO?L3MU-|oo%r4O@FRT9cc#ndf`E=Pai$1mK%(!)aNG2sN z*PSOOoU32bg65dM0rtQoNT*X|3mX-`7j!Amg1DtOdXUnpd~~XU&8jqv zp2b;zNE3N4_s1WlRw)MJu-R*Ou!A2X_;f|6 zn0w1OJyad1N;))@13yj=RY;(2H>Q258YtF>&u8c+7_0hwaDTQ2epXM2RO#aG6Teb2 zx+$9|K&Vr~tnq7g72s`6BtrY{xklk`5pti@%|nT1O7PH6FIRo^eV%N*>TkiFm!UtH z{h|nTv`Ffg4<1kmr$1)a@IXz=59d4Fk9A12K4K9ZwM;ZHP7WnQCCL<9s>$VFvHihf zX@XcoQkDhkE=xWC`d;1r-7vgJ9f#yBzk)=_ijcbx&wF~!N(ud#zgOg7CN-YWi$xz8 zThPDBu*-=ev6hRsGsw7}6{p&LY^?cMtxoH**P4cSW3_j$rLu*poIZt!NC5!qZ!OHK zdEz6N7RJu-(uZ3p_na7We|$zyiiUry56jOhfj67T?Ea#jqU~+e=@WQ9x&xDZ>#B01 z53kdO%>PSeL%p9s6l$6^FkwOrTAoxhzoV58>w zc#eN1B@^r0A|Bb8h$B&Zu_uTb0 zJW08>xx&NC`&7A}#TiG+R7*mlna-lB5dCY!jrD3yZ}EDFTil1zy$_*_0hV-i$ycwA zd-GEC?p#))3scu-B8Ww(W79YTJ-|GK@?RhavWd|CzKTHnN#N3 zK!}U6&PfZ7UdG6y_M(D^6r$_e69XojGuLdc^e1r!E1~MX5 zmR3<^6R%RrJlM^lK;XvMP&_)nDx8Zt@R>5bngIiR(5vRgI62&6qNmU4^x;j7*qp32 zbo50rgsdz-05|%Mx_zn>lySF~FWAD7KZ^8IN!WE}HuPQOu{6)mn*SdCcFWr}x&m z?-fZd{Q1*$vk=TB$^kN?-eo#`r7w8 zcgK!`?lf1KHAHJxds!eSM7d^sk^_!o#Msro5W_yMK7txG>^J*YPelcXobW5+EFAXLmOp zv{jf%LNYR~-^X>^7PNE-YT+b{4EJ`GOZxJ^;E|&f5`wC#s_55_uTu%OLSMI>tob7? z{b|y+aiNsq?A+Ac++m@U5NL_^yUDqBkPfA`{h!#WKd?2U@Y&W7Vkv3qQh44JKD$27##0GnV>;lCn0*(f;VB<&(}Sp(Je9yyhH5yZ2J3D?M-3a8`rHMGBg ziBZ)FBjrp0kWMms(9K%>2(TK%g9kr%{+u07hXr>Up6`;b{wz#P6Lgl7lH%s(eg_|s zxW0G1oSC@2{j%dwS$HQlYk^Z~i3*B9Z#2}kM52S7vM9U1B90PVyA+ydb2>SdrB z2?f{%6-;^3pCNJ*x|H=rRQ~oj@TzxEG^pw(B!qRU#o%^Wcm%YYj&66m+C{Xpx93=)F`-ptZXnMJN2al{aZt@%qqIJ%rE%YV z@p*!SMAACQ^ZlO(?iqda3XP|`VI~g{M%y!A!>NQ4KtkD0Y&?Ap&`?m+3NR@UMQ6R1 zxYX1h*keu6^s>*#DwypW&ki0egP!4-Mua2xZQ!lsWznM3!PvD>)O?S?tEcxxwLnh*#-rfuV2f%F<#{=_X{>E z_LDp%D%eDiWn^$CYh5i?2XntAAz#6JV-wuG+3JUhE$6)cI(hbRI`iGTyTE5qkQd`{ z%99fqgc0nU$V?S`lj=ct_Nx`Bqo3QjlWwPZj>V5g3zbtxa0m$9}F4&IlP5D?A+Fa_ej7vt!dZ^9XWJmIFC#y@-SQh&Zd zyz0h{U!I2_$%cXLDK!!{3QaJNSbZ7Leo|+&)GB9fi zx+cA}0y5*U(|@0kLC}OyY@#D{0%V_~gK@i_AM{3P(&!TroBB~SMj$`-R_h_s5(-hN zxc=ZayncRVAjj$Vj}Yw3*SYMbgi+F&ZR45C@8RP9xwf!;VA5h|`@|Qg%VJ@a)7jEj z;WJvHO-hK1V?ed!S@dV1gf|ZTnkPVh;KWF`>K*_U7D`aT$>}~kttedLgP zrq5qyD9XCI_~e*&mj`kw%6_0wb`<=CGIs-Z{T!48o3RRe?O%xo9wA>}T?V=J(QuLe zXq`Jxg4qs`Ov67~m>Hg%0wD560Ly~%F#i1`zv9Ku(BR-;s~1&lgM4)N02Iv7hhrDG zQ5ftvC0J?Hy4cjXZ0MNk!f?ZcP1d~XJrB*{gfcZVLosTUd;&XU@g5h9P3n`*XScmx zzT>$t&ZGxcB(78LdGljAuxWUVTk%jQBIqDcV5T!o{wVPVI8wRSu|tOMxjRUgs8{=y z=Z$fAy=z@`0IIvUnwJ?9AKwOZ(5q?aE$!gIT{Yow6~lS$7kgQN`UK_8VT;EmteZ*D zYt=r#(C9cs{e-)Uq1OT)wtDq_YH(PX$>6)kbtjv(fN07rhZs97l`PCQK$-pX`zQ7t zP;!AJI;?!Bh0{-3T-Rze&yxr?{=;&@zr8Ra`Dn|@X1I8G2Fe&=HN13GYASe z^-_9=njiDWR&`|y6}fnQ6by;GjG}dy+A)j!)}BSiyZM1mo{NHt?r$dlll2!C6FbjD zA>3|W6sPHyG!{$fZX!e0on3e&QKFDsybbzo{?nS0!j7-sV?K7jDVM*NfdbZxnD+T| z>_Ht7Z^(SBx(=MEfn?;N2om#+BV;CKlj6uxVqUqP+Ltf1#e=GxphPwAAFkyjW&nP$)P$!Nx1CGy3{TRx!NU zy%+ILcVAa=ORYpSOaClORBz-JoOap5rAj( zz7xgd=X=MC;blh}-d>v>&5a#X-rOJB9`pf#)(755&)EfDMt%zo<4MTd!)U!LKTfkZ zVvOL#=;s@esM@>23q|`DCC)F(Xkb@Ud@!y%7E`t$FMCvnRk&M$V~;oPmkRvvMn)fi z;eS&jBSYpt3kHKi0+XZg7nv7-Z`I_c5eH(zpetSr(TCxoNgr;ylWX1K%JHWW5%CUv%Is{mzYqAm`m0@@%vK5c z`TAzV{9LPx(SwT{v~orZX)pJRYI*ME7Nw)t6&K5uyhPXHk-bG@>3G|+IPV@IF5Uzm z(*&En#f2R6@&I~SnwmtKY6Q-DAG`h$FpWMMFW1JJpd~;uO}wiqw9Ad#TYZ3ZRaBWJXN3Z+~R6AK*_xVht-O>+?8whQ0QPcxt z-`HHy1e%4e?V@4qk=T)b)0&zb!0kA=yBrc?*sfM+0*Ic)B*ODcA06Fg>6SXigZYB| zv0Qtv^QG!d<*9btpjsa@smC2@EG{QxKu@2nIu^TJ}y5= zA}{(46iFNXpd6-ww#FlK1qbx8xvvOG@V_Y|EMf}(0wu~oYZryVWLZ~dViLVC5U*;6CccX-BpY0&Y}79t(nqbGV!{c? z=t)|L=)YaJsQeViQu}XKO0z!omW(Ic$S}zB_`4FkXOu~5>$9%?7#0#zUDRG!l-6tR z=?K68)QA5HpQDU64r7E3P6B^ny{u-)w58T1FWb{}h}5Le?2QwsYp#mnNeZU#ziee;Gux#Nl1cj$N` zR9_eWJscihHX(`V$Wb5phBSjb|2Aph$^1!*NZ)fcW{rjwdNEiwoVwTT7-1A-yn_WOc~Dm$iQLd{aN#>R1{`5Km(p*)4V zy8;$g-8E$a=3mZcpdnAZY`IopJ2_Um@l(^VjZAH!P&HSMT47ZW<<4CtVSD+)^Ok!< zHwF5P#tDDR5%jT8M3hB(3^VF>3lGmpl3_a8MvXl%YA}*G#-;#*O117dgP4Eg9jlmA zL-%#`DXjG&nSbY=7B7_~g{x>K%Q23M`aA^k^I@t~} zON)z0mvyZd!$peFWs~{s>DYBDW?F8DIfYxUe1D4~A}CG|9AyXmmqdQe%{0zGLg?{z zfeyi$we+*7Li+tn&X=`{ZudF*wE7fXz1?=Zn6&HMkie3qq>jKtP@6->GAS>CbZr8d z8j#yysfnz|;bw0LF%#tpn|4`XNeLI2)Eyw;V`^19FdR<%iX|r}gF|{T6D>!Pp!qHWWjB=;`sEJJ_zr(--HO=1cNtO6c>Q`{MQ` zdpz%KuK&pb99$G@dR1AhyX+vhLkXvpgSp1jGL^jl{M3{#8n_Lj3Wnoy-y-n1JkY=CT zhLIgW5Xd$}1O(#XjXVcx4SU2aIr;xxw7R#q{ml4P1{+ArEO>CA-y!K25YZC2mB=y$ zn%BdEAI@@~qy{+;oPVoJ1%lx}_)(ju!)I!0>b~tn5&&cV$_LgX+t~+DFdIiziHW4} zBk4+w0`(9u(K`;o3Pge{=(IVJ4BAPV*YU2r`5Ay!;A=Sm%E(Nhrm(fOwQt_M8ON_g zIJ=zb`yQ4k(guu<_qLPSds!-0wn;y@t`paqhZC9>c%LVbJ&A^opQ0->*GWC?_7K(&@g-vNF=&~L> zY1`4!k=Kd@1tJRI@?f>21qRA#jazG*5HS4hif%+o=J@^??P0N+4tfUEzL+edyT^I* z0r3wdNkTN8LY*QNV)C+M%ruPdbg+#?a1l!e;|Z~aA<4#4i%F~R_W&n2?hrfw3b7YX;^R%#lo4Hct|u_{i+OC!zwSU-W3n*h8q4*wrWZ|>@Az);ABWD)9DQzH2B;B_p0-{0( zR>=daUvV{!qy}#O^Bqx+a1zdJZS{k3D+Nom{pU~pQt20y26dGhTj(B2B*}NNBc54e zi+ORd33D*8NM}d|?;$T~wl0^QJ^gU46w!jHz;ZxXlW3VBtjzx_B{o@buxV{?mjhM_ zc89H;{tl&>Pa1&Ta+`5pP>E(%`IR1c>_0~fx&c;+rXr8f0BIB<>eu?(n6q~i7LK!d z9*@U7NHaWu-KF+O>py(yFPd46IDfdj?2M92$()7%vw@zf+8b5l0bvw2!-ljEAMWk$ z?z)}sbXX2#=mED66;?Txqd~ z@q~E9%qWN~f#CpID=%mupb170ge%^{SptkD2v}1(I9{vQuols7#-cTeD4CoOV~ZUk z{4z=ZhROA~FOKB*88r$P7I|*cjs=VpaEC|uVs7|OP&97VE?-+Fx{$!t`JQwGkc6AZ&ZGvg!A7WR)rd;<3tz0eIl z7Jq^K-p>tpV>hy+Y~lK|J0R;swq45N-2T)weYHOM!j{uD6pH+$%uYz@o54h_WBOrf!o(h`n4$;(Tp zUlay#rLe9p@AGNyFI{pCQA!Y#yHXtX_G-zufRXCi_8hz2zRu2V(?dD;f0JpttNV7z zv+_CXQ}xga$uHy-CKHJtowC*5;d4m``s4m0qev%i{+5{0hf@OV8Jg=F#H!o_(cr}N z*C++yb`5+a0^3Jny?5C*R3jU}nqd*CGFE>`i6+9E_$2AB^0FY4sHg!A$NM6ye-jxZ zpj)Bckl64_J@6|oNql_R5q<1J0%v)kQ>NcpI>QUSNxmGz4MI}-qf3o zg9qb#y*lJ!Dz=d>(X?T$VkIn`&&d9xO_uokZ4>3U$TK@5|F!7#sf84YlJOnRO-K5P zh}q>)LTh{1%Do7=1SMWAydMt;L~5gw*Sdt|@_WkN1^vK7x}QKQi&2Mo5O$)6AQX>b zQjU;e>M^w5uErC)9p+Nr^4UnO;3JwTrdb=@>+ts?d|`MrO3#{G<8RwO6Mglx zz~Zf8l{GCBevSy^`es>@OuKiIq_+867wjqzMHE@|6R-47?VmQ^n{&BTda{!VNE zX-N2CvUl~c}NAnhF5p}^g$`gvD3Ku?ylFkIlF>-@(4+-96u_%~cG;j*7EW->)pi;$K*7%Y>#PVNqEe$D)f~ zz~NCQhl7;LX{9K^PtU``h;ln_b$FN>1K5gQN}Gde%fYhN10T) z{4%sN=s;LndRa)T!KoB8A%dp(bMJ_9?%T<}TC5A;-go(F&6Bx7-X3S`c`>s}Suh6y zO09)e#IPKCy$N-leM&51w{ZBb&SWYde6AoRWvaw>S;7?aB<1?WOxr`&Q%23#jyQ0- zu0e}ltpc|l+V^)@v=3&aud;ot8LxhyigPgCz9)0^O1$c*w%5{Pk zud-vJeQV4nw-$j18%Jk4IGwR+;0wQrz70L{@n9Psu|LytU}|w1sWP*M0r~(eGCd;s zg3s^pSrJUwhJF_#ptJazStQdTUKcYX;qW2jCbfN{a#1Cq~KJxphNI7w?l^Ev2tKTJ3*z}htgU)L+KLRNkM9l6+60MCo{-H6-5&%LxD2+eq#vwM^3BFMEe54TNI7C?{se0MhU4$rjt!KU^ z7Ybtg{w&H9;9%WPLCF$G`ZTEz_6!}Do|;wQvD>(uFBRzBdI;LO*y%Pla1%Pnn68hM zw(MyCi)1=`0c0ld0|G=uO4=cEI3a0jdY6LF)`>DUHdgZa^Lx5gwxBvv(}S1~2%F&c z?QU>g$b?+jAcJYPyU=x$grv;qD;6$-tjYUuvIB5zn5piUm$YC}nSu8DElq$pT7Ftm z^~sYaAOYmurg$j&B%i=$?^S8udwa8HjU$rg;tc5TgV3FP^3V@<#(ozebs-|MV5ff;yfoa4<87uFvaMA!oPk8P1su$^vmY!9P+nRu%Ast!2n4rt?qF6eNB+^&2*dQHp#U|fIQv)K9 zz_IPuM@DHz|9|tI#*V1mE6PwJ1dGcB)R}{=X=Phm4se7~?EIIm-2kK#GrSM9!4mNp zElvEfBmky`!)YzdROBh@X&idkAr&Vmy7lW5MJD`Ww2!br$1pt_Tm7*%?j#8dyO7gw zA~nYJ)%6#ho7YLNo%-$7b~Yde&hx{E(xeaS>p9Q&+=|@3{5T{%*!y1zPDedEmj*C# zRUlRgZVJcWZyg<%`8~bIP*E^QP`ZKHhf-6(iu=pp827{6z+lR(;|V-w*i!x%Sg3-Qy8vVS8Y`iEZ23*Eo^(J%?H;S`dfC)tFxW`sVthhBfM$vHxrC z(f)-P_&z4zvmTCYxIjvHw91YKQq4|Y4dDFgRM}n=|Gy_Rw_zzD*scfc+CMXsCL|;T z<@_%H1z%xzp%V4RJk=$DhVqX zwq6UNfaCS@{!nXqW#z5~fc zVAIvjvcPj(2~4{{{U#5@8befso0>>wvMnBjE5yq!Aip-Tfc_P4ZX6!o(U6C)itI*%4}V+YxNRKw!EE(YSFh|GW*7I(DH0XV8D|-WZT6 z(X$b^I5H`}Dd4Qt>=yXPL5L{?@H7Z2jkbkMzK|cCkvwj}LliFm;c0Z^Sd0%-Oz=qH z(m~|->)<_ZZx5dD&@OfR(8XSgnfv3`zlT={oW~7V3f$9IzarcAJ$^d0Ql;=6FM&B5 z^{#dIV3<;LUxM^UD(agp_}Gr6JoKfRUHeYFxh&l1^XO+F8{(%-QOAvuzR|U@Da`F% z;}SggN(s^3=k2OcXD<<)!7o{ZY_M{$*+jpu{fKk8fqq?Et4spnHv79ss!AQM&Yfg} z>mNfJ$I}jsT6;p3Vj7H(guY*!B_=%QVrteqpeg`E3eEoX6xhnR?!5kSYvcu@U$jiM zVEEe1g1@i?A)}k1iG6lVF3q;9KL=K(QBF@9SNY`6v(1TWVsE8Xh+CrkEWPy~kIS&I zzn0m*;hKn_gd3^H4DSqAy{$X4BeO#jP7EsDg-%h+VeEDsIbg|Sa>9cAK0 z^@ea=>^O0N5s4P;HlxiD&X`=*gl`M|Yj9&k(ymG=m|nS&Bz%s4grS_t|JBL6Aw|_J z49)ScOOQBJJ|_;d;iXUxe$o>#EJDuuo7ht7%ATK)RMNbDr{j)ms^QNA3a=O?BW_mAcL}9;{(|43B zC{1(x7Vb3=#Io72kJwZ>?&YhU5@^L!B5FK>Efcl$S{1D; zGcVpoyJ8bF;mg82XR|7aBR{Lv-a$w2BLUj{!!S-1IbSBS}4f?xQH3+TCXHGXJ~9I*7F4mNfgP z<6uIf)0q=YRCpwNx&!8=x3;@`@?v>zM=8Yk%V^o+Ux@kyoXmqy$TOz#KW1X;$hB3! zsB5>4Iu+I}xcxKjo1JY2m< zi7XcfqS}e*I+ZcD$7l+0bak@Dx!ukvU(ae|1wx0-mB$iCrK${nIjLXlrYCDKYgD4y zqOIw-(V^`41?vIx^3q!+S6*{y4))~~w)UHwFc|HX4s2cg;S%UmE{tQ5|Mwu=jp@{X zN;BEVKvbE>noef*;%T;|xWLjGwb@S}?Ku4%@BuZ}o;uU=V= z|6nI{?vN)?NTjkA;>D|9x&0FCL)r;6yPgPu$K#S#lZt~6RIs+ki(>^Ecs03_QmX`tJ zJvso`d~K1mkW57->0+h}chR9J2PVk|)h? z0CK;xlf&3(6{m+o=H&zRp03JLY$_1TgYYjqcMw3YWWZ|Q;XVve6sO&M{S;bavAr9l zm-=;@$OT)H@&`HVayQv5elX91Ad$dVmN6v_RrzrL~t-X z>5M~w57&mZzln=e|2^L`?pEyjZ`H|ZHM3&K&Mk;DsLCFllHPbw-RNB@k1+Xb!z}-un*Pem_pw;Ljg0gZ=I?BV+z}Yi7`}-$Rm=|Kc5c&EJ*Ei|f z2LD%V_*wZVg4f-tv%*dxJw7^|>s z0b&7FLj(8WSnLtY)?*bR{h}w~5Ip;nvec;$1NkTRMVm#3`F9&ovJvdEg&mwet)LQm zsAF^|@7l!G3C3m`k<`jLxU)uPU|^t-#=n!T@jfjrjc(kwW|a}#rFN*L5b!6#8dC>% zGFLv)0pi(?aH(qum@P)b>8`xX=EUPL5_SwS@NQAs4ahawkS_+6;1%Q}WX^pLHie4{ z1TW@~);u}x1P6SHubqq0&0)@cYFq7ZsU0h?U0pI#Fs`}Zu5dLpJ10lP5Ux3iPid8cbqCkht~T}Z zO`~p5Y1O)XvX}&$*5gXj=@8t##uA5s;m*N@afkoIsh`O}$1{dG62rhh?q7q5_BIgnoe9VO9SCP2U(SfX zSI&&=S@gfSU@McRyGz$Hr}a`MNpx!}}BG1q4; zLH3X!1YY}`(wd0uc8w$}Bp(^LPG1%O)z)lHQe514X zH^n5FtUN{ut9_a1Hm1jQe7vZ{G2<2UKvtxa)Cyh&Ze8n}S8xMrOKM%U7quA}6_WfQ zos2pnKzjm_D50dJgvg3sNGKJqzY-A=J_HS51d{fkePtj`3pI;TYhyO3ra^L2$Ptd} z0vbV(g`lG5v}~vAEE`#HdBytQ^`^hu8v8e&V+4;&dlncCkbIV|b5vV39d#mJk(tu8 zq9-$o@-N1j;t9G~T-vSgXIM|VW$b{Fot-VC_ed8g^?X5L5ewHR2avoC;?b2+8#ZH$ z8>TOge0I<9-9zJ=jn8bxiNKQ^cQ9H8ArZj-ATdN>?x*siM(Qe1o zD`YT3ld@lMl5qDQK3{&>tx8PJNoBpl`CUvPbxK?j`^4`7-M7-Zksod%LOD5#s~KDB z1p(-O-93dlql#g2l<6N?ExTfq6{+hsZuWumNez8(&-d-NIW?X)J|w5wfnQywm}hbl zW{FFW3(d+I4?Ol>4GF}vY@rLf%$)xo?=3TfvSAu3 zo~iAO!Nr=quP&V<5Yl)R&%(^y^aFpcuHMaP;7nI7Ncy)e%&o5*uizMspZ1r1VCNk+ z;opnf-17g;Eb<(8-JWd)=XUCy27^2@x@LA$$9i$+z-wBC966<30FGtLWo>!xifrR!UD0zcMW z1v6FSU!$wBJ$&|#1Zv=DH@Qlx?`BmYj?r*z|+Fjl7k4jV2{ZfiQwY4w|JAI3DhUK_P-b%}A1>9)d-JP<{BW`pjF=jY6f%fH#^E-~h)7;b88|nCN zwzEBpSM(I_r0OEoiH|Ve`s&@IF$w2SSI+NNKv5(X6XR%O>zB2bas~rSCJ(;`bQqI1 zXHw$3@e&d@#5`&wXp_;xrc`A<|_AF~x zC0oi=m0m%*pCHx&jH%mIdXd`X%RpD!z<_bClgZt}q`NN#N_5z8d&!%A?~W8Q(rv9z z=`T{#spM)U#IHNyGNEyaSuYu_fok~MRs1lev~#wDVri~zAcv2MBwJu2go=v=v=esv zZd!E(G5Pbhn@5vvCK11AVD6zLW#Q#@`7%Tv$D)V^BRmKA_X$@5-q<1@=u7A-k=oF$ ze>M6Tdmq~+LF2=AJokNVH|pnBfzrGaH%ZOAKYHi>s761462SqcB6}xMi%S;aOY)MN zO^b># zzN~*c)y7uPajT=0#^dOvB(z!}>M~2YRz?4jk5{wf8ZU)>xnk~*HuT0wi$>g++(wqD zAjt6&mkpbmsQpQD2aaGCui(va#`N%r*AUt!Q<+b(MpVYBGDxDyt)Kje1;q=DUg@I& zJWJzyTyLgGVw5te*;PyuyB0aZ1jLzUGV>7q-){7}M)BvWSEH>X0r9#K*{NQUI^30m6^V}2y8!(2_OZMbN!4#(Nmuo|cRSN>X zqd9Qe{iX-3tqU08QHhysU3@{kO9Z%uN_U+7T1ablKIE!SZuG7-kp+^klAk(v;W-w( zYi7;u{+FOkBVN!C$5_y3mut9sW1{(4Pg9p3$1GM@r9EqIi0%==^U&G$FHg!V7K~YQ z)3Q)^P`hdAOzFw`FR5*l&`fRCN%WejTu4;H@v>hM$cgDoSQJ9>4j5#-KYG0hu&e2g z(%jj3J-ak3dT%!ui$}gak{&;Ds~#dFBH)$hrFGmVRF~7Zjjl&E1TRU$0R9|~d({!f zZPZp-?B&CvBvh-*w(+VHHZr2-%IRVZ>a89yjZ<~Vjl*_Q09#$4)$bvf*zzF3$mMm+ zj|k2bhreHU79z|FHGfn#&o3fp+!0aj*SLq|*(+4Lkz*)J_j>fu1^@EW;7##B5sar_ zWi_eZ2M^`UvYOuBW+Olm;P`(8`0gu;FmsH&%)mF1>4&$)XM&MGM23IQYj&%Vo%iFp zw!TgoHG8AQyhwoNo&pJYkT{b1+T5AWw@BUM1B45vvo&Fj! zpSjbVdz>JEkK;MkUK~SUl60-^KGQb^*3=Jj%z5ao*;ne9(+=1cj@?c>5u5fm(hb?{ z#u0kP)>Fi@d;3n*?Bib`xAi~2YeLtk@8?SD9R@wlJG80%LU{(U2YcIks;a!)#hXZK5N zP9EktekgmU{VOObDaltby#*h=x{hr0lr0#%*Zl6AI6gs~yD~kB@cr{3na=dtHU%lC zzF#B0@NH7_N`bUmy;7Un5abd#VKw|z((z^RjSp{9QhqxjI?%McuQXgb1#g5m5laYh zO4k$;`vZr&bXO@#r`Z?bb(=3ZF+D=h2YU3^RlI_@w$@hki@FK1(l8wOz3q5SqWv*= zA7F+nk_7$6ikJw(%*&K5h${%#m$(EjWFNEcHg8bN!D{x#0y8&8T|FF&68c@W_*+Ac zmy=DIT3B+^(DJST(>Re=>-h#Vo~@?AfXn;5-b%7p59@v-TfU~rls`Mg9}r!aKliLDsSRm$UN#xSi+I; z%_8pthnUf&#T;af{j>Gur7q8VUQQLI{=|3>+KjI>bIin*KV;1W^7p1Ul`l3Xrnzd` zXU!?iA?JRiJVcX|MLbug7!hEr(QS`Sl4^4@rf_?^x%GF3_}JEoXX;NIhy}g zR#J-J4Cep+?GNd8PjN}GBWBfREKK+}pR~%c!i6g^q|R*r0-Yx$?AP@2s>5DQQ=6El zqubw_p7syaNd0$G_*-YClpe)n%fPf!YX6#n|2Zycy2s^+kaf`C^zM1 zHR|SPHGH20>g$*i^&Id4>@vS>EP=>6DvtJde^n9?FzQAs>T1{5%QWvG0}aX8S3o|? z;g*kq*N!yYD^)Nux}&0^GE%uQ+Q(X4Cjr!L`|uET?FyWeKWWKu&+6NJl$a7qzQM!G z0;S-iVdHsSa$gkcg*#HsP%M<8OLE)n4@EsKc=zW8wu94c}?TgrB_8o2xT zkyo7>y@a%kb{|us*iWzgKXkoiR8{Nu1xyGcAc{ygh;$1`BhuYcl2QtYpmZuJEhViW z0*CHY5Tv_ALPFw*3erfwYkU8{cZ~PL`{9l|uJ?G(-p_vav(}n(uDLEKu!fTdRuo!K z(Wt7TnK1)~b4qUb?T#oyl_IHzq?VRoEF@owv_(Myj~LZ}yAT2Fl-Va;v^dG2-Xt25 zJfHz(vNhZmMl*;OkiJ4hUJJ+u!t29QOw~G3Lrrf90_iL!G?+*&Ac}9W2|9uALoB93 z2*|TUCV~C&T1~Z6QdYJE+a{z@7zDm68UMRWg&3L$=mvvQ)(XA|ExFfVKf(n3W-l0j z5EFyW!SMgRKT%duKkw^&(snwJ9H0NS!n@v{%)%Ts)5|$6kQr_CtodZS52w?~40*t)#j`l|5GT=pLe=1+H2d zI<^r@DQE+H4=VQEUz0;)>8tDO(NOk4lOnLI$Pz$t=04Z#@$DHoG~zNcFa&nd`9uNp zzIAr|hdiyY{#ZL>$#wPTFtpk2fCtZ3S-@!|loVr?HmYXe^%W_)i=y}!m(dwms7voK z7np{BT^GSOv`RSe)xP`2?jy%DyV!3CSO55S z-s~xxnx*yh&o3paDk}I;(T%m_p_~kmlhVjoJserp&QGkX_Le;C*CQOfQSVs%xt@9sQn~%2KhQq7HdO^XjQ-i44yFy2s3D*Qx}2R z(5C*d%W=$DSy)CuRx2w=>LJY|2fe|f{wKG=^n@pF(U(hAH8wI&QG-2?#wzpU)jJwb zuv)M2;NVg)4%Bx0bQWk$+K;RjfMEe3Hyxl#X$K@gNkd~5mYfxoDA2-}XebU#vIBZJEddLk_#dR1?SSao>kd@F^x#nZ?7P>?w*-uI>iyD^UN}JyKMpM^Eu-= zO8_W^0rFVT3^*bIXO%qdT!m&>dzNVhsLTuXi^wc3EfFRk@Wu+yEi2e@PX?bs6^pnd z0ket7H>}`A#L?(U9{0a4{C>S3=OXf*00|+EFpPIYUC@~xSso^_Qb%my5Y{?0q*+Gy zK_;M?_a69j$VY^y*x{6x8ALy-s_MZI#wf(%zRVRxAfy@ArTRYT*fuP!K?BWQ#>C95 zNMSt}6A|%5OeOW_Y=a;i?|g8sH;rlcs(}I-$mKsEMkewQizI3Ouf|Psx*eiba+aT= zH2BMNJh#B7&#TzuUpuRDXwYiS-&UG$kLMVY!TawGXFQz+-Fw+VgkZ+gWZ zOb3aJ>$~o4760#RnBttcP?`Rg5sZ>ODc`uO3N4M^HGI1zgj>0Aa$sE`*BQVj#BE-B z!TYPM2lh9of=3JQC_eIUl7=33t`^alpNT-_;&rrZ&zoPBQUe;VX^7uZ|20#Gm7;mQ8UICWehOy1PJ7I~y3UZ&$;4k)x~HzQ_uY zz~T1V^^2K&}F3xt8>!ju=)z`zqOjDxt{d%L1yZm6!AM)<$zmUZ#N^));Z3tDc%#)Q)_* z)_f~FVTy6+1Xf+dfHPs&SZqbZjcJNH(`gg30C@^0!ube30iHw;mE(9Y@OkwQ!x#Nb z@iQ{+;TvLMVKSl5!{e=K(%!n?p7iBq^>yqpMPZ-WEv!yqAC{3lQqed4S9IKsVwABE zaVc~ney~uFbDvM*X~hf;JZVg!)Idvomo~h*AtIZ2VL*M{~Ek(N{J^l0`kstx0TXzKmgCtJG*#TV0G`iUMlWYQr=p@4V zLxGpM-rxxEq*1xW9m;p8uQ}J=@mQ4iVD2*pE6p9u*k0y4=6PTOr7mfOY)%qJUwmqzea)hy% zS2{w{K32S4Z5r(^PIQHu9;Fu&91L~?&5>pS5WwZ+uh6MM+YREB2Q<$TWZ26gnpb%D$fJHq|>lgElds;UIUQ z2k5v5d~>?{`yW7pgS5N>w#*Nug#Xc6KGO`>!}B2n!%k4VB3d>?3XBv4P&H8USzth# z#Tj=9X$n#cfJfgj7&n3^?0ML}Lw6h_g>^X>lnTat;N>dkPhI2>#z3Kjl!$8s2#?U9 zKjbdwMT_6W08P?z(TLTKC;i{Vu8ROfikYijji1?ueH|@xc+{ z8UAw2U7)-BSJkwj;jx*yTV?eUc)@X4$H&JrLlUwqi?o@#uGdWVg2ItiF_tdr^=k^F z#;1kh;kO=+Dry9MFlPuHjQR|hjqe%FFkkc$=Ed#$t zUZZ)qvbx#}3hz8vh;86xyxxODlI|I}U-UtP;RDDB5rfb`B)^lVOMvT91|JC<_y@6? z0_Ve*kOP}L&hQx2=B%3k@cC&9K8NhEII0;(_i0*WN148_X#K?(rJ>`!M#n4Qo>VP0 zFBWj9^qk3{mvwQ=)zPLq5-pbEFkK~QOlfO%`A%nbqIo#~*%CMIZuho!J zli3_6sJ~kJ5N+Ggt-2X*C@d<0;bEFN0oo>9Nk!!)QmKuCkPz6dWW+%h+)zvycHSu` z;1`dT-WP`*+fd-g(GTX1T*y&C91r>CB?cg0w)@SiY@_q-Ie)$efuJ%{iVpo6AJ@Z# zoHno9v7^U~@@4H0`---uju=Dsu+FZ&{mmrTTM}l2;&J?dzJzx5B?Iv7aTKqoQplm8 z8H?JPZt~y-z6<<(#AricW0t!t%F=l)6U)lVB245wF!VT&5kIM{Kd|E1GN4T6>$Hga zwBi~MzFdd^w|HR3VZ4ACu`NN&6`>K&60~%PP7(ZzKUb+Cq{=g(VU?AY;kK|0D<50} zbI`X?P*GTeiaW>7hn<}rEID*Rbvh)xbAA%(rnX)73yr=g18h$G)XRhq0!km#=mIgH zcl(^#Unc%OSmQgcQ@G(?HBQ0vY-%@}`oTx;s&YV00JnW+22e)Vx;s#X8?xx*!^8Nb zq!lke5Rzi;a2Gw8w}Q8pMM^3QJZoNovvUjxQlG#(PVlggV(IXsQI)M>atA0$uf}7U z!zZ~b2Xgk$9p!BZ@$eSF-{dW*zi~QCGTChh;X&qr$Qt%0JecpWC08B?98-e_RBNph z;ynfRQ&960Z*b1xE$4-M$C;L%=NHY+sU$_CwMYN3E7mvA$y|8MJTBWkSix33`S`EZ zmYdH`e5;MK2)5m2;gE9yjyw)Yzo;a!GN?!e;Pin8N=?Y%p_+KG^}XYk{cs>u4a3j@ z3a_dvlwgP#BS`l-%l)Bk@hepDV20%Bby`t31I^jcF=7E7+qWD>FVxMbgQrxjQ+8EJ zcsSnv#y67%tDvfbKj7hL0gPVr-|vygS^7WEEf70bfbZ{4t@egzx|DZ;^} z2xHrOqO@U^YU9I!8Dek)-LcS=sZ$X^gx1xAH}zhT!FrDW;7W}A!PpR$y2$fv3bKCs z2Qk?n3?ako!Q{d?dqC*7n%K@M$NFE&a#I7Xg(~jo?BwD3B@B)r^2Xqa3R?Wzup-|f zNFdvi+}xKKF^d&|R&y$$hjK11d~hgw1W9Kgr58X{%|}0r-~>zp{}!{SF|fyXfc+&V zBkM%G&Y+1IEVbUl_6;Z~fu_m?s5#Rh9)cH|9AGM`&{PU)3(o&GPKZr2Y%-X3$W9XkZYd94J#kktz1a|^8gzeOVl z5-9+anvaN%rZr1m-&ej`mOPb#MTmRnD+T$(QYoK?@FdqryvXRq(y13}Z{_cMU8SUK zcn5x2bpS_wT4Pg5ih$nxtJKte00j0nhoUaLxC^P$cRZ;MrB;UJ%S^W<0`>*+%ZU6) zEET+Xz9#C}0B)^s3mfxS1Jma3GKl12w3>wimW~RmelN&f-t^!muVhOL-|;1$yOv&} z?&~!k5e43c%3alk0%PFDhUM|?UdPVfq`5flounJ>LKs+9j#<$$!Z@W1o4ugOV5p0yePaY_BZIw%-uWaIi}9cxk!;yBj=watN;#3brlf32RYb#ZFzL z>>rSpcFiLst|wr82)yVorEUSl8W7|iJs>afI<)cY^wZyi=#Lm0=UeNs0b$S^0uZ0q z1`YsC>TrC5nNowbm;0YNb?~-_z;ODl8T`ATJ>VWs({BL?c{ED*_%r@c7#OvE%jZ28 zs2vywBn*8sAU8!dkh|G3xXw0=vWu=vpA3!#1@Mj4B;*Nv^gk_twAi8K z;c@~1q*>aB^b!B2@@Oy#OkG}n0Klk(7Xmdw3lrkh zrlh9!xv!64rZ!bNKnk4T2*5)fQNh4T38#a&`)>w5zVg3anj2XVz`uXaK11$&^jXsq@)k%t6B{ zxjW(U?%Gb%v!YkPvQ2U?fBW>+*89w?7OBmGo1*w^Z3{%tt%W#(knS`P5s|$H3rVpo z&+nH?KkOS1Raeo^8^kw!bCx>Y)ddfIBh;@9q|M&8|MeZX4yYY4!LDxz=W%ZFf6K}5 zgfc||P=$DEEPQ&AzH(0CHRB3ozkXnC2)&@@T?tu9MyKKMY z`ugXw?lh9#w_ptq|4h#TsBG@Lg##BS1deOqs-BRZt_nU{NEEoPo@~Q!+fM;$Gfpcw zD=L7&HRQK;5M4|GAVzGBv%2nPrUo3YqzJ+>EOqoFm+4>)-0K;{#L~dz@g-z+uCQ2J zkP&;WLLg6)gLa4lz2GR)2MdcB zZA0Wm%;-VC!w--?f}JqTK<5-C*ry<66f}lNphI*+YEskEyyr6DkjF*bH<0g!6vQh= z5iWw_whIG17J9IG(~bWHfG3}ICn4BABJS6nkTM=OMS%_fO~CC}0fk=qee7zc1_9~- zxtUq#I=g8I`jSglLym%A01pI1EF=q?buFhQtxN03X+!6`c?a>gMm7|5aC8+$$OB6qm5P}8H$Hr>w~3{m%9NOF!;Ma zfWv}`=^6zE8;nob;*$2+cN{u^drL;tjrLV=*lYuy3$~Niv6468&-eR%K)Le(&I+7l zxZy@PU3!^gC758w#7COjE^k^-KqU4uHa6CGZ{i;G-vO`XFk4^IywypabqKh2C0LwT z{TZ9e^4(UxbonxOxj8IGGBlJ$gm(ioffENNj@P}^z{s2p5dUQ00mH+)VPn06;Jv+; zpH0STqP;^P9=g&4pJovdsO;~I2`Nj|UEE?K?ps+q8Dln3dJ6gi`W6L_2Pv`-9xT5C z_Jr)XzRaXf1LlGOcfSlZ1Ln8*+;{vc*5yjjC=o`}k3% zMRBEbL!{J{ebN7|X%yvOq&N9!J&d%-5NK?YcWxylf_pAz0vq!lOJX=W6P z5yWrrOzRA+RJ1XGuGn(4Lq3X3Czx@Bp%h5VA!1SDFj<-jx<_p}IjFr@kguSA+^mhb z+(pF1B!frj+VI;Kc0L*{7hgVtU2=_-G_OupE3Zs~+zB4!C`@W-_=ze4Z@wOA>e97H zRptGlm*ure3HPw+3(_rwS-~MDM!ZU4fBq|Co$H!f8(FlgBf@>RI>@(&?_N;`FPo0} zd2>iV*^qUOZ)O5Vz~a_z&=lqO|2dnbNH-6WMMW1{RcATkImpWV~0exr|Y&~x< z54vvx;~UnzASy%U?)kEIhc*GWU@x>4ZZWm;d}3JD%c8LsJ_$Dg^ZvZyFRqsj*n zAg=7%843#TCef4tQk0Qtdxrk^Nx<(RwZ8K!eYvqxNGB)ROs)KlKOT9ouE>62ViL6N zj{{E@((c66R3rPdwrMU7I|YSMjI4lHgUC3WZP;kX8NYmi64Zf`3b|9eX<*0lkRomp zaao0A-pj1(^XG1es^?l~-^q|hOQD+_a z08sg2057is^hqjkBmgpCv{3Irea{V4_No^g&Ffg}P+q}{VTYhFQ0~BcfOIJv8&iQ> zFtiHC#m8&EQMXnL!t9c#B?$;P$MOQ3(e8l(ZUK`gl|}R2Yj%;-!eyBaye0@DY>^yP zCOGOfF%`Vhjy%#RyY0O_8;Hy&YnlN$kPc+6!B7{(EEMO<`fS6_pIQ&wel{6^nBX~d zz8*{YL#4ZL;0EWFFLWV8KpF;_ArPiA_Vzy@@pxQSFFKSQ7uO1nsKAIaf^HJpn9BhM za^qGliS%k;gXcLDG)*ENtc+rVW>oNTtk$RkW^Liphu zV7>%lVx}r1+~xb{OOE1y&fWpy0k6-i%uFP$LEJXM{&*av9|;)3kT;|Qh@WuAx{r?! zIYkqu7rEl{d211P(gG8HlZB;2kei>Mc&4_ZxOp%ULg02rT{GLmY>b=gX`kWk`qUlo zB{E{(T8TMdb|-d+>5EzMStAT)Fp^egeY8*#`Z)D&ApCiGYluy`$gm$f*M1f2!Jn z1m;;Fc47xn%$#ax!jZj3hBJUc*}+{wKH}ELUAKTncR?S%2edK{HfR864<{Sf(~N?; zIuTH@A}%?Ik!b4?(ufWl4UNd|3r_5k2L=ZAe9gbUu6Cncg3$%@PA%nDJv|39@?cfN zQHO*~IKu~E3=ick`>POfY=HiT+$a$=Cvh1Wh$HlCVJ9jC=YTp0U{vTMxCmX08W1Va zbXsu6TZ0_J)N3UPp$vh^&aPXBbg~?XLkPH`EiKZ>gb_%(p&303APQ};N`>;T6$QlnLz3PUUL>^SO?h?>2!%sZq56A2wNuFZFbVr5cY{2KwV+>#=a@;1Rm)-NHmdQRfH6Lfh4RN0Gn@> zr6XwU70KPJNS2BuhtNX}4e+Ez;T%Q(_aMpBgq>7i3Q&*(fVWF9erW-|)D~KJk?%pe z0HE|m)Fbe*UO?me!T9ac^8KD&0FV*u9VFuiK}vqp34|3UA)%xzQhx)%0ujkaKyV^a zcZ^3w#N$Hnd?Z(~3d9@;#G#RK`x7MLhE=wg!8*$Vj0Iq-22#l*ws9~|L-N-*_ZcT7 z*@b>!1cwH^bz{xp(F7_9E&W6A<#c{WB>4_Ft!;t;Ispz3ViJ;eT}{cAwVoz0j3@w? zWUwOmJTw%G;1UQv0q5Ex8tpM>tz(!4+Y|2Yg_RBG!?UTb&Hlnas2f&!auHhCS7%ns z?A}wS2VjPcji!D#ZG8C_q9B5VAYJeXLye@CV3Y@rx`)@C@}V{11O~HouDdV6D+U-z zs;Jw0yECNNnk@Y$kG|FE0>;4tU>Sx~wO|W808^llo()j8kArvF`1m+h-8#EtCb(3Q zaT&HkC<2{KD>T4>9mLM8n-}?wuFg(Z=r}*)0WbDb#O@u*MPNM4DGvHzYikiUggDqu zGs97bfW!!36BQL@MLQ3iKKKmYf(@z(F$9?d1SQE5Xjs_3G}>&@72t8WOTTTjK%ns` z{>RyVm+Fs}=sXuN;Y=aeZ7$sAgvmSL3GV@XWmt*<_2Skmg8Hb%lBpN{>ljN*Ho-yi zc-Y_D`lm-9HWkBZ%Ck0I^NZVVUPGa<_aUJFK&}fw{wq-Sc2^3K#N)T!>$PfSVTkjH ztu2_iX1~B<;cmnB59QE|<5}=)fzL@Eyu#QQ-3WEVc**Eh zJ*mHD|LV&nQiM-g{QH#hldT%e7lC*r=qmzUkG?GHzsYqHbOnZCbS)fa{i$~S`zmNH zs0%d4vRcTk=c|Gpbs`_EWKF^EQGPhL2FT1y^~hR|pZ$K*uH5t*o|B9W$ARq;;I)JH z`M4B9RcDO5xGIdnOj8xI8BRK?7)%L1U$YE58WBS86H%22A<5OJQtNb_`T4V){diuf zUq^OXn|o6UX>6J7Ecw}mXL%faeU-u|BTf==3^f88m4w*K-x9fJEA1IK%@lI1Un2@;H< ztQWp~b?)pONb?$A13M(S)cn6>2_7W(v3aQ?>4~N8eAT*7@q$0;D4Vgb^2}jo{}q9e zBG==TZv~IAb<5Osv8Zn4dY9Ph5!k<6xqlHuT;#>?sO)aBeO>20G0yuA$5)b6Jo7jx z{G#+pNh%b0;%VkOTtZs!y2%do=S)KP?oHniu1-FhtAyr%y#*JS*}q_jkB(6`KL{?| z_ArSt<_>CTFm*Pnu6z5UV(sN3{u{Bl$Z}1>c@xy$?6VPAQy zV(M2KT8Kw9U;nOcaZ88#w%puni@Mf6+>MK?LWP~?Imcyo-C-;taW0TTYj ztrP6_7q}bQv=7ZZV3-Q25dsW<6UD!f@o{rO@J&9&nUr1JVbj>*86NW2PR4RdULjmP zCT25c6bYlN#_LoxjF{nQ-1Jn&GS2W%CHzZi*$)uG>?cEVIiI0KRQ+x;eUcV@ExXX6 zNNBn|g)nPBmmAFEA-ylx?D%RPzgD-^%-U_{_otg3J*H^4!MUp0<~hM2zt#iX)yR=K z!Mt9uDCKy&OxOI1Fen9i8N%{vT`F044iqs7G1QZ=SA7#UOFdOmrmAc zA$Qx>|CgkXE^-0TP*L=tZOI0|?Lx2#FvmY*sas^{$kOlRn{T*Ys_O_%9ne@oeh0-v zJ7y3O+|?(yz=FM4b$7rte}_$fM7}t2kID2h1D_CcW{=IYy_y(FU6o9DB~_SQLkKG` z_XTz>$qq6f5{-j&arSBP=5%}jky z9QG83Ua`jwZb*_u?&Hx0y4(Lr)j{FG269=FPE31GMNRl1KhLeizn&8ZRQ7oTB5t?E zroSHMD;CGibZkDhxHv2|&xQFNM^-a{jSABv=I!Fioz=~b2g7jtddg!2#2mN#QUW5c zKII52sv>p(caF=2Pv(e$YZ=Gyb>2gO->}F z`10W&(+_seBI~=o>hNXo)?g8sGkQe2bpIQS9ct+%K_cVXT|Ry=I}2`9bMP>Fo7IA63KeYm&dZ=%V6vrk>>K zCFSHRau$qPKNgPUg}c$|Jjw*EIQp?E1+} zU%FXdwO=P(>hZxV;J3go^^J_+mtb!rkr8@%?vAnl@-}^1`zbLf+vGQ165ycpk43pHe7hyME(Y}@rXA@30A}720d}c z&zRYtFE6Vje}SyCLzSGonM3%Vb@}3RpFti4l#~5sUo%`M2vrsKBL+bk<(}8a|HjhBHjSN7hsmuIkQySIHw ztE5MvRO*=Lj~x=_`8#KIY8N34cQQnm$%)NH{l!Vz?8I@c89cI~c2Ck4$Wt*$UhmL8u#9OK6J6bB znOIju&BSueqzf)#a$VpLZR3%%|Fc6tu_+*|_|4xidAL_R$=fV-+|{N%uQl75%RLK7 z185a8VLE>QQd7E1PZ_1w(q&woy0jV7+%6Bzr&5uQ?o&Rt^j!Yh8IJBUvwx zyEb`^u5qb|=A{v&;Vk>D*b$t(!nr80gWo7aZ?_Fk$Ou%(G?9kv+;V@V7b?6a(_bJ* zTyq7XsgC3yRrWj%I0AbG)9nIJ*C?A8pI%4CYKazcIqMYi$bQB@OrUTkZGXqY++SGv z&;#0l0qY;B*dwr>5zhAAz68>M4r63M2MG8;%p0+)#iAJS9(4oEq$5C|;5r~Qxe3I- zIBmWT(o)$;p`)Xd5tFk$l2z-fLa0kzJ9x<^V$4Vd*tcKhPSnIMMfy-Jt=z4(ELEHlJ>zJ~#$MJpn@82T?zT4mxeEb}!^;jq?FiulfDO*&i z1}W|R-Nh935oi`1kfjjEuc2zeKkX+#csoF+r%~7OU7p>8mg>3$a~si4Qm_zT8LnR$ zrN+ZKy0_0tj~Hl!;jcD~T}7t#g7Vs70!2C`eJ%lnC01)!R~SN~PrV`P?d{D0zz!U? z!+;(nZ#V&2Zg@=0ezO_0cLPcC{go;YCNj+wVQ=#iYagDg_FO09pGBC~Q4+Wd=2mc_AzdjQRwb{nGmSeS3tw z_JyuvWQ-)tMukTTg+(T-$Jrr(@Zd^~xW+>IvLsRw!&*olc|PopVx^A#r;10Mlbq|0n-7Pe*aUUEe=AG}g=b-DgrjJz z7o6>&Oj)OsX2^GqVu?%)E1&N##b1;hwNA(p7#7|3{mX|abb$AJ3p?Th&dRq8(evX? zN3{2!>-*xV{ z7>AO8RE*PLZgvVq{`1-ZIFOz~BZ1vA74U;*&nEOyDDU52`Ei~CCKiOIB??0X3Ef3_r`834}8Qn0#qr)$ha6aw^0#UZI+>^*y%OCv|BK=HbSBidz48xkzl@Mc3-Pj z^F@`evUC>>Q5bll>CRL;F9Sta4eyi~SQ*ODvK-E`InJC6oq#}|veoZFv4cY1p;H*55_$>^0P zcy%9ode-}c|634AA*^SRv?FWwfu{sKJ}^;SpZm~s^Tv$}HUSgQHII-H0#tzUqYlqM zNlifK{@!x}o?)=IKsWhmivk^%v$(hzbb5tOq5y^k5H!bte}+9MSa!x!($dl%C+kv6 zN@Z*6>%-}<>;wywb)^ktVSC4?9lai4v5&KTE9#}2qo!ERNG(vk(c$64K<*Tv9>UB9 zfYJ2K0a&wIIfs|J8sJkevvW{>JcGerLD`(`KE|f`{$H=8=L=;Nig69*s+!UbxO(3b zulw}=&@WZNWG!(udk84eHGnkZ(G`H(uSuUDYQp?(`2|i+&Z6%5%#*>9gxGI@qy=rm zsJLS23K#~_Q4#7V2u%v$#u~x#O`m%TtzbE`>T!lnsVHz0Y;lDq{s|RSNQZ`VXs9`*KN@G8B)oJ~$2+N&GYce>?!h^ME~) z8RS|9@;Nc_ItD<63J6Mmzz7t0Bm(bA?7EThIs8uxFnssUR0|(+V7orB1m6SrEHd2> z0UBW<^hTU+dr(bT%b`Uj(=An3?^hNBQV(~Hm^cqyPdseK3mYsAFf5liUWYz^lx_wtXcX8-pu`aw49H}VnS;QAl5(B{e~mO; z!4|k;`h5Ls1v5yZ3LY*9t>iO($nRLuy+iGOV=(veB~$ER)xnI9^8W59*C0XtFw&aL zCuz?%2pGiK_PFCulr>r#*5__7Vqx2m?$hg3#as(1U1h@(DR( zx2C#pO>12X?*|O4GxLIXtg5ok2K(snYS11pPNfXau zH`xGe=!GjLGwAme_6IUQ0OyNI{M^|0+lw!R6w?>}Op^sIvc>HjeoWc&$Gs`@_wNi`JLUhaU(Vpb2|^D< z#ed5e-xCTA3BfU&S2mzqs)~20*1tNK=gs1ObacAQUM6Nz^RNSfOCi7m;c9e_-WfVK zoU4Y_Lp*n39tPK@q91J8AnH4PjRAK+RLcrLCg7XRx&ttJ4m^UQ;Sj`i{<1z*Wfyd= zPKJI4k%BYk7vGMIooP@n2tg7B!^s ze#AiguNTJ3m{G;{6EA%PQ5SF+y@6QAAh;=D`N-fiWFkx4n0nUh*WDm&8UlR{qVPio znZSQu={;k0nrlu)vSE;bz#IMvFdOVz|aH|O3EGp&j(?61gJr^KT2B4uK=q^1;9G9s3&Uu2S&`M5LqnbPTi1c$iZ)8mQOi? zlZ*H!y@{hE7xK8^erzClLgY;FnOl6mr@QNsy&yaM1auPel;LDVX2u}@b68y(b^-{* z+kjJaY5Ion5+D%4F}n*S;P!4MW`CAsI%LOYetY`PP3yvN@&;w}5y0E?9vBg?xv-p= zF_;G4gN&?1qF6GoxmmHFMkA!$*lyLCx4d`lft4iqeaOMqGGGhuf-AK0?jW;V5RE+a z$00ib@|k3V(W|0AW8x3li6Z0+%2YDgvg5{{a{7>mXmh08cc+9bXlTa}POj~KdUqY| z7V*Q(+(StS+=Ad78kheY(r}!gTs>$7?U^iph=}>nKEJl|)lnEOXfRr2t{bv2^@k5R zkoC!M8|ToezhC1+miIg1mWWt82wQuW=S;ydooL>HK!JJ7Z|m^FJ9( zB%*!9#1%eXJiB}{vo^7xGh3`O)woC4&Zl9`6KniCc>A7y%mW(RmulIhW&Dm)d`0W3+07|P zxKwQAJ+@e^^L1G(G&Nj12y)osUD< z&1;-#kmbm3!8OFEWYCHtDO%HVUi+)h1^*-3{WGE_qPty3E>3+p2O@;+1yO3b102E| zxF1y_;*$&%`8i@}X0vaj4?AG?k4{Y^$cC8z;DJ;~Q5w0?JGjO?8!9I-r&~EO{^k~`PzialzZvfqlZh^VA@_iu zediJT75v|2e*B84`>hq5Znx>QQ@Bi`TdRck-dYX0$&q%8+2mvlrJTl=2?Sg+e*e9A z<>7_wLmI*7g&dh(??-Hd${n3`yHN(24WGCsZL3P4_K`+XJzKc4wGQmGH5Tk?rJu}w zpR@IgMgN|h=J?P_1ZdG7zxViZ+&DM4L>_&lZg6%WD4LwS7P;{yz~}TwqwCXi#;N2Z zQgP|27t+~Qx&ElNKYr%YZIARXwx+BnSYIUiwfN!U%7GuHtG!2P!1+O#lj8na)}J%7 zQ7ZAGk+t{kX9|~%@my7A^fp!F>F+f@Tkrbw>RIuoJXJLQfNuW4Y>U}zH&f_yp;_Xm)l;{#HDQp?X!L6Tqh3zGSZwTLr zWZc2ko~p{Df{tm%{y{tcx5+0XLP^nY*cKb4=@k!&46{wXkTu0}M@!k|PmoBmde+ov zrefXJI#J@sRlg*jrZCJ=QT8BA>McClL&4};SF#k;z3|Oc^#)(tsNx#2SYoPDmT5UB z-?HBFL<%FV-={D()?XoV;oc&f%8do=6JeL5MS84(TXxHJ<~YRCGkSmTRZTRzKeX;! zn=oVRBW}ZQQYjK$IljPzq4y;3b9mEknUv>uiD~l%`2{O{`t=Qxuca=;<+MsKGC~W! z9!fN{oS4#iU2f--?YTAGn>v>3Ow6MildK9`JUFH=H{p8c3V(Z|jBva>wowcp=qVu~_jZJW7n=S~0V;_vR;a_NWdd2OavYNl^3 zn>4P5ZC}??+-WGen?!=e%i+uJ!rqoAqqwl#JKA(rxG-B?n3}r0qEMM)M!hV zp*kt|31_vt?M)v&&l@bp?~OCN@QC%Fcu(<^m%me`Y|s(X4hai<{w02Ujs1gFe$SYv zc*dvM!}bpJ_QU5K^79j!V-n5NwA=)$uNs=8?!Vj92;O37yWq-$8+I|PpHf+jO;jN{ z@bTeb1{wp!XcrW=z8R>VO z8q&7wK@_g8VVHkIY^!ouJ`|jid~v8h>t*rJE0Gaz8J2&;In3aZ@Bz#GFoc`UL3pu< zN=i88UDr4tA@g;$+!C4&uU*}Ru^RcWkk5f&aKTju_O>m8-A(H*Zh~EB*vCx95#ub<)ir`T7dVg<_ zFY4tWJbUG~YahDpti`YXau4tNDWPCLyE~xpZtltB=zEa{&zy1BO>8>t1>-&=~M%)c^x%ckQB^;fkv3$u(EMuH@ z6rrTBUKzI~k1m&YuV1bDVo$od`=bl>TQwryGH*(nN8cxWQ<;+K0rnIYb^`6I$D+9g z_TS3Y3<_O{F{EtktyfADhGI<%qTAa%^@49(i1%7MUwoWmms=np@WD0IGB^#k#|zK0 zvyL*~hgDnXRBW3U6JAlnE?zYut7-<~pV#Ab_L3WP_H;;Jig@1XRyeQkXOAm!xv=sY z&xaKE`mF_OCgwq4V zCUROy5V^sO2UJds$>kdDel3;co?q7E@=FG-gB7fDrbnBqus!?M<1VV240f-0J9`S} zi&UPR@QaqxFZ$?fgu4vm9vmfU27PdsmQ1i(5f2QuneIm~-CYPCQf!%ev7A3@E7r3z z;g33@t|wgK&dyY{yOOwW!#(-;#afaeVJ_eM5i+Z-LaKFg393$c_EVcMWMRASJ3FL) zbx4-WD)_%DwEj z`GLb)$Lhg;PnV)kO}hG_9_eIZYWXy)unC!4Er1+u^l>3EoN!)%vQtlHI?B-Th&QKOg4pC6Is5 zob<=asRSwaR}9^mZb*wPFpo^-4U=B?XU{MX@iz0L?GU?7>r2!X(G4*jK6bMQA!V z(BkS2DO!64{O#nq|8nEaVSjP7u4u3eX5~Bat+^_+~Gqp--d2I^=+o!ma3wJr`sPT za$Wh51>=VW3%@NXrXM`lGvZo^yz|}b>Zh2V9qVxsE82D$ieUuJrIx0y-n>ZEW+1b_ zH>`rk%EC3i1J>^a}g!$^^P7!jxp_zYPsAO zT+d(U7sVxB5d5TRz?n#)Hfw(>8(V?c>AV zGA{KeN~YR2qLSW3FUjBXx5;=^I}+XBrfG<-^9gDSoDV|(Hd0fkVp6<&zfM~U38}#` z4%H#8J@PG1!~XB@eyl_?9gVWVyABKPN@d%{lPeQpdR|(B4(>;iRvKkQcf97`-?r@x zuPdl@{Uhl^{-e0}4dg?ll?(Y4ALNGW2s}_OSK=ZZn)UxhuwDpYvaKs4?D+i7Vb!%_ zk?`fQS=hhtP@rRy6Ss?felwMLFh$W5(>+t{OB~CNRh>9wGKI2zJ%2BWSw6`FsUXHX z(_1k@9_i9lO5FIg6JM@1v=g>9nGh|a{hn6$=1_D})ON2$Vhg`@r|IIsF{_fHP035lTQ*Cg{)`q%=J>1XS<@n3Cw8sF=7QU%4$KtKn1zAthUx*uLnSePRD2 z5o$?63dtnSJVP*xK^UK`66Iyz`3INJ?HmZH&oRXslSf5b&>dYAZ+f(;JLo@guy&9C*8Cw8ApdCECVf*Z~$ zO*rrLw6IcSA^n-4<-S6HFm~Z@7`}B|)gj|x5pR96JxP%(WvHd$r(4s{yDz?wyG`f* zJT`J}x**EkMgXr~rrmSkCl?0RIi?ll`1~#Cgj|+OpK^PDBPW=0uZDZKYR)Xt?62J) z)t}{Re(zX07eA<{-EO<|mSr=X?e0XUheqsRgn4m_VNxHPG+=eJ{>MON=_2eT`G*(r zWk6{pWMnu#Bg{>N!=m0w?{K(ZNdFmo6s{EEL|P_`kQ+l}5chQf6}=G8;6|7o-1KgR zwX6FP%JfRq+(fi!gJg8Fmyof)hxl?x6d{jJ_{GMH>fpUn`|N|L6chP@Gt4#d;| z+FR|c#tmURQINiZ=cU{xcKKrIHKiKlW%lr_k-EzH@Eb<3U^p9}{KA*#Jml{Q6D606 zWnA*da${Z@#9w3n6UnC(@@O=6r$w8y+M7~0W$I+nm8pZ#Ev@wZ)EZiUL8NAD@_FqO@#Sa1b@EDdO-jF#s$-Vz z53knaFRJ+5RORSZ8vHD`)nxtPqj=gr-XvbeV_gGr-Di1YMR$t_?Jf)f>sDZ}-XAm! z7^9*-wmDtwAzmq7|M4{{NQiE5e8w3 z_er93JF+M{-SP^%AZ9SM*KJAmp@R-S{FU7wWOgX2N6(0uZ<(5{f8Quzd%vWsj@P4Y=Cg5Z+?J7Ia zpjQ^P^FuaY@l+$$+0FZ@uY7&=BWUkF*#x4FI|5wVb-SV{6VMf)t)P|m_x(5nhJq&6 z*4EG9-$#HHKZNBJ5*8NT^o0hD8juqofffJ=JokkP0^VjVKM{LV-I$bZA)EF91&WKtS9Gtkwr;jKlZ649fcv07_T9xLRmf zZS3rRfl9sx8qlDLVpif996i*4CC+U*KWmcO`b=UB?G!*R%G-ixTKZsy=uVU)&P0;= zDlje@)>c+e;R?OMh8vJ$pFNOWR~`9E>DQe3u}8o-;Ya@_1vy$9cCSp3X~d%XicX9F z9of0MnRKV`nGU|*{&2*buNd%Qpr{7_8;`!7xMZV<<=d=#(~Z|8ria%?cr)m}=?-^K zykr{8rOh<+oA}2OZ@7E!2DN$Lh#n@e&Ar^cQv*ZyP63&{J`6lJZY?s$niOF@FHm7= zN^HqxZA0&30pO=ZC(TwJ_@u;=uFFab6~J`=xO+wN9SQ~ViecDiYoO46xkrWnusSnq z=_zmX=5qw%^@9H71~iuRpZOMZ%x|EviBE-3km^mYrH+k_ks?-i7wL8meW{>Fq+sml zLEa4xliUH*|A(o!jEb^t+lCP-NhxU%Q0YcWN?KAHB&0(D=}x6Xx|9;6hLSEpq#FSN z2?-^nq^058=epl#t?!RNT+BIh9(`>47PNS%+88&&2xxM9S6)Z=TmKM^L2-~u&-D2n z5JG}Ka`Rz3efg*DEz@XB)syyg{h6i&>Z&Q-nASG;pjbr_0z)rFr(QXanz_}3QRSrc zHfeFX=3k%BUb|EZ)Qe=R3luIqa)V+>LROZlo*p?Ef|!~#Lx~YJ4scyh(30~#iUg+2 zMcXk{6$_z)1WFdR5vT>x+{^)KF;XUolsh1a;SCK!0uJn_W@MWZe?4n#Uw3i6ob~QE)KOMJNVE#5 zv?ZvkPA>hC%5Ruj-}p!i%g6a3q>K9fP&as_y(?5NK;Tknocze%_kE6F9k*f2Gd-xm zP^25wqSH=|QEwa5A5Ad+UZ8U@?Rlr+E^7i|h<)l-oLX;s+VN?Fmc91OSwXkr>IYnh z8yZ?(fF2QCKECLZj3*!c~-TDY{+ z0j5ybqB%o-SXBjp2rFf+9#symR+^<-%C9t1j&*DoQd;&G=r_;3lu=uWOdbA;zRBke zXgHa}r@*|pxn!9t&y-wOx}O9`(K#Moi7xuok}=JYo6I|nDOIB@6KH%kADn$a{!j$k zsZ?Wc7Niacyh5Pbz*OXh^!0~29q5gvfyR*rVqsXQ^W3*D$mqO)1)!j!k`KkTp!l@H zW~i1T?KK;q?i~>wZ2@(6T$*PWPSW@Lv@)9Z2Slxhse#&~0-hjHfLQ}co*9(hPF4Gy zoAy1QBY3gA(0c!m3vfVZNzvtXgs$%0Of%NE!7jH8N36TM$I-Zy!*racs!;z{>td)-Ok-x0Fp|e%v;-v^_Ae%PVM8?sxSE&BP zmU0cTWX81Yn5Dxy$sjZ(Ad9aD6}qV#$!~T+V8(&kem)BdY1}2%Bw_2eY>et>EbR3n zVT8Q(jDuzDcmjcNj>K4^36_s+`kqR{VIbQ;u(E`_-Rp0vzD>DTONcX7@*;arAXqBDOZ+B3GUS|r<)+*%L@@tZlzn3-FppWuw-3%D_j zO`e7@XH1r2GE797L1EGu8cFbFC&SuBnZ24z7|Oc%L!PXuYXV^ch}K9Y@EYR;FrYD@9bSJc-f$5 znj=-m95votJ+wZG`DV2DA#MjVC%nSVkXEeC)o#U5xZy5R)=HH`aT~Jsp#)zP?Q`Ym zI&u08McT28OM?sk+AW}M|P{<;DM2?O0 z&Q0Q>e9aE-{zMr4L0EpWr{6ZH<#wm}D6qc||Kpk3V9!q`Vr0`k{bu#M@|WF?dpPEj zC22v7;snl{_@$Mv&N-p6HX&N1pPh_3Tv-$PP5wzvXAyDyjy<4#^^2eo$5SS&^@8ZTnL z=dSp4%Uj6|0CfR_p)zbuS+5DW`o2~#pMW-ybFR7f&_Lx;NRYqK+g%-tdkbkwg~+ae zH%Y)dyTR06butKJ+OZKX1|hA8!8-VYM$G=g`|I}af9k$Hzno+ER<24zOQ7?1ZXoLT zhDXVM@Oa)|lZV)4?i=}EPkRXZONZHuw#h;zO;*RQO)Kb#jpZ0bFyVHD5%GzEh# zYL=d>n`6TMm$k74&9fNe+^Lm$HQoDzuD!Z#G>j>KZa&`O|7=ne?CvQt0|yQpw_qZk#Lbk1@w|nbEDm889q^*JizCMe1cGGy@EdzJguW7` zBIv^JI)ojv{S}9ci}oKnj7->S1=GATjO}BquzKro-X!K)zT_ULU?w7-NSV(hze`Jw zMvb=mBP3n>=pk88U!PmquqinT;+gG(sfRIj8jjvI_dgjWXR+{9jREMrE7UTBvtk~i z+Bj~db?ZN}hYphLq56udt%3B}Bfdm_6OZwULp9|jJ~A%$H^Cv^SzHNIYDpmRLjH5IRi>1v3GMr|!p#1mjX zZLvogKkFx~~EO#2xCkfL3nrQZ2$0usE$OAt~ zCzJUtZAB|{WE7u;VjpQx|3a<^qV-<2I>A-CA@UlzmWT2^+feuHJ_kIhe$w%j8eA$nW>39sV8s0_Vfm#%k#Na3hB0ZM>0<6U}>pA?c@6 zu?VAov3r$B9$eYOV93Y0uxtln2=Em6noBrIni-9TfYbm%}2 zF6L#_n%1D^l{Z28#wT_9y;1Ld7@|CKb-9NAuMGvKDL?uZN4vJa#B-sRrv7wU3!NRi4t#K5N!9rOlF^6T&Y7dYD9>Jh1BtZ&Eu)v3g$_%Y0}w!1kQx3FoQ zCeZ9hoUG$om@{z<=lMx%>&hn2J@<&J`z-VRcRMMD_GHeAJ3eOwfpAxRy6B`166y&y z>0~Zp9rw)J-Z$xPvAgAO{QQ6@ks?<2i1v;96=(4F)Fy{pZqbnRj;ve)?b-xchSK4P zP7gnB-bGpv*8SzfKe3=OdYi%ohzi=1;W@j78wWq}y}oS-t2aWl%vS%Q9#iTQb`wLnP)c6@ba47oL$?oG-!EC_fAyeyj#Q1BVRr|$m&%fYs(OBT z!g>@3og)c1q}78x=_m3F6r=_~;lp7+IJX64s7^1lP_)ylCa=vq=tCdASH->axBpe& z;xV?6RwLhAhWCtVwscof-?xWs7RnE_KAqIHE$aWHGSe5|{cIqjG4 zta9W)E*C$zGD@^-?Q%cPazNmqTKj%oM&tBk1_$h@Bw=Jf!$vuE7$sAV#QS z?Q+C=;n8=!KKAu1Som&G|0;BGF5SX@+$l-~HN+jkEO`nX(f9FRJFK2Q{p!rL(*pFE z!j?dG6PEVtr+1oYsupH~;md+;Ye+Tce4fc8oFs$aC*-ZzmmH9PUHT7-FBJON*`lKT zwKrr&h~f1%^D)z-<@|)d+0EkXl)=%_(uY|RhN{5~YwN#0i%2EiGsz6*`Cs+;NXH7m z);w-<@{~t(#^n7kf=^$Vw^DSPkdtP^_azPh-l_j0OzsK(^h-C|ysckkoA>=68BByS zTIR4r$y*!tQvDD@i!t66N@2sX%ikKc$yhIg(jCI)s9uMkMm|SmUWm^>4&TKQ9E?nP zxT5W0DQFfUH+dW5)U*hTM-p$5Py5b~OZIod3U&I({g^M^XC`uBB$@e<@|&`a-Ps6Y z(~+e&z9w#W*ruybQzhLZ7Av3%cweqn-IU!imQ6bhL)bXT3O@-CE0x99Qd9ixfsL=% zgwga6V7|-bUX1tULM<&E#oLeCR0$uPZTtQ{`~wK1YRtil!B1Y#IyOFsnl5vT*>^1? zc?2yEVbL`rQR?my5igW>h6&o(9Kw`qL}Dili{BNsdoJdV&9A{EVAc-C;;07j|WM&Hh5V<{RG8Pr*{loR`p zwBo%?1wnS?D^RD3{MsmU9UXIoMKd>AH4VGvv~Y_EL4MFIeM{-EhB};1(cZ@}sb(zx z5|*~`uL1N6Q8!E|hYXP=f0+xf4blDj7 zTq=2I4!^OS-Lg^itg5{XOIOd$;PHjV_VO_wK~af-gV_5*cNR4mT(dtj1>RLhDhDLl zIR6bhe`1>1rl>8B_bB_}6QlbBFeugap@u{#$N9Z`X=#gS2?2Y|H)OAM`qX672}F$v z3d@OCiKxjg9~RwIkX_$-8?T`jW_HvTocL>gT!iQ`QF}}q9|eV|nT|U1^Nv+pnM@Hw z&Tqt2Vo%G_as#EYvVU3Uw=>ly)#mG`cW@8if$cQ7L90bIxIXs0SWr-h7e--H%y{0& z4e9sgtGR%G8e|scMjjN&=lG9LxN;0QRe77V7yl9!8GE3tYgtPpmnKa1W@N?rAz}O% zlG@CnJDjaJ6*k@I+q1W)i;{IJWEb?dUU^&=CGo)1Niq;2AKm{eGYLU?N{k*4$+;8_ijAZi?G|BV(Ba^PG;M|-X z6wE^yz8}KVT58!yv(MT-fcp0&e})BXPtpFr3V?GWmPdr6$G-~SWjOM%@j;1!1WsI} zX5V?ACGgq(1WI^g{J@dn-ARmU7?=9@j#IOPuJ2y>eK)gzI=R2Kwl8QBvoP{29;eo6 znm9$px#n|p3@7SC?diqCKlVD-yl}aThUc~aUE{qwpc|tCz;*wFxgLeZ29EdF`kDE> zeZ7nNi#b1s^DH^oic2hHE%ZsF8gA)mO9a@tgo{kLtP&8|>)E#}z=IJaAp zhsM*vfhxGovaJ9RrUsasyc!OetH~?#rPZT=_A4*)+@+t-+wOlhKk#NHFqH5n{|Nr? zbe!oU^GYK zehZoJ8=}eDkMKTEN=i5I`$12l8M_3K zHZp`o*U$+aTtPnoP(@!-&z!v7QicU!6pDX?^5UP6hqwNIVU%l(jQsUNdw6elaL&$h z<=E-VP z;ahbg2HL-z8_9tS4Gt(sp&Wp0`@0xb8qC301Fawew(LvJHS_U2%TVLLC6`o#poiS3g?m44bM<-FJG4xa}9 zvh~0XLLoT|m7~35dJ9gd6OD)j&^hn`_`c=-2y{B&PVy~Jo&aoL)R$X9m-0K^I%^4O z*93B;dk-EUV_?@?Eu$wu&W0nrv$1GuAkLii1Zh$}M` zbh_7Fkp_0CyFk$&hcXaS(qiQCQx=4vV1;NGln$k&k@=Q@(m14LWQHmeQhN3F(O(lN zx)}N$O?0uIgOCmBc9aKG2wZWHktINpoXT z&v>3bXT`jYTMEJq_y(Zp6fcy|Ca`K`Bzs|=s_P*v*7PxV{zAeoYtj+;B8BpPK!8xv zD_SFMnVJT#W`9rcuS-Fi>rSk@V)zda4t|F*vjIcx0|EiolQZC+vkeuB#Z8c7j)FU- zzP-Tva!?R_+5y|MhhRev;sSDJA8^OB{w@e^&ut@0DeUT!P}#T{iwBBDI-e~bZS9|* zOy3{{)v>fyGC!#0^a&Mptc9!k72%G`p?(COhr8dX$#4-e_)05P*l_q#H6Sr zG@_nQ85tOmbt3fERxsK51J#LrQTGj=&s$XkHBf3egK>$O#Wh?B^RJTAppJdl7YzMS zy+N7ayUC&IU$QWp0Mn(ZyQgQQ{vR%1s{Dc5f9&lUoQoc~AFoeu&*5MA|GB+mkeQG0 z^!h{%O=W7*#HOtYwF71s@?i>wW_h0@Zz^9BiawXN1sI>)Lv)-yfnmQyn+%hZwj5iX zz1^Z8J)5r;F|hPFT?t^7p>_d7uQo9gCa#6drdN7D(gRjyK7PwqJ09d4*#+5e6(oVp zIS8tW9g!f@klcOtL_%=bzT{MaW8Q5-q~ATnHf337!)(TEmAE{DQd)7(C#Yp04ZR?M zZ2U{WwHeI-_(oS%UpE;10X-O3&HS&``m>fYyFoGg(@$(hL2v%rv{u87N#s8W+x&oU zc7t781vX3B2I7;bmnxN*D0MOz0c z_T`^L3ff_C4+P!_8Q~mY&ICLiT&R7ciS}%Ia%Qqu#IC0cGs;DKMD4`DA5Q^4;ZbJRgcC95XZY1k9MZMHZ%xXK2Xyuy)D1A<}+jN6fZ#bsucc!at2tW+BurgY2IBDR}FWgt&Ps?xw0 zJ(#V$;Wa2}ofiC#(K%iGK@bJAmFJJ;?6&*7|G7PkQ5g^rHG? z=Zpi6{YaTQlz2!Reu9H(JCx=2yj!|NQowoA3=BYBH@-)JG&vkBi%FlovOSPKZGm+% z{t?#FbZ$LAYc6ctP2+i(up9mS@?YdCoyKFyGSgwb+w8%SP0 zP(OxR!A;JJ2U@}RoB9oGF&U6PUEUyyGXkME^jL*g)x~^khZr znPPQS)xKywSeIQwuVeddfi?}ay2k-tb<*k}VI1C(V%FiuC;DBNXV2dK zovsFtJYVtba=l81k;ON!`^DFL=mNfjLi>fBoLqc`nl`em-{ic~-*z|f^;=W;3|PEz z?7EotXgsvO`xPpZ<*)}w(MtFm>Xz!oTQ`qyal~fd*uqL*DF5n)@!qM82mqoMZdnK*pzgKt3DD74;V0OCW%q$F3QpU%NV$5Os7AX3{mDk*@e4hxULWVN)?|97RDv#H{7ZZb?`gvvHYi?XN zq^_{0rluak!-NO>sSC3A_?zF3-zm!4E_A*88M<=M+M(`#!Ph(9DkXbFpC(?JzxXtO z#Cxa@T*P*xMtTyE>h4dQSam@2N}Hu8n6`68e=%d{8{Zsi8$2-$l9vnRylwug4D>uc zMoyEL@l;f#Z(l|TsQ)Q>fpIq}tg|(NV^=r$1|WabTl?49EsqFdt3=Pmuf(ihN1)zN ze;ge66kYvBR8dh*j?{z4rBpenM7)VPllgA-GlhG#N25(zn~YKkx568OB2yBSQK)Jd za&p)?1DUak8tC6krlcQSGTxTeCsJ^>v>G09S{71RZCyK4kxS&8IlpO zNcR=<_s$uIJkDjjI9Zm6LyZ+qQU?{)Rigj}wT0`5JDquD_9CPz9$>;rA(@~Wu z#yVSeQcI&{xIh`)3p=a~b>Dcy^T1oCi{Q)I$9@(DcIV6vY836q;!`xhAnr&E;T`naYi~hebye_9`KuN9HV~OjydSdd*cFoByK`zWqpzMxi;NEQJnYsA zBej?K9i)kJZLL0oMZ-pi^%t-jEF`C;hC1 ziT8Wz=NnbbfAV5=%3W!1J9Ih+D7>N+)i3ejOyGIIIX#^x!Pw7&DDB_odT(gW^KhKG z-6Xj4)Bfj8_B}h_rq4@UV-c(u&*dVntfeH1L7jcz=UgxG@d@gP#huNR*IF!yDEEz| z@H=gtTj^)dga(b;77`OF2${cc9*kRNZF*vw!}3} zz4iSv_>%I^g!T8dcH;|^zMxJ`X+Qd^<$yPsL(#8vWu}5t(Er|TLdR(4RQ^}ybe9Ny z>4m1)=WVXZRJ6anYRTH=2NS`FRy|Gsrg)THIQoBWfoy>=++3*K+)_JmU3Bbf67Uuh7rxMy~0VV^BiEFOjP za{2@bAWGZ|aN~DZRd6v^i!?~mij6i9W#06;r^WlZ$IPlISAlU9_y_3{A3bCSy4$CbJ!V3&ZTE^;qhvx>s94kqCgX5P}LiP{Y^l`Yehh)n6pydd!_vyBU_T^Kd?G78%H6i?Gm-wBj$ z3T$fnBiPv$5)Wi4iWKE5Qf1R+MY+lYMe#|C3_UOU z;+8o?uIW)~bCXx92J_vs(K|+HaxBVz8&aoV-R@Ms$|t-+vpdEjn2`4&#^_~29HNUP zDA=rR?EYZL{i>CIM|p)mc;Qw}cZU?)d~}47PR$MDrF(%2M0Cx=W(cO2P41}POO+o+ zZFXU0)mf1Xj!&m=$q}D{_gX<@Fge=ghUKQQ&n@b9y~li8`D-ZchlQ*`eqxZDo7?i+ zVn0)YJed>c0Xbt27>{a?-zlRTlaeQjsSuPD3Z(k99})`*^bzNYIW%vv&+lul7jyq$ ztm)}M4X9N87k216wHM8UITBf?$i(9NMwv(zm*k30%}r+ z&dZ|-t9eQNrCZ|!HgpFeR9acK8;Pk0nBR;{u@vP^{H+w$PNG~LRU>BhLb_#G*k(|I z65Cd*WuqQiCt!apnwhs7wfc4URBGwLVyJqEw}W48bBQDI2cv|rYs2$bVxL=Q+^wwl z?i@Z*BlO1hjoh7^(U?Sw~2tb9%-UaTBufPw+DVKDc++Z~rh2EuZ68}D4vFz;d2lWXJ17S)$v~slerZ+4w(ryZh z8?}Oz=?@9f@SHMVs>|IrVEYbR*j?^HAOY2Eou`V|` z^TCR)%dZ{j^p}Z}I^USo1A1LWcgfb98GMs=664{qZ`Qab`%tYPvKGGd+o@0Gk&ab+ zs;H$;rrJriQ_=&|SOiyEX18RF^aLx7JmM)g{0O(q5pr`e`)2PMI~#s%i;%;6!C6Ik zG2Pg&D5i=No~E>Q9R2)PPAixbQ=gR3#%`~@KtY*cnC(k?*!TPN<{wT+{9Sy<*q)9V zNrmTw>|;t8YLn7NYy1zgy8K4vR%q>YYGi}3EKo~khu2i5^p&@JY3?l)C*Vczhq;>g z)k~NL`bwqEx0ycsI=3Ztsp4mC<0!+wz;umwW|5TQjN9&pEg!Y3;mrHoI`mMOZ86%3 zu{=!PMUmgsp2dK)%A?$d5AXZ%@ryESa~zEo<0&uYZP@JYkq+Nf#Xqx)Hdx?+NHw|eH`<#%ATC;Zw?P$?! zt{};8Oq1hxI(Vg@-E}l&Tw1Oy-j9jGeZy2zZ_De2+VM0LbG)-IwYXr*)?4r7_V5%I znYSpeR(?!7ti{aZpKlHJBF_TQx6iuHDO{P%qHa@umNPBK=qDmhhvmK402aHr<)sT} zOX_4X!6S$M+qd#Ij>CS0@A_IPyeB)kHzJ#2llVxX?#8&gf85d3p5RN3ea4zCUa8m( zQHK4;^gv8>kfzjBL7ZtA8_%0e3Hx)-N7Zpk#&6!Xl1Peg!x0!2{wMaH^Zm^(%BT54 zPe1Ce7WN&ez7Ds!?Enkb%OIz#I9l4nzJ*MS2&?QbEyIjbla1RyX!TL83mt8C*r$r4 zrz^nSBoo5czPm*~kC@HnV3HTx4F0W7>yp{E^|L7MA4=2jrDJHev-oUQzDs&PjS!xz z^)q+J9N)jJO5d0WFr=Eam$I+o>aYr&Q-?+njUbzEdTXK_1D^cf+=9g-XD9MXMshM) z!{m}Ik|SB%z7&mi9&k??7_syATS5bkmJx!uvc-uK=A(EbxE;1yS>}a2f1(i}rTvXDQ^iO}LCPO8w>K(0$9~ z0J&55VB_63ZP;Y*rYE%5DotPcbWhzgy8pmBvmcIYS8-Wo{aQiOK@2VTBvh=Lhe^3o z*!9~(@tU(;CxM_2_sCV|(bkoYBA{{DY>x6h>%vLYL#3pt3t17yv^70ktkG3k8UoO&*6n2=oZ;f3pYZVwC4)I^W} z17n;a@JUgVlfxh-C512*EwO)KhysZUl901`W7oUoGu)fqQtr>pH-|EFM%4{Y)v$b{ zq@uO&<-MJi$tzRWjBhpvN7)+5_^WJeuXNcn|Htoyt^+)zB&OpN^K?sv-+YO9x=3J~ zn&dT?oXAKxHJv;CzaRi4^|Ms3@-?KMqyUDnJx|H~h9$$8Id39-#$Dq}+Qr+ZyTc1jukMn08J0J7`;iZIK;VClad)1%3SZ zv8A;YTwOkarwNjL3kHKvR8_42TW|KG1K2>--(MUBo@xpI1Ds<>Dp3PS|M+Bni|u^G z5729Nqo$;B)kiS^66@BkpS46;IqBCpF=s~HHLYA44P|~>)I!qa$q?D_NZyr%zzif^8|j1s z0VF&GqPr-No-^*hlPUO$7EG!DppIAgSmmAtB-$^R+pkKpASmJOe}w~|tx9Az%75nN z4nN<40ZJUa9?}$_7SP_v$jB40UYh>w#i#O)-}LWXBftGjlB3WdQugsXMo{SL`q#GkJT;s-5bN_G! z7bcbTt}~doUy}4cTAxWbi9an>x)`s$yxIx(0}YcjSiRIf09(udobsUFQiRw5qqgTN z3JTxAxn5FR8@wKmss=d6A+{3{3y`nQK!1M?w5T_vy=#k20nDF+6jnG286M3+QU=oX zY-e&FT&nWGs7F(K0%Rt7H}EjtAP~=tjlp2VeF8**@GX#)Q~@=FNf>~|hz-DrT>&=s z@e{Moa0*>rS=pX62AcX2AWB-=6YcF%KxqCB_^_Y2hYmomPYS}9e^@x&h=D_ zUMY!+H|l%e^hY1fxCbsBid@=gTnCix0{2H*!5|3O>ePYYfA2D5Tgc(;Fd?~P(@dCL5cACb15<7yH^u(Cq6%>u$L9(wzMOa9uY4*Z+Q5@=FN3V2vO z-#TcNfH)gijims42UUk4WJL%-A6dhUg=y-VT~YA>nIZvWH|>!JCsVdBFO=rWpq-5U zPc6$Eeqkeh$N;-PEm`w8o$q?>xoumuEl$b&iX|0Qg|%IDQzXhZ4cnJ@nr;k7h8c@w zGZ)U~wb#uXJ#Zh*JbjlX%P_KJS|{;w3ezuPM?|;AcK-8eg*af5<`Zi^@5qiICKJR@ zpJus^j6xPhb}m;ggmMsALH&Iv0HHPy74CbtXlZF(#RPN`%73yMWk5!Y)J_=>0LB0G zH{Er^)Y7Qf^uswUty)cW^~#a8D-gs0-0pv}^fPM{s%Q4vbuBHe8%-enNC$%{7*V1y zzn37Mru>ZdFV{IIK)W=?6{&#HI>*{K`0kiJ_JuTZYi$GJ8A;0=5*2dhO(RSmJYAu9 zs+RnW@_w8*OfR!pq(2V26&PXrGZ{Q>>3u%9-PQm{N&A624mJuDR80^bnYy)QhXNL@ zdY?U=w0HXEk$A7dy>>|a65g&EM?tnWbZK*$j;J2e5Dw-fV1kU4Py4+Y}(m49{N?+QNHZzt7vT6awlD4a&l)#6-$$bA zkm*zMZt!|d;@Yd8c6fsvGTM-ZWv~+rmimAYwmsK)zGK85-kfVc^>`04IX?Lf4ZF6i z-3$ATku?wAY_NY7Be!P7ckZ1Bf-5%`t)|l58FL?da+l~yM7MohF33ot8T;BO9uaG# zLofy|yhuSCGA9R_CJHg3;2!CkeT+&e)x~X1$go18uiv3c1 z$Q%U9fr=(BA)y_Vav)pN*5(=oaZ)Ez!13^?t(L0SWt=QV)d1^G>M{wMV4 z=;#mw;#t9V?~&U^C-TGKYz8rQIk2t!d@hIV9Vn$DYfr->o9xIqDr5o&xch4To^k@9 z9~K*8WLyb2Byz!Dl=>Mz|6hX$+c)D!_Jqn)QIqlp#>AA7eb%>iAGnJd5HHXx zCBdbAwSCJ)L@J7#{gao&!~x`QW$y1gL%1vQC%|+sW>tiFSvNJGinL{d(sziiu~!Jx zr1vDQ4 zA=Yx+9`Tum61@6^OKsslQCb3|ZCn`CmHe|Gfk`g%ufaYLxIN^p*H=DJmp?-63}qQF zfI>-4Q4t%KbCZcl+U5+`u_xL-H8ft!@g!tq)xM|BNKYzcC=d9@xwGy6OTJ8vjfD(A zNNxW6<=P+I-Y^>icFckr@SiSR&>!89Z6kb~ZTDm0sNm{Ex(OEx-ESWgZia`uWSfc1 zx>2d)2j>GlVPZ=(FB($@fGmFJ7EG_W}s9V6g3@D!f91^xz65 zsPA|h{Rk@I<}f6uo<##cYx+twS zhGVL!GHzX3nD-lE6z_gPTx3gp95L3-^;w9YAUFSa_iv;?$ZvI>hGA28vSLx{t4qL3 zdy!8-B5a)<$!&zrSdH*IRaD=~V8i7z1Sjx7QAt0J$Edk!c;efZE%_k1CJQ_zXaR-I zXpLLq{~@!r#sV%T-G%+nlGtuzoJSpsOnLpwZ)3W@vT`VM%1Iw|dKHIZX#GNA|KOm+ z{Y0>PixZx)C`4#xUD!hIh-HX>FEn`#X4xoP+JlM`N4oaByvQS5c!(unDD6HZms(!f zy+>jETt4sq`Ym9XN7D~S)@AnS)XJ9?meI%ee;Bm|l-dBA-1Vhk>UrR`=h8~_x_8Z{ z=y}4dX8#-UM)W0(#W6?5I~JieaIU5>|0QQgYX97!Q0$w6ooCHgERvU)Kp+Xni+T4Z zHIXr1nw7kuU!WpY*Ma%F%vAb6rZmx zQa>W=LZy;%7pa6_o59bp^F*R$Y=&qV4MQDzQ(g#038Tr{%mJ@9nl`_eK7{@Fwwsqf zt)nBjoZJ}NhjX{X3OSSL0F(|y+%{|QOiP1bZPde4$tb9uf-WVZu|ygWKa5lGYU|lg>lC`JgsD;8Mr0sd>NRBJ^ z*~iBfhkWYF+815QH@uaCvj71dcKi4aFddU%p0-Ja;Ak5b(HI^##`4t~bz#vLaFq&# zJ6N=Hal0op94_%F4IwY7f4HZo<*tR;clan)K_AJJMGKS49_c4mmEyE`QEbuhd56e4 zBzWgoYUWe(5G{f>6g8_8+ZfKzopsjZmeqoTJ81sn?CH0PqNThh?u4YB#R)#uxoeo~SotN5dddr5 z<{Q(gX+GStWP%&h>HU5PEI)*6rON1?2rY+WdRi)4H;(^s&Elz0IhD&>0Og}jp#gkMIiYM7WZpC1(db?#e zXa!%mMtd&Ou`XNQSx+xNpuSDWvD??_n3hO*r---Xd1+!rR=#}0TdU||11HUzZBgd= zx^qXnwYhdvgmN0MOndo3+DRgB>};SJ;Z?G*(xawfmz)QZ)JnOmr|cOT~{ zgvrllh?y%NK_g&L7eY@M8n`?tmWU=SSdw00t2vd9FX#X6 zGm+}DOpva&=gjj#JHW@cknQ-dOM5ib{&*>)aQ_FQ-dWQ!eUtrxf6O|QL5ne`#tJi0 zdP0jNRpYQL_k+X4m{ak_6f7}9aOse!)}y1-De5b)rZ9h@CQ52gBU@THbpJnm^5cuJ z4yt44^MQ9*xFkZ4_Bno=o9gkTaqbijuGl4Q%2H%4Fa4H`H>SX;7$PTTk~J_%sY87? zLu>DF%kWmPQZitYYh*E=5+LY`cit;Vo^ zcQLZ&>!!|VV4h*lyBQdKI_Q?Xrsns84-#fd#2G~tq%^yxqAR^?qc#Q*G6+mFNa};yVWuCzOm*1;K%JDE6S|b z{I^)=3j2xEWxeA!MQd$+n|w)>lj)hsP&m-$56Cu`qZz~|-2}{)hdN~e@<5qfJxs)& zdi+ZpjW=k*e(j(Dz=o|Sk68oM)0o>2{uUgR~Jg?eWnVtDZ^4qo2cO=aDV*Cvi>S z)hb%jY#`3w{*${O)iAAIkWHON^PJxylYNgxBTCCQW2j&K#uf0xET_z_G{3%WmX${g zhWNfLq=UWqwlAmBH`<|qld_Y@q`A6Bm1K%7_HZyPoj&sp^LOL&0}Ath?3|GTIdA0j zwnbz<6PYHl-bW`3=Ro7Zo3CE4nl^Y#z>L#@3;o|PtflK-&YzjU8(W@hh+m^Y;BraN zaf@VgWwbRQlc(~*Y7}z%qp-XXvsc{`CEzjY{Aa~C$_St(6CnnQN>KZzVok)RvKtGm zmZ!G+ia~0sx_=0u;1IIwQ98^%`Nd-Ro4KJie|P8O(Yn8`Z*LGGhh9i9wj7FOM1-;% zyxqHAwNy7#g3BQD0mXE0=?@Q@hPCM6T+j9=ae;7E5CJ;mVXHE1JmuuSg-!-rd!JlN0GP zi8k%W*%^x>N}q3$tV?L`qHC^4hd059_=**L=z*uR9h|o6+5!xoKQ80KB45Yc3K)^>NPv*6Vx1>0D1~@e2B`;fc!j zy}0X^s9ZUsgvyEUjn-_jpsKk4ftK@TxyBzHt(-wEPubuAbib+(b+eEPc$glq(Aj#8 zffC!p=K;BYu}#D3bVP=jMK4il&{7(Q317W?_?todnT)8iGxW}k#$sYBRIHSP*Dho! z@eBIw%lR7X4%nCW+B{(Z6*v5S`Uq`+PFXrWxSjv;jsj2Y}s}f zMu5Tsnw0^e^9mUMOASVN1K04~|8%5SZ63V-VdUu$B786yTA` zLa9uB?>Wk;q`&H0?^dBGhj^?t)XS6N@bmfSA77Pl6QsRQ>TRxD$cymcF{)vq#<>vs zuR?R*IGS~m?`e}~5)^sJHR-U&mPZHU9Eiz(6WB)OsQq=#WO=u>rD9NX@O#fl)=)_5 z`JQ76^Au_T8^`@Ef^|%+1BUFD#*Xu=YKJ#eza{Nnm6z0DZd#V8(UPP4rlmgEX&N?D z_5(OsFJ!dM{whv`nuRjA! zpm$`XqIy%MgJf2gs^;co13n=auOj~~OJ;YW&k@q-;(a&eQ0gs050^Y234h>Jf%hjl zSzbZSo}*MwoY(M_FWb5Nb8vb){-?NaYiM)J8aO&*p`p6D`_=eK{E}5Bvq#iucGYDR zG0kgmqQCPbrK;z4Vu7_+hMd#UJSUAuSeSBL!rXjFMet`ZLdP#yYOlp0$xnhZEA1+X zLF&=h$U5(&AdRHW#0o=9p6=ueEid&YMfB@;e4hQ-^`T2inyO1`0cXTOSEdI~X(TZi zcsnnCo`ajaEXqBZBSX^`gu;MXGwT1k1zy}K89*jiy07(ndR22>Zm=rA3&%VK> zP!)_bR!6c&01l7>1j}}^lmf~cG7J(NahGtLMh5oU00RuZZwb6VW?vRO$M^Wl^_#0g zVkJrQ^l!i??xZ>d)aGkX96lWv>OtZ*jP2b2w(1NauA!OIijG z$TWBxab?ko>JvC+_8~(L8^NyxNqdVh-ky=RV{saU=fDk(Yt3kQ|G0H{% z*nao=H7fF!Cg3pF3vBWmZEzFz+N$h9()PegAUELp3h3Jzkb3i@U^hqu8(!?*UifgA7D82H>EEeMd$L&8w-rIK#fJu*{0 z#~q#NP)}STD8_&d0hYwJ=O2$@$^D5J^6rmF6c1ikk(AgJ-B`?3+?BQ7hX>8W#B6}z zg#wZCrHbp$ywOh6X8F(7$$TX;8bOB)1frmzfc4XC54^w;KwH|9z$(^uTL9;E(r=I~ zTeZ=6eKz&w3ef`4Z_UO*LIM#fA+VuePD}yww*VR0ia_{7-Y1g!YgA?Nq}F(Z!aC!F zmzNg;G0}f=u<5bl18j1H_yUl6QJVlm#MrwmDz7x}d7+~-NrHJzAwpO!X0M_8C{TfM z)3$^xxsXoTo54uYNS>$Q19>**tGkC7B22d`Vp+fE8CpkL1C9G)VhstjoL!{4G;p?_ zm;s$q3GlieS|7U!H%RNIMtM1P#eZG^u;-T-J4Jc^-pz>#2|`<+I$#X#IXs_jZE=1y z0Er#D04%%A+Sem3e;{*GA26d@V_i4CD-8${DY^0k(mJZv%8mL3f@*6XgPM>K_do&8 z-#AnHW=3~E`UMWt!ahlPp!8MiR5ExTYpAQ^{WRav)R!UU7QNaR#~n^cuIEghee;M9 zR1k`aicE&yWnW!AZ*;btFmDd0zA#$?w;e+45YM$t4fkVDvJ;u3;O#uW6|*q)Zn?v&4OXDmydeR^Z7Gzzdkj z;6bcMJJP!Y@DL=@Sy=5b~(A+2^fI^)rBF?|v30acMl>{IE#RNUPK0F4vup?1NA&>?m(&|a|bb$Dg$yC?gO-&P7t(}j+{ zYa#=3ASJeR!VZb506@yb!4U($JR{)ZHytuA2w+F8&8xHCKe-&lOuSL9idOO6L(4L{ zfVhv*jcL3uffFchR%zIo^ch0p;Bu*w8|?$nA2K0m5g6)7`DhAK(-OYww{%QkUsd= zWjBgZqdBWruWCuMUWv%~U1?qtT}(kZq?Sk>GRiuaNip_%3w@^7jeUFtP zQ$PVn-OBZ9Y}D;a6E}V~3j&1bMAIQelqhDO|Lsm(_*7(_NFFP5hwT5|;U7FB#f_s_ z;%*62o!3~kfFD`TM`2D`kj6g4Dw<5S=`AWC`b_tNepvdCp88il*bRxd;jWgy@gcPh zzhc)RM{mR>vyXgyx6@*@&Ly^P?Bd|G+btz+h5n|e^?xj+NS?|ZlR#fD1%@>QuR*d| zfWnR=@)MsrtwsxA1G`&wo%l*629NE#MUqn2ox9|kCCGCrx_BtcG0O3I)KU7^#G|KE zjnO=K(#o7N;mr23diB?ALqQ6M+$6jFtZV2nrXz$ID1$NiqTC{wM;69MeG{d`Pf5x2au(g?NYmdHM0qf2_DXl}7I)&S?s`;!(bQ>uhq1K;0Nm;??wX7;4% zrHX0359tuaF${Ee;a2H}u>jnO2WvGq>}5{d-NN-q{(o2K=m^ZlOH0juQBIEXMvU4}o z;ICJb3+dx-SLT-0Z3EI)Hm9Y(3R}S53p<1_@!`_VD^yV;=1E;%#hS)VLtw{|xyZin zk*3P|6*g2?>0sZVRXlVXqZoKZ-9k*ckF!O?6A=CS^BVJ&OB&{8&*Axqnj5V(!n(C= zhF`h08S?u{pp$r#U)%0Ck@-heVW$x@k7Z;K#q^bBMDy_I)kJ*5u(PSbk0$awopznx z5((#7Woi^ZW&QL2G4! z3IdW!D_w%XZ!XULyzlpqbMLvAz1LprSx?L{$CzWbGq-K&)VZp#+FOy>SRu2ZhI<(> zTFKN4+8Q?YZ06hhp~%TB@PIBcjji4|BadZqXS*46eZPKLbDW3XVY2I-y%@ev8BT4c zQ`8oNji>uDDd10+oiciC5?h~Uq_9@ZYv0rHLpqlO0o$KQy5L2JF-%O2iqzVvNUh9k zXzkkZ5eOIT4oEY0OpWc0gu6OjGP;ZP*FeSu*>!nACbd>xrqm8?SO6^PHQ(XJEC+B# zeRbVz?S&p^DtLYBXD3v}2T&~R&0B@eUlW21DLSc^>~vz4FvSCP*dE5+#4J#%u(=|J zAPv^_wI7r!kDJxb^BveC^36z2rB7N1qaKIyYB1#n3)#mDp{&=4*w!qp8@%#kTWf{P z6zIl4dlhoWe);*l(7dQUs}jHTtAv{g6oik=3#~)6?TU-=xlKL|5?~Xsk)cL2Gx2?c z(7yk30?aFTeO&meL{FMqqx;QgdpSn=k&J`3nliC1i>>b#^L`X{X;ufC?+tuosxh@% z2wg)9s3CF2C8_c*#350t0L$L$or_`D4RHk4_cwRKKp7Nxo2+DWmAOijKtw0z zd3qcc?McW1`9m9!cM(36O&XT#2(EoA=vGOS*%ou15KjYnHLmQy{Sjq<@f%25Lo<3m zD&6jZhqV@xz+auW;n5YZ$g5M$TCIEB>l$V~QA|#X%BlSv-p=Be!OrVLIsI8hSklB{ zaadcH?_5+Z9|U|i+wZC)){>=k5Wr`j!ioKVKo{=;Hv-xVb~T5Y#p&=*t{0QK+1aud z{gZvAcd0s(d%UR8|9b=!tu&Fz{Wv;Y><&3ckE zy4~6=iX6m;Wz2F}2(=>P6JdfGt?)C^bSUc`Ed)5b2#30TeKm#iPM3$^*l~}<7-TbK zV-7?&BDj5%@jFk{Gx;!jWZWEWSvUT5o`5r?cR6z&2AXdzos;e#1|iFrG~rf%pz+Z1 zr$I*^^IU88@Zl-+d}7Oo|-??I_aEZ0~_^E3*P%aVAv(#`R*F_7N1`>DbJ|^_a<%EL}`^wkw)jM zE4@Lfy?-P^c`egG*?oP!6gKZvOBDs#y8Hg8ZQHm2;)u+gg!`2sBR-udwgtDg&QcMi z_dhP7^f6U+JnK}p)6y#L3yL=1y;hd_tVRL%37DbANYBs=W(_)wmdv*ErH zLs*2ZkX?H*h})0Be8R;EHo z)lVS$9@{^fCGPWxQjBwdO)^#Uu(J$XNH{8wFzJuH;30V75OiIov9}5iy~pP5gMaP0 zQMqrX7SHCYh-mrUYxT#v!yH{PW0HNL6VKSoG4!m3ROeyf)Bf3xQ3>1Hip_iKW<-i3 zzREO0UGZngLc_G#1rgy(3{R)X38mNm8@@N`e!L4fVjDd_Dl2uS$pY?i<+tb`eUc0?&n&9(K}!(al&J2VIv4ipt0 zo$GIGoSyK+=*p}vJmP;@xnXp*u(&uBTCBg_-Q5+JXol0U`TW!Q_?I)jA&^#d>zRBz zFY8GpF>{TfH}2@)&ZjnWoyQUJyP+dQQ}{hivMc@sHh4ElcJ>Xo4^wk{o=`kPL_`Fb zjS8a8E<{BEbfNIiQ2wV)CHjs~?**;Iwr!@M7fiM;C$KbbSrw|6d=Vh`iHmZ+=NPnjdo14e96{WQ0{1tG39h@J3 z0N?n+ZE%*upwbVZUS!L^CGLOF2jy2N|KKf2$uy{S+6J#YoktT;smVUIuA#hNT_W*5 z*7!krYHcF6Uv>C>tMCAJWP6QIq<}hF#JvvaJ~k9+RmBO#W6N_F=XVex2~e|CAOZn) z4Ly7%&np;+=TwL<(PNrq(XZSvT^r45yf{Ctel`)7oJ@tNc#t+ul~1q%{Vf$1l@@-I zq{7*Q1}$$98&Mb}5C@c>S&^5u)vl1J6EvZh#QLBc|AYfa)zd$ z&hS$XYdLXF3;v{wN2gFut@^EL!pQk1FvT}$C6YlJ5(8CsTX#0n&i9!?&QiCW`0N-e zhY@DEkfs5uX_2O%NOl1Dcq5k)+5VK%u^=UE5{}lbqpgGU#N~RRvFqXCV1T%x<0!)0 zwm`Q-n$5;NRd^4rfMtA5hBT( zPu1*WbI4d5K6$>VpdKM}jTe@sGox>!{<9 z_)$5uWlZ%tv5`2QM~6;rXi~6A*DnSiQ7L>3@=ny}Usv!|fc4)h% zb0M)9NMBfq@Z5;f4sd=Yn4m)Kb1zilc?;@2w?8T~X=#>o2Mw5%trzJ&LjdFmebv|GD{lZoZ zo4&l>(~7smf=oC8!>%|k1HmkPgm zmY73FOLDMdH3fJK&w;8<>>_CMIIiU3N2hTED_*3zS~!ggR1O|P3gn>3tg~sxWK0Z- z+ofgdV23O!om*P*pG$=%Q5T4`uz^@p(384Bz*Xzh%HtL(Os5iCcfZ({duZzL@fU}R79Ox)MXy#Fl+`eFLW+cp{^fM za6pMTJ<;_)FXo_d(;X@zaq|Zd-5|7|r1Adeh(h-PD_s2WyWND?{;;%8d&y}P6c>UV z=PF_saOEaN2M95Zv)TuWqE=Rr!r&n0)E@8#ZU-rr64auv0nUUrkzo9D4!SQSw`JFI zc34QaZfYzKx=iSuhmH%{sBaTA(3(_LcmV_2iAh1%KWh+%Ag;HNH-Se=6`E)9wKoa~ zWHL4*+Ag8GR{?YqnREI%3=tx(;rBdoL6Q@bR%uPsKcVd@C5UluPzr^D-~xOL+ChJ^ zHd)0CQkq|=HItyOL1r#j!*4z&)#M(~UG^AQrPNFd_Qi2qfpqfQt7dS8kBW_z12x(z zR1<=^a|XQW=$M#qhN)?LASK-&RYI!le=RRN_49Ub!|x(*wb9uAn=5zIK0ycx*a|cz z>lEoOfF^Lm71fs|kN$+N_i?gE!@k7`Y*J0HZNz7H-L^Xr;Xv3qb z=aYPAQ1$%c6gHD-7Z7fofSC4~jZHypbhI@b9^Ve&nWmmmE;#5bDJr_aE~R5~3UZ|b zQ00!pYF>xqCkLC9t9az>w71G(;XYzt?0wMmu*&j1%&>+}Fj;4so56&Dla+M@x;}3F zsCRaS!EX8V(tfC+Y@#A>1GI?yZ*e7tVV~O8+nOFSnSi^z`~i54Hv`&V_gCEkt>QOm z6Ukb7K`E(U({fOaejdSfB^T4vyy#ZZZS~@ng56ib${(+xKPlJ{>moyskxdG06t?>z zJfWeCz60vCk&4IiVIs?9pyeV1s|6UHf2VU7r6YTxly}1Xu}PaDO?9U(EOR_Wf6e6i zweJ=uPc_Lf8y{mPL2U4j1G3U^j0V6-SpmKa$c2pEmxw1Sl7r4ORdiUEA7~_v=~A~} z7bIWO#J2+~j_h&hWE=!76)?gQC#&=nckGlQ>wH+J;nWy-lF4~GM}==E^JeP4-&2ME zCuadacBb&)K{^~>rH=)$G)zk6B89Ktq5@E!$fs_MR5Y1g#8Ck3%gsP8W2CC&<0r#D zb%<0c5eSc=6C%M3oWlb$o+HcnhG-vZjhkPlqovMa!bto)VKR@0!` zwr7o*__RqlZ0T42)hEKeWB-*E{qG~(GEySfq4Md>U^)a*M>ARe6%eqBmw!)CgnI3m?=nBV+$6*+ufgR>BrRst0iobFdshipdf z!vEG^?76l7_uy1@`9MEur@p%dl}giD@Hsp(rrt4-4mhTCBR_YQs}RzXF)LwmUxRDK zFS+9wc?7kG@-j`yx&n^HVkcP<#`In*?a)4kgN=TEoC#}1X= zGH={wGb-TuynKR;P6hp^5TPX&{G_o%XO$>&jB0hL;zRCFpI}Bd>3e-v3j>d$*)mk! zfhZK2N>A0klGsj;?enAuQJWn^0b78X9gJjoV3rjJO=XsFWb6uH+-+ND{@_%4#p_3- z|HS|1;Gf{B%z*|NF8D3N@BsW)XRUWVFOc`%MW)q|S!?~aw|!B`){V#qK;k>LM@SwN z87QI}*(B}MyPy6fX#YjVv9-tog%$*AVgGwHPmPDwHcv(lYc{BE-jfSrV!hF+D#Zi$ zW3CIi(W{CJEEO3VDE~pVrvIQCMJ}>?&^gs_P<6$7_6-cgG>MbI&#=hTd8~-aOQ%O< z;PoDS(L-h&MJb3iogf%(2r~p@xjgu?g1Qb8K$Hu`tBe7>3gExVL_&M6-fx_|Sce$NU+ z)fXn2M{~aZ|NcfzgK60DTJ0gw0Ysv&{V$OT4D(FzV5*P~D$Z4*y0FE_|0iwFTVZwn z?=KZZN6DUtlVTul|JG~|p;RCi!f3R+jQsH@HJ*nJ{>m+aARdrQ*V>2Awm*OI`@3%- z#6G=-5Q*8_ywotLe$t;y9+5tK%sC}T^z5-|IomztJyon#bkqENM`>pYW%NH>##G=K zfqXiT_qhksdlNQOD#p;8{}o;U?vO)>|9by%+2aM^7D-G#%TM$1x^qqZ=l8C!L#2O+L zl~Cw?UI8^cn>-l#rWNHqs~m~BF)Cmsln3nhcS3oZvtqN0h=irxndPxzkn z61~+Fm3;Z~B|@)gZT5wA zN_pvTYHjj_uBS*|n&=Z3B9*b;R5%=+c7G{A&wDsHudfU)i5&@oA{;DZI-ywU7z}nq z9Oe-{I9RkTi~7BS&msqA(z|mG5^TiQ2>OH20m9Bb1HSDTY&rhI$y}k&F}?&$CRBGs zBqV$Rc=R3OeW>PG25MC3)TGYA7YxJc={le80gS=4Y}|1Joq4(Yo~3F^?^)Usbotl? z%{}x_^%|=5*@glgMKgatzXwnmkpqtYqa_dTOjbM&cs|=`fCB&0tuhTG z(5IQBNc^R@HxiKWwObG!lw)9EJb-v48@OPAespwn@?lgT0M;m-ogCzVN609!hS2yl zsiuUOUH1V5);YjNAtK>xH*Q3uU&RRw)St$=c{2v$3nie8EII=5cZa2MCx1a{hhDZ; zo@%F^GuU1Hwe0`n2H#YH&I>FtY&wxvsqS5tXTWK8j*V#{IC1CbC=RBL6x;|S9Ub&e zKXV1as`(rdF3U` zYJ6OtGh$(M$Fmz8Z<`;Po0~ICw6qR#uxY%LXHpnX!)1uRs}V#%nZVHf_(fpSh=G8L zGmb3hl#C2=*ASf7dU=7BeYRo@oBMeyss%tuAxY~2%c{U%|8C)6VMX-!D+3GuG8;nR zanEon5jv3a)6qF?&)?fQJgoI1!FOK_Vzy}YK^2lDf@T^W<`vKs93tq>_I7FbFRPh6 zP>Az^l-m4bf=SmKDiJ4{fB*hjz}%vvi%d*pv$M0Sgr3yTyg~5I@?s>`q!x;9u9$$+Y~4_8u(NUDaPd0%>w?sv!PFA26$1p%ougq8lNJ`L1ltub))lXh>>xZ2&C6phC@6sT*(0CM zyU-ZR-Y{}|b7KWZ{`mx5KAwKfH*>y${171h=ZAZ{yOrmY-@e5_ea6Pi?Sq;ode)XL z^*3=Zfy_RoFDMVQ1Nemfn-kt%Qx8X6i8 z$R{9E8$>H&L(jpY&I)#kP^d@#Kogt)JpsOYgKz$YBpV!lzaTABMT2|i&K)2UWMC|U zLPF@F#tqQ<2y7u@;b(~JBf#>%^KWr`z_eUKA~hY1iJl->ADJQG6-mdgSNaPM99YA@ zawQU>f)u7E1VhhCyVGH*k7sB>A@eg?$;HK`4SWv;Ens!X$&c7MoTYw* zdB3=|W$%(KHsf{y*_HdwWILmE1m zX_J^c*$wk5C_KD-ZjM$`QZno3uV;%LLC`5Z3G$mMkn(~(<;56Ju5M+rlN(XKoCt`9 z{jhR`U!4;?`@btdqD4VPW$ALt+brZGE1}e=z6~lPAG~@c3Yv;9F9Y?eBv%?nnKB>b z@-5|ChrB1&O2oU;uR@mFFSjxx07niz2S+Ga!(}}t3N9<-=59>C`a1O2_a~lQZCcxy zMll8d!~!G6KS)SHC)sA?z#bD&;eR(qY|F$yVO7k2M{ml0Zkl6}UMMhb*Su zPY>Co%*0lM=-#6K*C$WErULz+=k(>hQkGm>uHrn@d!!a?ED4ZoVL%PG5ej z$Zo|-g5vejPNZ6%jiH(FlM!8-*}D`Cszzgc*L2!Kzw1BY6%Eg|d7}4Q)KNV7OG{@P z!#t_7%loaYW?s>_T$|eDO6x2tBO9d#Ig{2QhF5k%Dr1VOU!U4IvP9K0b^d9sBIVw0 zPVIO&Mio^>Vw?9KM`M&o1}nScK&yokqSb1?2Qspy=4d3wy5-Xtwg*NLiOb)UtE{zt z3yR7pP}Im3DhQonm?Ja9aFVcDm92q+7grW5_~Khp>qdpRcI`;LfJ$E)KZ)%(yg_p6 zOon<(euAFe{MI~VtV*7fM=|)aMX5z!!^NDjx>7VCXEiEN;*jj>G{fhqmh@&svBKgN zZp`J1=nd;(Ah*$cj*3%%|KX!@ILaJLGgV|zWBPXc7U}hRQ(CD>uxZJWo35niQ%FT$ z4(2&nlzrt*R;)^qqA*sS=~%chvQ6ai<%^MJS#=Qhg5t653#=2z*D&^z!#RtK8|?zV z*1kJc(q98E@53#*(As$@JyB$3$~1vv>KzyHOU4_dZXd-OckYc*F_Ip#c%W^!_p?qS+N`w_%rTTMu@A##O`xfc2%&U zY|0$@yxn^(Vq5bJzUyp8oJq2jcwyz1s)369qJgjfF| z6c1OlWs}fMP}5?m5OrJ`XeOGs$v*41h;1q=qi$yFXN8Vd4ZQ2KdHw^nIaD_;OFH? zWIrdiE!88x;nu)L^52~j)N5`Mb&4_mGx0DHoLLnE;L8EeC6iyQJ^3k5<(APcRxTOp z%cyUVo=M>!Zw1+cPF<7PuVO_Uo;&nASU_#UI7Xm8mR8e09o&Z9U^`b4WBDR$< zXQPyzj+a?O6L8iLdwzK|wC8hYhhdFj<__U#m`oNu%J~`r{HO+qAYTg>*cj3Ph`!4~ zqJ*aYBBVA$sgp2&UQ@2LnpM_M^LOf`{Fy0o5h|1C#ql`xe7M33iJkn1b}g`DVPIlT zHWNkH+2+)6QW|EOo7IDa})NcZ=?;IM!%^}KDOXJ%2B4kp&#l}{M5hW6bxO`ro zI^V5l8$|$iuz!;{aMuu4)v9LYZ}!PKyko>C+E?P>?=T;&Bp7*l;yn&gjx3~W^w~Bx zDpwQ~9dd<&{1t=^hjc+87KC(nL^Tr@0%enzh2d%Ft=#q_>CbWvEa((X8QT8U-HLhQ zLInez^d=6qDukVzJY{JMiOwKU0KCunJeC#=pdpL=b7dum$@eXtugJeC79^b~3D`u=oUjB+aQ{ZeL+1+9_c?&=dn3CIU_)!L&nDd#Mq!JHybZDU|?Y2ftah`vg)2qO>3)^ zOviFdoH1L<9QwYynF$PwL8~6?3fGhj7U}nM4ey%i%l9r6;$P7EvFdGty-REh(gltT zB0d00vaGVeT%p8^x$_A=8)vwE+ZV!##Xo;kkW|8YQQ4*WYAi=Zt>Z!)<~v+kRS4y* zzvkm3EV=6p|Qi(MpLxJg~E9n>u$M z5)bIyo$%4UcSh>+uXoHn<4i?6vk{OLW$2)W(a#BmoF0aHq8N^!|C>Fk(ephFA9@&U zOeoGeJ34y6FE^*0fPet08W-vVGAACAw22k1_P<>306^e#VrW=((gv^HF zDt2kW_IvliuW-FS{QUu<$_Fkk)hJ*mV>+<1zRm{z(jS1aH)wiQQ}^jpFIX5c(9wbC zP9esXE6WLBxvntU=UHGKtPo8in(Z=*s*q*+@~($LfurR7w?;Kg^=Kb{Fu$$Af@JKu|s( zmxKy)K96Gue0-blXyc7w5a6t9UrQ`K>5!-~@V_DuI!G zaT;XJSfLB>$FDF5*p<&FxOVpTs=T=Jt&6ns!fK=l@asMPRzhmyJCQ96PxV?BqyQ^H zB!myCPM@UnhGuUF@sR-^_XMkL+bQn+i#K5=?xNh+H*|xA^2lk3w*`X;al@}Kv<6&3Ne7TLUEW@3M*+D7 zY4O94VUX$wfzTbPZ@*<#w+@u;EdhbA%kNHL$b%)%kK3norKEgRrV-N&$k8uBs_iG# z8X!Ufh$ok0r~26++aatq0s&#!sVm}>k@div9FE{)Fi^Uej3NPKjDQlP5Oss3y%s{UrbR>=Xd#)u7Q9yv6YoiiI_D8h} z3?!;G^!bI<(l5AqdLg0Mz(6cOQGS}iK0YWCXZvGG*CRg8oj)5i%ZXN*hIL^%oPN(^ ze?%Vf=Yfxa63SwxR@inqhWCz{nHd~o9}*K4K`)PBQK<~ORz1Z9Kuyk#2wH(Bzy9MR zPqZdrpSwec*y}Ak-DP4aq&c4GYb;*)-N!wfio zqo!BHA)RkJ%@+WdqJSX(VjlSOCD?0j15|{?83T8>3rX&kBu+ZIH*ieglak8I$oLI> z%B(d|@500;nO{Gdc-91SZfAG5ZF)Kh6k5BW#V1{>3j=`@vU0O?bDcJSh%hO~x560} z@>R|Ykz71~&H<}=0W6U2)R?GWU{bg2IvGckSg}p9{q$?ks;Dr(k3|?C$D_Pvl_aRr z7o{nN?Qxe~zeGq>N#h&RySe2o7I5q+h;9mXOL{@u$FR2}5Y+AzKr?dVTF`A6 z?EU+|!2X_t0}mtu{NBCe0}>kf5@J9EEkChvaIVb5RyPl_9t$WL)Gjkl0T-P#*m;K` zmEchYAUp(qtI~Nz6?W<;Ri*j1B+)x^klrwbT>$bicvMu%keUc~(su`r3hCVqXF&!m zQOKA^f!EB!=BDwg5ab42$HZ(QcPceFmI9I|ZYW=2IRS%(YsUNFyRnDjPXxIK`EeBaf37A_(LL){98up3aHf zks~A`(oURt+UWpi8tmquVSk4_1INp=I82x(vNAM@&=+(xb8|ykZ_2}=Z9yZ14sC%F zK`ybh{Gn*0+(vX;4O2Bv%z}c5G17ZD$Q;4vIx{P){!i_+HE09tS52yxh-9aGEOyY0 zQvTfYi~qJ*M0B(k*ABZ0R+ca3wRUYe--l0^G5iIs5N<(U1C~kbl*+c; zQQ4#uryJqVf@j)YH;s~iD<+8~sXsw;#*F_$Rz4Z2vt&n)StrI)!VM|U+v2a(r>WfYlTtL2JZQL#M2$uiMtjlT$0U@64kAPZ zh}2Fe(4yE!^C?I3@8*`7y!ox%UJ0+W9ma`hwpSszR^wTAqQ#int*-yVCG7pHs^89H z?cevqLbghAVHeU>4iM#0WHrWMV_&d6X}*yAA?4cH8km^7zyQVCF+MI?&P4AX3Ykg8 z%413hUT&r;_v|$o?)Em7eJJ|1DS$mjTrGodKge{Lb-rGA39lE3WGU6JCI3{U#49CI z$~{t7)v$P)XbIT?-kf`{Im8~j#5$TN#we2-x8E0t_?_wYpyid?7*%)`k?pMTy%7?C zOBkEw`ffiiZ@QMA+6MLbRu|5DIi|i=j$^57rDzL)iN)ymV6g72uuKun3V+_tufr?# zo3jkqe*a(8P9l31lRP)^pM}iD!bWzb5)&=Fa{Y*rzNDwRt%a6o5t4;G} zJ^p0{=u@xFA;%3jXMb-eF?UIc!$qospX_R5hMiDsDhYp+cWT-T6{lWT!I zTbx$oYwcFbtIea9U(AUdmKGUxFHtG;e6KCa1jldowNg65C;4v%TJMGUtMa>k&b3iR z)){6D2aecMz?Y5(m?4Dk3T|Aks$-5}BH`xpv`_kxXEID*WQdfa@l49l#8>vU@)Rp2 z0d~c<<`xUP@b?zbZZ}u4P$tp$ytU+8%m7MHgA$;P5{<|zR()faR^#`~< zc)>`z;+Rw$RBm@+#8a19W5cSB{31=)`1BH#21t4O9UR)-fi;@T$cx?S;2U6hwMgyv zOhB$pm*a8fz_0s^RX%mXv)lQ7I#)8bU+8c^9-=BRER4p|<;p-sV9zqd#neKg@~lM# z%E{GMZ!0!B1UaKHh??+D1~!Yvr>ZgdqHirw~c&i*4+3>EV7z&b;~YVaq5<3+48Q%|_AmM@c`CgjPDGn&0ksu6O zZv*8JYefqRJr4bHAJEAG;VLgBg#v*vqC=4#bY~Z-9yKEnlO=Ak?vrSLs91+Bn+I8$ zJ=saUp{RVDu#$9lcIswp^ll0o9oRWd)=9bJa6zHA2=O-%6CuF<0*sXd6~ZxK2n3A6 zAI-te4{1q(NELyHKtYO`k&Z+#W9nR3x8_8kJC7oSJ_y$d^_X9wl?+r+^8waIA~N=} zM$OgakCD>s;+etTIkx?5Ygrs(IDVa1i_(HWwWKm@j8Pdk@9Bzqj4-Jyi1ftNZp+x9 zxDb*-etP#8$ReNYEOr7F&IbWU(s-Fc)jJUGIUW8sfQgGpYGpxA@Tb;0M==Jh*6yM} zbvN_?xyb=S1?X!I(M z5S=5u_dWz;^Yf-a-Mkp{f)G^@QL!TqoDgnt>V`o`g}e)(_GO^edxEedo#4}7V&8>r zrv&);`0}As5pX6Qz*2&m7ZFeEJ5Lnqg!J@0c=j4-FGP6=6$-yjQv}7b$z&h)Kiv^b zO1M@Wh^x`rJX*G*@KvB&J09NBd8$zBLl_PrJ*=y$_1g4bRymeB!GaDPP;bmMyj+3z zV+F_)JSu6&4*;Q>ftVCw#Q;eltzn?TJ*3mTqVN2UCISV9fT^{O4Tm=fKQKBsvfY`uarK z5X@6R+SmU~e_ZK}VV4>dcd4kT07XK|_O=6}dVKHz3uNb*rXZc65_V|K9RQ(*Bj7Q# z7H9W7jHow1)XF{L2O6>6KC$-Bg?1$7qN+ON3}kQDVqJYd=o=WxAV=39j;(1R*Uidp z?0KML{A!I6F*`#+B*Q>k7jKvV7Xy{O7ER$rkd8qnT}Ouu_`-Sjoz7VUNrl|Z@UVK) z65s{PHot3#-`@XPbZJ3(JzC2gu!*06tB>9I1T5=}Hkmjm>EXfSA@MQ>GXJDQ*5_g1 zs5ys-cfnnez{l(CWF$lSDq_h9gd_^${|Gh7SJMGc^zo~r2F?|>Kqo{xHg4{52^Tf)H|=_ z8`bY}Zh1cf@6W*Z?>ix*1wH`4@})hSjgKb-P$UEC%C+wm^lNLF;p;CqeX3t}HiSXarelR)9ty*gk6X9H8HIX^x*Az|-6*b)bIcG4RXr{Jj;`#4fPJw0$r zwT*q${QTHND=(d8Dn@AH**~T9Pw{S_Fdi?h0Tx{VqrDZdO91+rZfI{)ZelCM zcybJuCTu|0AGv|#ECMFu!>zMZFeeZJ9b3jB=TR_^7_e9WWZdLfjgw~NsW}%c?jT4V zpg|t2AW)=DiKT1diGNHlf&U9cV>BBp@c0|;%5wW#9Q*DTeLH2<_hdP`NNf`l#BS7C z)o0MgaX+zd+_{2W0yG`kC5ADeF+g+)8z)H36J#zm0UpEbL7L13hJ<9n-uz;+B_Hyi zaa$))wg0{GJ>qig0qze-o3O^+UUpdt2{Y;4*j7fsSYH?|)6ABQY$F2x{oDamOf9^FovI{-YxHq^%4!4g) z7|S4SZv`HgFE-j|_uWAQs8M|l1_En=MIvcJDTP-+UPK!n`^DyuFCg>-nM5{-CtwSj zG1UHhdRhgFCmb5F9@vDzL$!Y3o6o};Z_uH^Ny9$m0n_)Eu(0riYiepL2rR!g;jQZxbUVIRlnIMTHdC($t(QY*imgEFmAZ2nXW=^l-`r5g2kc7_$+0c(L%9*!Jum zqR(0Be=>EIuzC3@ZVT9@^ZlA@g^cKr{SawmXKWlY9v{RS6YN($2j;8h!Bf7l-P&?i zG`8Xs*)&a*2oLVA2ob`UeFe?%cyk+itFMGk(+3a}3#$`E+L^svAnDTw~-B-pj|VRe7QP&dqP6sAze1QF{YjMvVpG&dhL?< zh^2yIrNuSw#%(kRYcgTdBSJ4&wj{zIO(DpEv`SG;3LLPAD$B#u(;W`il9hfaJxc&f zYLF=*qjedSX?-WMr1{LIQ&|4$;Avx1lZeYI9-@+>q4ECKj*pLzG|0R`A&}o=`vT+{ zFzJ_)cDjBZz=BPW&VTQ<4Mbam z_$k-=T#KI{1{ee-4DdyLVSvFHa6JXG43g#Hfq`N>9fYIc+RmFaFn$0oFryu)vLwAEJdVrj>gpaqTTDR{nA)}{)}z@$u4hGM z&1{fO90i%|hBsu&2C7=#?2>#nx#x~8I=i$c23oIwuUEgfXVGYP+>pB&PO~OupPq`{ z&!6cHG7y>&f0vwA!MBR7Dui>gObR-_4;cU5HH-gbDb?ZO{_558-H+*U6DIU6_wL;j zI?{24X$tu>G?AkRa}%UHp`apOky+Fi)dB7V4lH-17$31&v% zVNaocTz}2}Ie%Gby@>a@7(9{{JVdhi>)6mxBuMs~eBRZ`coE<)>j$`LVEMq@b^UAo z+U=}2%c_kM;v=r!X>EDJ?tANH>5cv($b(ff2XIYsOl+Osl(LqXB@kaU48?SCF6Or@@E=RwpZDX;v`wYzI_^01pw7n}sX&(oD z;aG400&WnZCM0=lJ@ZKrc8e^4S^kOg!{5FgcIyFPKvJp@&eQYoM1Z;wwp}bDFS|C% z>3;5?@4=DUOqq!g)-`g%!P67c(5UL_>iWt~AHdNtbo-hJX4_mI^QY!VUcpXk56yO$ zzag*5xv_7|-9in=Q;m{@4J}Ygsq9Gv&b1E+a1wu&xVo^m1?ntU{~^QF|WL;EmfnL+Xz`JUsFr ze&m8O$aIL`pxieF^v_F4wmlKIsU*FUfx_F*)f*tL8F<4tE4;Gkca0G1=1t_nKnz6y ziPH3-`{4bZ*?H*XnFrf95Pf`5{s1SAj=7$#qNx47?uN!>`NP6EC zd>9v^Fo^V`5)u?bNJK84+5fv?DwI^>tat?jLmi|Tx*$k~rSCid$Hg3A&hVBNNhG%b zCgbksEdwQ>?*G5-Ya%9YFQ4c7-d2V*sjWuPt`Cbuy&L|7pINWbHq9Y^g{EPm^1ost zaVyNCGNmFDE4&KLr}4@^aBrZ!LbGeVLSz!}r^7G(b?EOOT0%nloDW*gG)ooMpk5Hb zpG}z2Q>ky}fV{H}wMZt>m?dTrfqTn`^PDe^pbJ3w24K%Hei@BiwuW%}g+@L6X>rv8r~%&sUUK#*E-5P6syEnd)}2ao_0bH z#ueS#yzhkOHcwfV|iFM$w$wI z#MW-o57mH%__(_Igu|BiZpVOA@NJUL$5K}KUUF`RrMz<*%zIy}E9F?j(9Z)|q6x5F zblMIVXW0vF4FAp#19ealJ$IJ^ha+WHIw#INEyw(yXhC#>LiS$)waonYMNUg3p=B$Wz{mp(G*<4 z^8EbnH@5N2GCKV~N~~vj@rx$q#^`Z5^rOYMN-ksbCS)YMd7m?K1j{`^#MyG>h356A zHC>t)cFJ>u7)md`_>Bp0n&3RD4q|Is(1>E!z&ZuSLB(cYZxk83O#?BmU}j9d7@j|g zlvSg=Rufi36iEu|Yo@@R?Cdc94&Ii`$q&L?S!|20n_Z6>nS}C|{mh$<<3`6{{Oz z#?4^0N=~so4U>ZagjhNa$s)BSR$=tW`Jc-0x?G%vB;#$Tm>(*9T0RXvB9{D7lIvw* zlqpJM)%QiN9Ap2;ok!2QFT%iE z5^L4&HA*n?DHH~8vyo)V>aQ%`AMTe}znbL?qz*%ObdVH28*AtJ=%yHi25yPRX|0c2 zU+|82y`a@u#FYl!xks2ub?W)d z&fwL^^>$;rsHH>cwi}p#@N;_wQ^P0hd4>h@7#(h8FqsPJ{B*F{7qN`_s!Otne}Ym~ zW#q1_hMsLR*gg^>go~-CRDR}Qx|M8NQ-X0?#|T`;!L}e%Fpt4!TqeRl`|A0*G1t0L zaC3x-NV6*yKUL*hkkgS!U<@V_JvzAiPH^C_@beKNP+X!jDKlzS`-5_n&t2as^^?nk z4_};4Gn6gat#68X@6g#Z-q5l{hRpIRNtijBZx!RD%Btc{LAslkADO9_|MgJrkh1l$ z>fKhekXkmKZGoiE+V|VDxb(>V+NO0X(ix^&hye$Le8eThPt_|QlXbMZRJ(z8`0z1F zSpBbm6&=f(p@yu~ogL<_W7%ZF{Q8~-nx62Ec9rF>_JqhTphj>q3W-smGIaarKW6;u zRnbu#i$Y7=th-GWd|}-9Ko8M%PL7%0Wk$tcFjT0fjp5)mr^EdIGuJu`TS&#(3+Hu? z3g1pErbC7Ih|oHA!Q0F{sSmU5dZS$oU*1~sJGNfqa0%YZYrZ2Im21ODFQjWg7sdGS z+6&L8dpj|j3&BAJbTX*+U#EM$_oFfrb%kK)mKTHb45VUOAz^$+4t=GGL%72}mDl7! z=kq(ctXT3ppF6R|a^{E&ZJwkNaG=>8KIMjqXpAp$)sEC`_;>TV^Xr-to5UTeT5Cf8 zt7u%y1oe5g*(@ZgfAaX0(*Mu}DMvC{>gT4HDmbRmv<+A9N~7>D*o4=b>niz7D$@lk zl3=F*N7wQ_>k%9q0Y9O7*v%Ae$!-ovA%dKcH_P$lW^PReWWVQxaPy!iCmNgDbP#$jmu@#cyEBSH8U{+a`o>n1Ltk{(&sx3mFh$@7&HmgnU)kWIXr*}mDSZFkRKRM&atM1?NcLOX5rxvq0E-Z zX^wJ=@5~AN7c4R@jIv|Bd;uxD=t_f-d=x!w7+q!(!*UDu_dk4E#R9Tet}4oDjcSxl z$Ne{;B#!*4^EMa-E9N{|x$!|}WDXo9M84=21bh!$##P69#R52iy+@7z^Y;}g=7QqR zrI55~ildlUVK)$K4&}Aa-9_oIA9GUf!I^2+ds1bMUU;lt!g3mRs#zGgP3%B7cHab< zp?~Mg+q1l9$1FbKoVQ9 z$DP#17pUZi<2JEq%_Oqj{%2o139t)n5~Ur#v)j_SnRjOn5Vv8fHUMP-7qbB3?62D% zIo^9b(W0_o&J9ceU(*Onf@CTnEt)#wD8TG^{?9#HlS;zl`zlLL*SCKY+O%kb*BjE7 z1h%kU@K*0I>*vHMi^9bE&~9u)xUK$u?KTEJqe3Xg^0afEpd_!tqCH8o)QFUyan)&| zO3p~x2vVDbc$%bopO;yQL#eP&r}@JoA+S(^?AgQhzUM+nQVwc80|NrOIcuJ%F&=pS zS=%BP7ZXEdnh-Aw2$TilU(X`vHsTnHg(LEt`PNnLrpgMG0adwmg8O zJOUi@{QTT*3Ka?6t1OMdAF0sZeFwfO@Mr_^G7?b-FEJ1y55gb3OhC{vGb8$gjxsz5 zdc7caM&j2T98NxYves{KZ3V< z_)CKq{ebF-gW~oxG;LR>8}~RZp8_eU?KLiVM3WmE|44O)rVue`lmL|SQQw3{=2GJe zT~k$7=FB<9u-+4UT2Ph{o8MDz=gwafQP-n+k-K6)R@|MqO8u#9Wvg_onv*eo1-yEm2>+4)kkb=JCg@Cq^K@jXAWG%z#-{o#cgivdPKK}r}WWUa#R zf%wcJD|$T=Ud=%OJpjABb-DDmY}684PhYF%Ih<5U7s6Buv`0Kt%wLf7^S zkTJ`I0K5K&jP;_aj4t_GM>z@}?WuWNk-W@EwB*#W+DG*5`(Cp$Py37;VYSX>jg=W& zH+dz5#CM4HMKT}0O}I-+Q5QBL?IGX3S0m}cw&K3Jiv$EB+AWat?|{T@s`L*~ZVL@g zD#9-V8xG-XLSv)qNwMHI_UZG_B%aMCBP=Hp*_M@Lx3Sp$wEBF<_!|95l%@>AQR!d~UoxzXl#91u z6d@L=_;IJ$dO5X|(mwn5-hN>K{#=b`%UFuOvTF@cK+wV|DL5wb|1mIB$o@WPg0Gki z)l5emTF6NNfU4D4JQWcU0Z}pbE!gvb@JMx?z7at@lS7FA?`_WsCU)UZV^rv(#ZC*K zGQ=83L6X$ozuz;S2AbyQZ979p23i!;&bQHJ_tg8wM&$W=@Kjj!S($_%PX-_p=^#h~nwfbEV19O=7Ur}j72OGHT3Y@66@X!5($b!Sx)93> zeDe_3XJ9yI19HFIS`owx5rkF1P=FQbjWPSt+x5`*>^NJT7=R06G1lYOrI!zdKwTe3 zCg>0PY9iKTQ9VqRJ_h; zxiIrIzt3i8agI8@AZWqTTL;dM!M$hi9}IoZ%;hx#IrbuKp01uADsRLSX$6+#5=5su zFFgUm1dtWez(ZgK8Y{WRpL{7E*023aO9!y_t~(t9QiBmwKltb&9aaeNLJ)5V@e3m` zd|_hhyxT~8(AQVOS`O5Pug#vn1fCDQ{Qdp&yyO^8P^YCl#`MEO9Q+#l^3a=1mRkcn zggFKxg4XJ^;tIur`2&3{1SS(%k2y-p8wk*xBNw?|h)Mp6zQ@R>vDO_BLZ1s~7Sb() zjk2(~*TXIbycFdB0ftA42q2Q-UjEPlSBVd#X#MHj7#79p!{iAzgxO@2z~VMbSoqxA zo9(_eE4{b}k!P+@FS(G!GIGVYNRJlkRmHX_WbHW=P3X{=8!F44{r!t{X+aiUSf%5= zzuF$o-TE0I#xNG@rR7F@kHo3(0r<}@>lW7vyLvCtxw1C<@0#>Fo-)L>nhAz6*sjEx}nJ;&y(9W zdWFS)uH>Ei_eH;rK9$V0H)~}BZkF#+{e28qvnV>+;z`*4X-9d@!CDnAd$K;RZERR- zq07)$4PFFh(7i?i^uSOP$@qiAov01CNuEH_O$H#a7_bvo5QuXezO@JDPBWzZB4|y- zb%8J_WJtmS5QYZejCcwLk5A;~O<_+-wBN1=^m$=@U4Qcd!XdF3N*{o%iwADMsS&46 zAkuI@Y=u|}wAc5+mq?{4wdMGg3=AM7v9ELka0AM;n$mT)2wv!yf(``mKDfUuz`(N? zS7{qo34&$ZDsQ#9F39Qkz?E_roK8kEAK@Z97@%qyH#fJUp7cn&M=BCuq_;&q^I=KK}(t9RX8Z7F0iRp&xmxgslu5aR%#LIE;?BhAHFh8@uP_S)Dv;HvxcTENDXd| z!v#Xran8TEI5;Ti7ju$9HVB^CFz(=cdYyzMv!Z!7thkt7#6typ25eklziUGqzXYlR z=eO3r<&mvV|BNQe^a~mr8w=9J@88$HZ#S6X+y3BJ3rF0vFXsEBL-IU(XWG`c=o+QS9B@UIG zcj^(LUQacZm~Y(u;NY=4S}QipmmV1ZHb6=OB1ZW`xDptG51ucGSqN5P`jw{s6&0k9 zzy;n0(7a*pQ-I8^9UUuytFH+jKIPy;sI55;-%Jy5X-Rva03EK4D+s%9mV#9$yNzvo z03HUCP&S5hLegPI(PZHrs28B&LVgnT+A2U!(`s2x)DJ`N!9{W%l0;O02~JcP8{0$_ zu$TRX8=*B^-w~I;;$qnOT3}b10^*pE;$kld(`3(tax)IwV+{x?eK+<%c5aziOA?qXi7)}#W|(4T zHo9Lv$uD|6AuCUdrb2>a1)cwEkh;Lvb;8tM?}q(1JQi!dwf7(QvuM(a|C)U$=CytZ z>(HCPIQr@6EU(hIP63glrB6X||H>n%P00L7i+|egxB|stl&{s@-xu6a(Z0h}hXDxT z@H!n`sgRJ+DIB=#@XQK}`U_kt0RaI`P0f1yseE8SNQ;*gi*2{zLa{3^_B&IH3J<@# z=BeA{R(5)F@(XAM;Zd-t!s`Pk{GNrj@>y zRw54CtGSnU&-i>dDSHF4C?dMf|3p(0tUqKA4iCQpeX7~&A1ppf=Koe)1?Ko{XKDD8 zn5lXZ1)fHz+OgH?tuLiEB)l0`-p^=yjWT>XW{HyCXxfj$3H&zpieH3vO@g<-YiQPP zw$n2Ed*TQdIkgfpV|t17T!R}Y2N?;(xc}va6^C^{u(c# z!UBqwLDA92X5I`vS|@mJVIkThh}t2ixcCByhgDuNu$}gq=!HpN%PUDy*GqBZa8Y^W z7Grn$WN$cC(mg2T8Dp{wHqp2rBkrpmAvYSFJ)PUZbR?t62PD2W_~1wdhBqS`1^fYJ z=|AKTh1lTC?ELW~1Gcc5?VUu;g37O71n{w824ul*2Qf$nARVzJ12H3(`Ggop(LmUk zJI4!qG|;Nz;8F-Ij=m3By0ghc8niorW)?7;-}z^dF{_}w@I@{)`U%<_!(l>KS+7P5`>YVgYBLTdrLY9pf{rdJSy^jG{`A&kvkZSFl(Kgsje%*l_{}tP!$fsdkxsN zw&01QG#uf=+H`0lXRnppYUXKk7nVt)EWKwSP=j0mH{4#mi?3pq2v1A`S|W`iaQ zQU1XoP*Hp?Q{KwEvopzSk0YjqcQbnPGc%!;J=>P%Ve=g_)N)&v2zT(<*!#R-6KbsD z2Uruy{Py^STIfALmw0tKSK1fghYdcbw7{kYN(BxQI1K;!K*fMt)#c-ypFhCR8u6xv zix|CGcLW13FDYwb8Z{|tJ6sBoI|IBAVRW$k#@L#Xfke_+HkaN*!apN%*(GjjK%2YXvAFe*z1ZZJ}wRlVU>X#uZKDxGafO7Gf}`JP6SnlEdg+7#FM+{-gM z)M-stq9#{`MkB=~N@3J3ahK+2466!{K71XE`>wE+F;l3j2WwLSi(*fO?v(7C=M&~M z!wnZPhX(g1`aj>bSTRM9FC=3B!!p%4slmS)M)fH4@$-tNMd5Ma^R9qv-Jkr+*H{{a z$vd~7z@-ME$qSsGEH*~V)|rahn~l~9okU0!j@{`^v&P(0)@6~@D(@5_!>i<2?}G;h zoP6Uif{rhGd@tj&DPJ*gjN;#V86{{lPT1GS&?p<_V9eW7bmE!d`@x>tHHLhUn!=8p zN-_{QV)V(CG{N&UBKNGrKjaX#nP@*#Om!El$MtL#^U)aIn?Xt8?!`0vC*={|i}!I}QZ_$RDvnG^`Z$$$3`F9>p5QxJVDG`iX~2OVE;@-UfF8O;365wu`=MI@nAeLOSU@8mOed!M}FQ-7K=S-nh);h*FyFX6$ZM8l=ee(l98^0e|a z4ywl*zlaIj@^K|wS$`B)s@dh=^3nUzgLl1~=CUtq&+BftM-@|pxg_7`HY*7`w+-l1 zYEPCI;x1YFo_JyCh)n%CLm5h0w}ciJ$1yv?d?e+l_;$I@<&fTPZ&bK`&g{pGKD)e6 z9ayhRJ{J^qm^{nF4`t0*{!{IBdP`_?)8lFm*Sij!1^H`L_!`UN<~Pl$WnTS^k<%wS z)|2oITbCJBy*Z~vY9yWOW0s>~-lH}v+4zW)G5>1ZxF+FADVdP$jY!&2^()=khRc{9 zo=o0KDxIr}s^)pxSG1V-V?>T*Y^h!20&Y4QWU&dZ=uleDRBOViz#XlKX*N7=;P~ns zVQot%(IDy4$L?p3n&eL(3t&6E&q5rRrx}jggcT7b^V(p+{}I6({}Rp1SclJQ=#IsM zmcN+n#(Ccsh^XlaO-C)_mtF87kE^8#R(%M+cvoq^R(E;Tx+cgeJ2%PQ-&?U*NyS4d zVReZ|SLcw_l0h?6PtrZ)jkpt|9PWGev+`cQ3+EPh`_%hyn{^fn3Hp-z@NQty*&i{} z|J$+$79y;|2J3*`2yZK^xMX<9h|faT&^@%KK^?Zw4+gHm6dvD}VcT(5NuYX#Z|&AOYvGKf`-v z?h8q6^=*F$ezmu9MBijO*^CAd)n%H{w8+-?#g$gMzxgJIV_HX@1WBc4 zkUQEUE2nPD^76cU@=kfM>cDh*EjCx36XS;*0@F7+j^SuO7v<6@c7IAmKI+#4uENd_ z{Hs+1@h+1(lizYnanq#w7b!RHBxiE3sWN4ff1^+^{Phs#)X|dDNWUx;UgJ{~1{Q1# zZ6s9taREn1!tv&mim^Uo+|Am-CJjjh1LPdor2$nr^xT3^y{CA-)kW+3YY~WJZ535N z5Q21HImjs?Tv-sjUOxX4pHq}W23u1$JCMT7x zf2Iw|-Br0sb-8Zgx>WWU_GzM*7kx?0%L(}6B$uh&dn~CBLS>oktE?YtBve~C zvA>gTS9?<6pu$$z`od}9z0z58e=rLUry*DQ2QkS*4fo%5oDU6!<-|yF<_U1w8h*NF zb99@kF7TY&wr*SxUI}+vv(VHCbc1URX63!G^sDT$mgcu==7f%Bw{ z-i!4Kc>Rj~c_G<)>QHul=W=G#B0piy8B%tzSHc{n@S<0*M#H@PNgyOmeK4n|Sxs@i zOwz4P+nw~YFVmzULw3IwyX%3#WolfH43ugWx+C|5d+tlTi zX);H}V6v_JJeewr%*mAT^-Vl8SxT5S4+>+CQ$@Z`ojkvw`;moSvxbPw# ziz5-8`ztV)M6Uej*AfngNUxPGvrN`bQki!{cmyeo9O|h}952+ag?u)0?}0fzsBE@Y zXrJH;d3uucqeKZF)9kK0mIEsfZ(Z>iLdo$Q&|K|w@l+i7IsW10#MX0c>;k*qYsooy zm-Xe?4AVQ5;t%uoX&)-}i#!ce8fSs>H9~V#>YvQt@{mnRtfapx#$`;rlJ~I+qv4;o zBvv?fS|+@`qPig`cAEog7EUIeJZto-7`5$}5*oT1`YVwz&^;6eCB4Q~jcOdNWT~q@ z;$r;k7ioi6_L6fsv!a)zgF))SfB5P+CDYki zMN$*cQ<{+i?2rG_2{ji9x<}||+xH5u+fI|&n+Uyavta5_A%8)tHQBp}y65MWY*%Ij zSNbt*c`DVYlDSl}j{5?yK7JNjyGHW4@W!?utKn;9@?e&bCtgo8rg$RO7J21p{qb*_ z@}YF1Qz}a~w0%&E1g0vb*%K7{K?Z#+81oo*JyY@2vVg+fyydyU+^pSC#og3!D3%)h z%z25%iH~Wk<=eQq7mA|dmQ;#RzVgT^v{G{Z1sB!LvGL1faE_!)QgI%4w!f#F^P3{O zx?k6zJtvk~gwI#iQ1npj%GJ)oSM&+B0*+Ptg=o^u`Ou_Y6|%)ebd+mxG`p6GO+FuX6SJh|lh<%L&RnrF&u3hJ*vF$I0jwkl|42|JRT+EwA0TCk7e z6FPbLrP#&*7RK-ce_6xrWb%l|Y`=GEG^nYYB=qNH_3aq#<|%2pF8IniGAauByyfQ; z8{mnMEPi>don7`-F9A{|WsMz}Lf8n({3l-RrkM8P&~$%q&xsYpqWH-kfg;y8IjAMA zCdIm9Os?Ui%OlFGVHBk_evWfPiOCK{z}U;K(BPu?*2nn94y+7Lj&LCYTqTi!zqdun zNwB9vBC{_ro-y(Kpv+ba-l;3HeNNq7)SYK7tcrszm11PL(f!c1jmU$x0n6n5W6ygG zWBaA>*Si*D1(S%C?j|h~oJ*Jv10abtzy3I+v1u-P`q86`RE7CWyd&n|-b>>Y3Z?3o zSbe10`v+rtLo*2&e^XxiOE&O;w3DazR_`)aF`dG7F5wc4QG|MG==KNpVgFGR7sC$6 z?;6VzS39>K6kMJ413^GJTu>R@FQ~7EB+mbhIz|z!ovi-}Z{Aq+#QK2>rF$-XcJ^`O zd{zDC#PGC8Gu=8SDzuU_BG=41)uB5BA>4JULn4-0(@XTYin_l zUyE{C*q8SX^mShtifII1q!7^{kx?a%LrH?kkfS?(x2^+pmt4iH!-rHVZV2sPtlaag zxMv^XVpH*f&H{UYq+Ee8M(^&REp@PWLdBh;#1kEP$2T8LD+CU>&X;OZl#S}RK73qH zCSGsxdiFYO*LL2IoMS8Y>hluk--IFhIDTQhUt_77?-O=nxh)M-ZDTv<6I(u(j*fO) z)49^BVqTzU5c`}=u(MEG#DOuO>B7m1v*xA^ymnHrQ&CarrkgELTH}VCRr$B9(?yLL z1VVjtHFfzL%C>B*Vdd6X+{LlX7XJx*=u*W(%&|w6EsK07k4S1N%z){kY0!e5Is5DHvQH5q$B&zo-E*IiRM`1VjnYy~LIr)h^-a)oXYk{XFkT`QEkt*I|uGD6=J?qkV|q>O4-3r*!jk@YjGG*32l9SM6LqqT}W4D{M*lz>3XSGkTi)l<=+lI zQQ^!0ztv&zuDO2yJV#0ay6>R!MIT&2Sfi!R=%`4t#oUsYNAD(Bvqva=4>g(i;jbTJLz@;n~wO8Y-yh|+TmdJ!0r zGLsK=|Mxm}sjJoGl$!z2`JNb{6cys83<64c#YaH1BmfMwsQf`rfcS=juDTnPM3;$) zEq9l`AiaZ9<4@@T1K)F6kn#dOvwe%lVj5;3m{)@Tt0c!RMRRf8<`Yp8dip^SpW={@ z%>bpJ3{0w@7xh3O6ylwWgk8f}tp4~U{-X7S1wr_~<-bM3!+=|Yc-t~|fMF`q>p+~C zp~tenF_navC;<+24^nhM-htBwjWZ;D41DfE^U8wo21swqAQ4H3iWnvXpO~0iAPRA7 z0ohmzNH`*mTD*2ZNTHUJ-N~Hh4WYl5&D|Yl=lccXRiK7KdN1ICix>p~klhS++6b7@ z$63D(RxQtTwHh~VtwC`r3sN5t1xc@f;06(ILKh<#9FVrbK$s6=(%3WB?HtE`(qNOI zn26&9EHT_-k6Ya6EQutQRm)SvO5LuZBmoEFucNw}^B(?fJ|-4rLo@0IEws3V1Zf)^ zb|8*e03IQ7Jog5D=m}vsCw<1}9YBbHFLZ~UeJvvB-c5j3kR%~!r?$bDlLPPpyo@?g zS1cOD;h(|B$XZQOLk!)Z{fn^0kuEEu9s~2}GUpCKhfpK()Z!i9qL1UjR~bbv)MBZO zD(JGoU;Yov0nu@xP0D3jBpCbzmXL0%j}VB3Rv^)C3BD%x>7Po7$oVgfO$_i*gt25X z!0v$~0Fez|N1IQf<5{ei)#C-hX^6t=xrGIyfmd6cY;d{_+?wYw@`$+<;N`8X!MzU- zrt=KVvJm7Pg2^gD8vvu+11(U*mkhBH*Qv3%3NC#A;Z{el$_hc}whdH;YWPXSzX&@2 zD&yCMv<+`N;sz+(%BubAwzSLM@vMp_otovxxRwu;#jBc17;wEFgi-VW8+ZiAgor{0 z@C^p22%7TIRVXBn2{frWfO1T`P8fo~?qk=EFd{4lh5_On4jxn>EbD^gz7AN1$aev^ z0n_i*=7>HF!M;Fi;S4@|_dK@eij4@cdRkJCdmbFT)+z9{*Y&CBxQ)Mot+7*{7)QwtnnZf^^eD6IDOc68Jg zA|e1SMGNZcA%g)6EVsQeD5(9wdwSbBUwGKV?j7}~vf~dsQLTd*4z-ioxI)G*9k-x0 z@8Ir4uZaGnf9J^)C~_mz6@X39Wv&h%e*xN-Jn)AAU*{SU*&_sD8=Nlzr`_6yu9^vp zLML0lp^H}p-@-y8g@p#q$H%_DVn`weD=R+h@hz@ttwJ7}yS4B+vUjBJ*n)v# zqIng_WWm}BGJn9fVBWbAqR;hJojs~Mb{a>3mW;KOPdK2zhfAq&LSEK%QK9_SCxpvIs#$H565p#nf9_z6@1;f<9V zxmP}0C65#0Pyl0deL8bSaBn2c!+?v*@Cw)T|F{4iHy! zC?;yH23o#`Z*xV>rG^(y5rpIr8Wy&IrZUcjjo|}j9Qiv)*bIz@$&?^C>vi|^gdm3+ zY|6$-s{alV&>vC!5grCnDTKOE^E|^sWJv$cxBeBA_kcQ328egV!@~gA5+(I%lG94S zSp+4WSyZ&8<0w;PLPr&$o78x(cQlGbaw<}wwdPgIw|9!Bdh%^u1}qsW+kdbOUS-e< zM?6-c@a%2*{iA*Hf-fwWAAyG8Tw)Rxy#YFGBaeAJFwGM!o{pYxEH-EC0QQ_5)CPpL z2lPHfeT-nLlVYH^`Uxdx1uW+c5O?d-n>(_K6A7VAp;(he<=D*`hF)=a6 z$K)bKK0pLPaw7o4KrH!?+r-^+R@S@xCLI?b32_j)gMoX;UGNa$PA=G^%&)I2z=(N3>K`>E=0M5?l3_9J z*m)Hln5gAlCqHkHmpw z!GWOJdcJF5W*+Y*8l-f?{SIRS`&)x_mo)qAq*b0kF7_q%<{hKAUD*-N;yHl%9G-WUhU7~*`Tw6#r@h?;45+W~yM5i+itSuNQ0 zz?Dzl`<8OEb;bj!!}MxVZ0aCKbG5e~{Uf&^<}YIkj=xlPwOyEHdd2trMTK_P+TgO~ z0hp90VAU}A$fXeksYuu@awmX`nHu-an1q)V1PLoUg>WVTfK;wlAoY}Q>y^|0M`pm! zR^y~9ek!Tz6gg(#Ftx_55LNYQo(wgq7V&K8x*?``<&r`8ZVYQruNa0W;*^m^^Y-f~ z{2r40w8YB1UsAWa$s7)H1Iz9q2Qm=KkjZA01Y>(Zk{5so!VIpq2-OkB7O~S!_t}+$ zKu0%F25*|$`@mfpiCTr@`W_IgeE-(XWyv@=aKW1|6P6P2Z{uOgDQNv54bVa+iVie` zoKP+n;2$FdRf+awHqv>ZVl9Ce53+^f`kkQ_#SRD>>?o>)f+DL_L|HA+J+i4e@5g+V zqPQ^DbP9YBBCiWbN^S4#WWi{H(0s1e3}O!?;g)6%#}8sV2`dH6ERZFLRI4K6UWF!E zfU3Ez@0mY!u^mCdB^AlC1gTuZ@9Ms38u_4s7G39ppwA1rJTz%$!ySh|ZQXmGQwRS+ zTNYAvtmAXF#U#mAS!(ktU6uCKO8BI7B?j$4P=kSM_$a8eVR(Xy?>+xaGBPp(?-I_P zUvjXv#Q&Y~f#OkN*cL$#5vxxqQ0=g7pa#(RgVG$3*0T_xrBy+=D&y_jC&!BcS+4== zH-T0Das!i);d>g2B*FrM`C68qO)T{lFrE-@6p#bY&yPOwx%^awhh!K^8Pu(Xg{)G! zYW5G)2Kl;mzO|^0-&4TV9Q#sL2PFm`AQ}lkAx7p8Y_`?;bt_e%0xA{60p45l;)fVl z;}RKiS%iU?lb2sWoQ2@#Eb;xQMXcor8WQD8O&XpKPccY{X6wImZ=|fb2dkQI1$~bB z^@eG5#)&$3-gnBygU~7u&&=33jg%qC%p}w>-|+Q!R=&8-r93`CwVuE5dqLStk&0(n zSh?T#rG*8#ctCrG9y}11kd=TOXz)@2zl!;l6~x#Is2kHBi;>fiNF?!y*BYE5kTVS7 zQ~{WZcrpN=o5QUYDZ{`m$HrU#a|#kj52r`v&A|>qUM2 zXNwaYE%c)oU3@(K* zAcZg>o6m|*wR527ne1KDFpWI^H%aRi-xzYyKY9=qyAd}O-(g?%3nRa$6H$5Ys5O(u zrbmzb1{l)9HS15!S8n>H85qtj83zDoI2**pzo#4H5Lz>6YZ0a>9MO=kDF8S8T(Cn0 zf0!URTnA+QuEL{>fplaj!8y! zbZsn6Y9t^aJc2C4eK9swpC@D!vZUGFeisSQD@XnvyB?i4lXJR1+w^9tr`9vUhG_fs2Q4o!0b+iyjKFXj(#-{DW0Neoy||?j-+TmhPf;v$T(#f|~B#xocU}1s2l6 z<55n<7cZJ>=?F%6^$)J#wp~GATAl}p;FbhD_rLmxJ*u=%rTsa}VR=A^_;ba?#i`qU zuayM1fE6Ifb8ESmR!;Jf?{`36RBoZg3KD?=hDFCmpZ+}sSKInoue&NL|F)o1aC!B6 z?D`>`o{h9q1rK=CK1fr7%hmv#WYqT^42Ds?wYqu{n~u(QH(%|O!g~O@!NJ=pyVwBu zBf!Sh{`j|gQ}vbC)=WE-{T=?JFP%TcI?iQQ(k@LiOGZ$RS%;HTmv%^Kdg07a1ZX~> zVj!_%y2VNhU`^6JB{S-7UG|^XZsbUc2X(RssO&TK0JiDOK-M=T z*f$!vF~L!Meo*1(1PpKF-2_T#(0u;1M!Wxm4O|0j6jEB zZbY&T!M&3xx z9nRda{ckU-=PS;`9p(-YMSu&q2Wu0#7p1~%Q%oJfwfYV`C7{B<^BfJ~R@g`b3~5ay z88}~t#k&aA5usxE!_y61jF5LB;zb6xJmf};2qDb71;JGp2_k|V@9=SgQbkzps}69e z=7Rwj(zpN~D&LD)5x961k6C!a9D8of%tyFl&-JEP9J0|n16hX)ijSj&EN zO!!B6U02{p13583dvx4s{EM?QTrDaufA{r)XD7cn336n2! z9Kn0K8m2C~bd+*&Oyd^0Bb%ZkQGzxAWw$GNM^znE@Rf-Y2;F;h=@W`ZEvUOwG%eFm zd`eQshx$jHIgMEZo^%J7mufQjti4{|#k!>L{_K31$e`9+jA-C)%WHNLQrIUw{(k^L z6cAJ=ZJz5_(7F6uo%?WHN5!=b7RU6B0FwskeYKWrsVbyVMZ22Y+Rc;*3Xdyy(LsZm zQK-}b;azzM9z_-2eKbwB@w=Lpnl|6(Jvqx`EK_yYMgm;bMEXHf5Bq_U2&HkZ#BI{A z(hBm zeQMnaEqPv1`(V|U!D0$hC3F300=yxq@dafkg<3v;PV#tW%8QpSsMsDv#&#|h_!yr~ zc1+zd8Zi}SouyP%GxsOBOUm+q&WCDojC0uf6lkd-U6zGxWv0}YDNtTt2p^MglSu^9 zmdVgLExo%)SZg0VUKa@c)S;iAa;Oo$8ho1{VfThY;&mg4B8FFQ*l zjmGh`cu}{=MKdTqC%POfJ13VuA&R*~_Bgi;Z${cvJDvfj&uyvlPInQXshYs~<`vp@a;N1v!?foQ zvIC0nMgOb*{vEc9qx{W+iwcBs(G*-1%YHZ~tb!c@fnsWQ?`CRMPQ-W>7vd!IQoV+0 zJaF=^b^M+-@C|oc%bw(qY~p*WpFXbvGgg_*{8054VI`WSUCsBUuFut_?;Q!FlFQ!i zJyz7+-+KVIc|E)u+V%T_CQkI_`ZtF%m#T`qob0=k$=N?0PZ>DeRVU@pPXUY5 zFOQ$Qs1-KDwEwkF{f2VBW6le6*6UsHyn zwe*jr;>S8e8rhkp+!};s0BluC=ldqF`NWJ+O(cdKTXPflTQRu;h6DR%-IK_t6GlKG zdSM@Qdg}NEdoxmLT>0;rj@Im=68ZQC?EbgD<7Qt7 zb#OtrQE8fnPJWn9$NgfDERoBK@`Q10=7P_tgH`e9<7%aae}#~|#9WjnDVLahOPO&Y z6R!_ld+VmEc)!JBO4m z`R~5n<40;IuCj!kh1G?G_Kb~ZROktls+qi6Dl2v#R$dJ;cXyw0HmI+ll4%gQh*xcA z++1n>Y}_E_PG_MtLeWK`L|CkAp4GB*1&$_(sTdGYrJ0nM)=Ro4-QUXcy2hxt>yW-K zC5gh(A-!2ayxAO}PzA~rs?GBoLcgP(*2vx;U*yK$WlNv)U8@Kkcbtf_ZwxmK-QUS6aL_v`mln)llWOyD(o5m*|s3^h^j#x zK^$=`TTR{dm7b6F7v&C9^!X!BJ8#FLtO|%od+BKN{liDRFHtnyX49B0LCuMLZeYep za&-7Vd2Qm4yL>mW5w%@KgJn-W&du`le%4DI^6>iy)PBmXO4ZXhl3@Nbu@i4nP0HU7 zoK19&>By7VyVmskTR_0lkGp4c{&g$9=zl#L;yHKg~w(KvdP_kt}hU>x)b*Fxrzf$ zfIlZY$GvMbggMU<#mC*GPm2q6UGvp7+Xs`(m~SW#`S>dQx0OP?QV*N>w3JP}h6p=b zfa!wHwZ72XF)GN)EK}f*hmxf4t-zm(m83SHx^rtR@Yth{;Lg25N4~EVlf=oPgu&QS z+~X$MwVLL&tdFIRKW=CnR5gk}ZP`01Y0Ida>&w)6C&sA}{88A#ou|bzc;0h5qc(4i zH4s1EgmLNnyW3wiC`j=&bY7XN9dt#z#x?xugjQmB{$+;U#V-}Iud+qyh*}@+n7z67PrL21LFgPF zzXYl4w(qV=V+&=cTR7C_QKol$hF|~W&eo)>@bmWXr_%(7IC_t0#ZnjK-(JcN6xy{) zCSi~@8?DV@y{cqHZ=v{Ja9`Ce{GJf6qLGVbzw0CGYcyRybK-82(#RMJoL_5cLp`Bl zxXr7v$?79ISY&TdNojSNIi51Wkl@iBG4cYYpxz%g%yW9rVR&;K_WE-E!D z%7nU~QSucR{YSA!q5ZUbk?gU#Oc|abF0w8@q>1oZyR4DjB5wHRJZz4^|L&3hDo6c* zfV7n)D_V}9eFeG`-d(0xl7T6opN(l&DYYog;}Z1Z2wm9K^k|q#YW~=A^NLDGZtlWN z&;`xqxFwa)!n(|o*S|#hVE6FFp)?FxDNl+GDkzhfiR08J)PdP~gx?n@xs;9x+p%*E z4ki5KufZ47zOBKl6e*qJwQ#NM+24hLFN#waw5;3L7?)3*)futL~ zcc5s`u9CCiQDA#0!|s;ak@9FLYupXb3*(2UIhMl6Z?h^UTVJ}#E+QlFDxHl^HOp2G zT@2qVY>DTj`r)AZ^-*u&L&+f=Or`P0M7-kZK*v{VZ~M9J{|S%Qnx|K*2RVIV*!8tX z>;9Nd$>(%QQ0bSt*oiAOsG8A@tymwVs+N{vjwkw(W~0^gi3#_3sBS?8o53$vqDZpS zCv~OI9FR|1h!5;MP@U0kQ!?~xZ7Op0WX@3+45~Bp2q|8ikbHY!1URS@oh7T}1q;SE zs(qV-UuAk+QbGnY)q09F10-6ny1WV$$6dmRFi4i-qu7nOsHl{0GOXXlI0ShO&HeG= zZcX8pI@JD=08GG%1XNVP)Z5sKfDHDKyjwJ^am-BLD|sA3-IS=gQf(e~pKf-U4L7z; z7ZM)SIIsFKz7BtUA{(JTAayZErc0>q>7Y|$C>l>gyF=@1(_vbl#qR!mH7mjs+E{d$ zVz?KNQ#)HDO`wh}BkJYl7&%(CS{@%tz1HQj!Gre3+aWV2 zlU_N$nGdc1j8_UzC zCc8wF;pWkuw5B~a zV5lNe@2fXz64{xmn)D|g{FtIIIQAFxir*!YGx~8)I2D~n;Md<2Qw(XmA6}BbSQ-xQ znvOyCQ^ez#%R@rqDpQ9-Nr^K7wW{Iylb$Evl3s9HZV_AHyiw(~|5N)_OjWz6v*(H? zEx8nd)+Ns9vqjIdR;Q%1*j82FKRYD;=DNo4B0pgEcT(C|CNWY^Eg`WZu*^!AGzn*I zBJon$W|DY4&{ogx6EfiLv1h;g43)fm0Lw#({`)8ko;2?bf)LHVBMFt z1glkYL^=^np{7DVKLs5_F}lVf@GtEb(XqFR{|=2-YHj(uY^IthhhB`iHX21v&K#>P zeU{-E=rLK*ArdB5*mIop)N$hq`8yS}cthgNH13k8z+AHSHI9Lm55F_4ee5m~3HQ)i zDK`agSWl!vM*?iNUI!$Q#rxq56O@~pKbFs~rDS-Ta75mEJL&3|2|2Be>B~UL;!}Q# zG0-E?Z|teXR=mj~-t)i}Pm-U-`tCS*icNbQo;!%tI~}fHASY7C#piOWsJ|9Fd2_m` zMBzIVo^6z#726lgWyWLg%l|y?X!w?(-dzQ1OIANItNYh$qW1V9MG_+y{oe&T&%n`| zEfc^;n4`qHk@Cy$sN>Y-#Uo+jHI@KzwW=(}#xPyMA)W}m67Oik?mq#wugxX;)CR&za z7mv=yMJLx(ZfZJpStmk$g`f+oVoU|WWlR|7QZw-MCpP6ikRL33nOdOyC3IqBP$;RL z89upBvTAYV5l+B@{pF+vwwEwCywSg{;{tLAXc@x8#OU$5SZG$o#5B1}&R5qmnwv#7 z8y1OhaB#rO*gGg{1A>O3ol~0iSwvZLGohgH#n$&CGREh||J~dZtiNR4<7HEngxgBl zh5~Nif*Pqzk;>YL7svnv+SR==&eGeIWnIaFx11V$C>F=IYM)7VtgS^?`s!9b!vyb5`1e!y)Dz&B16a08hmn&#3gi0vVQZji_C#c3_ovKU z%lpt;-v{6(3W?5WBYkiyy+7@U>-T5s2V%7d;2ILYI}bfnBuHB1Q0K2fe0Hw)GF!j5 zg$5c({D^~PQzs8$w00bGortqyswCIkZM+&;r;QSi7gM2mrefIHB|^J2)j17YhX&is3CZ1pf-dgI%ftKy1e<@ogZ zN7Z^c)FsGuEjEALoMS5YZzJ6GDeqHAJ9?F|lI|WnpKb}fC}zm}<|x)XwUt%jIkZqdLaX>HA>kN&PQ{v<8dvbeJ%tw8 zjQ%$;>lR>Slyu*~(GS#+Q02?(Xh2 zF#N~@)$~^wnKkgF4?mbL9D?2o8N>6U3BSqLCdZqzx0@ON#X z$H)Qo2vG|GUWO1XSirgf%mF~U1kx77&9)g(EG%%^t^)W3mJ<|kCVu{S#7h9_pTkgN z^bZjrAG)wrdSzo}`bl6|%?mB`%uH8nSesxdne?&02CYMOC((2Fug#BEQTXtSh{)IZ zH?o#tHy~L{&>fD24i;kH0jChcfB;=(`Yqi@m4O0Jn#SXWfB_aT-&j$PYMgQK{d=H&o!@Hi6<`rucbx~#lMH3_ z^sd7fKv-S~vI?daq~Og74YJGRFJm4(ie+GYi?3CZ0AUR;>S-iuETrpM!vG`&6o}>i z{Uo3W1%faZkeWl7SroOx!qNjOPCY3=^a^!rSQtB?OvowReK@>&{OTeEm1V(RhRDF2 z&t_oLg7$LI{3XD5)(K`wjnH^Q;@@FGp<6eh60nX_<@A=;9u?m!3aha7-0lm-XIv^K zi|2fPkxfTFrIvy`_;Esy%>*Nzj+UFMmLWg~`M^g(Oby^NKp}*JIJs$u`}Nb#;YU@A zpFERT@eK?N z+y(`F4NNs+8USpRiz;jPhRDspt8&OWY0%&&fJu$OzwiW&*D8c-!^{48Z#>(I0Oh*D z&{NHlF~kO$<20xlV8vzZ0D~MQP;UW_ju;?=CLYNkM9ft{Dt8&;vNuKjfX9H4 zo4{RT5Bk@!iHY5?3lWwXqO1d*FB3O6as3q1=%tSi0W8T0$S;r~_yrM2dhN3UGvhfx z>`O~aA9w}B(H#KkdV+A*1EBDh89Rw0;CDn|LB=37f(xXMwvG>w67_%ak$XS{iZ6_a z`@gkWDk9A}8onX-&|>=D!4O-AFQb6KyC!+v|8W5l00rdn+P6YB8|eO2Dv$TUqwv2) z0K_u*3jiOD8xway8SMlX9kf4Y`E@J#`;gk(X<5&R3)8uIm8 zQ%>~Eq|{b|G2Ft)3LGZ!ZZR`45sIEnHke=c8Iuoe zbJTRe!;#u9q$Fg!OqBm^%t+1r)QiBflfpI)1rUA`cu&6v0*6cI)%%V!t`j@JHrpFh zSLOxIAHWbwaBQ@!ROr=(ftq(4y4gs?-T7htrx++~2&4p2eULyQ2=#A|>nh}BcEfql z55HFyAY2bfP_Z5_PN;7NU_Tbt930v7h1mE6O}$KmL?Cb;EWz?aN=D|tl?})-Oa@U~S^aD; zoKL+CPK$^$5sY*F(MRw@7y5ArIt+w~>)ZJPyLkL$?~=ApnjD7#tvJ6L3d_PjDF@zfi5B z#OWe$Uv14y-t~IPROzOdWukJ%Vn6O}aJ96ImcbT3NZ7)l=3J3Zf#FU(!91+4T5cuVv$M(c7=rU3|KJ#>@TG!R%O z+M1f+LSF%}>27&vL9rL`C%h-bOCi4$(6oOC^nJa(yXV3j9E!%Uk{Hc@0Ab~Qa`Gx? z6HvpXqr|}~VD_V?CTvcV8$8e2JQLt>RCfF5?fUVaa$;<3HXOMe&WNp0^FMLtrMF>k z;XIi5Gih7Vk`GKa)AjBa2yje41(fxO`FjLZl74j9fP6;ay?R`%MhV2<9a2jUt zni$_Mi&#WcI%Agn+>(6R=(As6UAYN7|AcXF-EEhd^&LXGSz_w!cX#nPZLE03s9ao9 z%#^>KITMd5ufC@mYKj1(X>dyO#hAgN&0hWCDMSNM_GR37gzT8_)d64rfky)~3kyPa zas(O{LOuX$=h}rK z-P!s?)FYUkoKt@N`UM)t1TbTRpo%AO7{Rt}hwJ0So#utGyUi=0a!-Q`S9$ZU{FWJ% z;)B+U=vNLaY6(W#esf83snVaN+ZP!=+c50;z&B^;r+gc&pH2M!=@L9>*_Ghdg`9X` zrY{lG!v~sVkjewVy)WkGOolj_!S}*K2$RU6{TG zNEFx^ZzCe$v>i&VO>_8_%EuX^KE2{rUR^x0zD9h;&Dh4d1Zp(PD_Wm5@~m~^Q!UMv zo{0@DU%Gc8S)J1Sda&vVfBEGkdd%mFy9Jz!Q8YXB4M_p7!nhLy%!3C{zf+TUeJ&Ox z#r8`7e^kA7R26N!HcY65fFe>70#X8!l2Q^P9kS_=2I&TAr9nC+r6rXv5kXo>36Yi% z>27>~^PF?m`o2G1OZMI~bI%=DYLY999NdQOp)qVaAli+Zc|vo{t`4akqLY^|g^3q7 z9FPb?0b6W-q%+kdTBH*slMVuuNFOuIw&@_9;er{i<@7HrM6h*Gxlero*#mNRs0(5O zr#?`^>AbbDBhU0X)P@~KJLKPm#Zs$i(CJeJMzL3Vj+odfNBbEu2kEAWIzzX@7ay!Qe*pZP3q!JZpIApprr!b|8?G zCITnkJlNfXBs1N*ydfASCp1WO^n`ss)Gmj)cOoVmBwS6~gaUfGKVP1*LhOtvOl8th ziPhhnJL>)Z`9j*ovxT#xy3ZGHK!88e;B0|})In~C$^y5N#_$TC?edP!%ysvrRNwEW?1kXCl@CxnI8#h-;>fdC)OFjPTuPG=?LmzJ5g1K zzAFe7BS6&8#l48=zSf2uoDv{6*aIQe5Y%V@LyzRd{ZCu3BQzi*D>0}_B5dBdc)vY^ z$R*^)!1}Ofhl7f<29{q6Mt{UQF@)QE0WEI*YC)Pq)AY;)u;XAe$c1-sCgVy}Utb@b zOsHUGbONm)DY>%RXextPcm=(@FWD26=2FtR11bB-e8BU-b_ZX1-}IuNLU92ic4XQb zW_L)h5zfP@AL)WIhx0fHOopKHX5H-(C>R%E-^0YpdOf85F{ofZ{Mvw12%_S5fLJ0l z1FsEUG^CabS%(^&7{tRWASU7RzKIk_vDyHk2n+Qvi2%n0Y&TdpHIKPF$ zX3+t5U?ZRX{2&G7xz1kr>Va?EZ@lCil=Ix`&P6w*SiCXneW(D9LM0nALe-EdrdH6+ z8>VU+M1=mw9y>JO9*2b+miY=63~Xlrz+m)IEBxW=c#$d+l^GAB7#IM^nu%l{!a3I* zrU;dF(2S{aqnW1d!D^|$eorE$g*x4XwB$>ND z36Hj#tGZbx;gKHnztw@NhuDuKyf1#tfp+RhNmndmSkDd}tP|d3iuP@t>GPv|rhnHi z@)r0-dGT_4_Xd&}2|MxywTdGoO;t3)sBo3<88VFG{z=pIeEyN`=U4)i&&@ovldSb75Gf&KW3?euG)%AE*EyP7 zk^M5f1vp402fWek^A1Q)5R&**Y>if`!3t*`g%r*JhzfzJ+gVN+j_mXx#{;>SBJ zoudkRCgVnd>V#9Y6wEKmUTicp{%~S}3h8wpHo#551CS114FhP_dk-JRkQpcrXPjp| zSEwNGi3yR|A=0^G>!^tEa5^!uf7L`c(coZ;xN2Z7UIM?@K~zAM78^YilQVSQz=_~4 zCwNv6%m${h{xx3+(;;j5T{oReXNo!cD&d=6_P5$fp#Ytyw{PT{Bw1O=h-n*+Em2(B zpX@GK2x~whCFr!3JcR+VfuqZ5OC4oZgb43@7}?q(y{GgI80P@OSV(J?$%0g8$1i; z3rJxaQbYb6wEb|592uu2M0VRVi2 zce6!rs`@vhEni*cIho)JR*7jP4<675p*>PpZz1ekP_CPME>%7j(<)r9wj>vH)1v;{ zp{oLMzHsetF1*~ub3UuruefZ3{`FTUJR9aKj6Ns)J$!>OhYRp}bx#o5`1+!0(pFz9 zzr7?BU@a{8@bLELI2$Kc5jO(pUw(mKqFRZRVVl?IvRyiLEu*Wz%w0=vQ`$cR$`N4fm)sCEOLJZrRu02bdG(n^tZ0 zWqs%x8g8nZ(gRzxWV`1bGyUg_8gv0+OQ>l0LZdzVZT)uLormv#;{OSbiN4i}^T^xk z%Zf>C7w(NKbT(zJ4zMFc6Ei4OtcFqRkDaR4xmKOQENUQp+r?F?({{LZx44T_j`h*q zsFVl2eF`D+bB$TE(!N?3H6-3+36_#$G)TmSNmNAqj*+}{fqPzAC zpk4*e^>W=Kg@yz6?BwdowVyuAwitda?EZL|Z0Iw`;a;62<~z|fe%FWfvyWF%-qIRA zmuu$Df-YmVEnN(%`VLE^w?AZhC?x6;8aPgx(uwao*|N#WB$NbL`$x5+Zqs{*1W>i| zix;udVb+3Q|GpM~ncQWroKK_l6*xfXdm+6mEj>-g^V=E%j44Ai0@p9?a zwOFZfTV80_``HulORThZhN7YtCDEbO z21Q)&-u)o@Q|RX_dYdY;;tGo%yF)4qA@i3PW)#+zx}pQk#)9o;vQvz%4L3Ni9gERm z<2EWhknrDK@u>aUvU`2|I#YH34gI3Wt`b&D!BN;$4|+#&m2rRE_=eRae{??&*Sl={ z4Y3-B{y<%ji8Z_i{oPr*lg9qZ8GJZz99Ok&oZlN_OipnBG{o*BIY(k4pqW~Z-<}1t zgHVzlK{(0f6s~6uWm`K9%%6Abq}EojDm7^q1N(5zrEzCj6ok@yenkX_o!J~j>K1&F zDW$*eA~Jr=o}JA)+E&)@&@dNFe9o&)vG~&CNgx@aaPgJ;>FU%`!xk1R?E+LkXXG9% zC%P_`1f*t3Ba8uV$url#IZWnF3UUZ5tFmuA4^WSAFp;QF=;ON`tg3TpdO@(%OGMo( zqY`jNHP3yoGryvU^YCGh#$$?%51MoT-d>6Is4f3i&!8hB=70O+;3j35u4v5PYT1=N z4;^0)r}qXHHM?&m#{Ex!q!TilaVH<)l{szrp9U4CXb84*HlOob$q#>_Yo2|W(ppV< z%IY1HD!ZLy6sJ4m3cC^QKy{h=uLBHf34iI+_)Mn!M+C;6HdeKOiKjpFCrZLNwaFFrRDgDpzhY}^ZXW#i z-Ae5+Yc|Q-iVt($sCoUs<@WK{w_P1P*W^~m9x?~~F{NVa{mdKEY0mO_UfDR#C9utA z@ki<#wL#+3GF(G+NkRFXpzPZ&RRs_AmA80mrXuxnlCNF;@HpriQ!-P`N`T?j%!*Cg zdD!+k8z}b+u#T{R%5s*`mWzF(eEU7|9k0O7Vw+*K%eV;{w?y}8x8yNQ-zQ{ic*$RP z%Lh2aSsAr;i=CFU&}o%vb%lQj>l?ej5}vcDaWI*Ge#%qXwC@z)itEZOzGzCvfuMaG@_(@f>ren=`W~uYRl8*c4(f?&yJ0x$6}qQC(G0cVlJ&L z{LmICuzqk=K3pq6IPfTA-f7%0zUFZzH#*skb<+9Sl{-8Z2^`3^k}|>?yO6YMI7Q+X zev<^vYcJt~`i6+bVLUIfs-HsTOir)UN2i+KBqz0We;-CJd}!Ji3HlW{!f1--$?U0B z6r8!slgadfgFm{wLvbRC)#kzg=Sq&pl!ng0U)EVTZUYdtw6Yh7J%sxxU?rSKceF?V z8Q?7Z@V&+we;M8mRKWLDRcevmk&9w^ee2$0E-sEZYMtGUu6d=pCzn{Q(CGH->HOaT zq=KFq(hu}HX4|+Od2m@Pinv3?x^kA#vHW!~?oslce8_X{Vq8N*k(A821os&#yDOQ- z)qZF-p_>TUQn_5J-pSOK=n_kX0bL{vD|v)&&ggUi@8DPbK6}mXYC~sRN9o|$-({}n0w3^~v@HVJSgd@4?U6CPEe1>XJC;M! zU6m&S_ZF!De!H6KI=T2J9G8|wJ548H8pA!I0M*9XD|!9`eV`*sBG-qlTU z&witLi>NGX_th?Ozd(_N) zO?%XHoh7{XI(UsS*Vz>{Jp_grabUtFHHx~YcUkeuM2o=mku7%--5Ml#eQa{UcOdHJ z$5vHJJLeFRWeVl|iJ4(Oxfs#5XNR^N5t13@8|S7*9*r?@U*TzWPstLM^Ed8|Qj$xY z36-(%AV0x2GilFp>jW`md=a--KvJuz;xmsPa`p?$#{w@~v}vGyq!o5>eDH7PqALlbmqbXsTkxsrl+ zK4KML$Vz``Hu=+J9w*>3C8_TE7{Hc1{K>2$y}V4-y){_uEW#btz2r}DPF#mcHiqr5 zk_g!Dx8F`VG#<4r5jM%s5;;7wak2>N znjanyXfY@9%;o;TwDy{LAY$+*A^ZD|21Z6%nIg_-MlX#8ezWZQ*u~X_|1ZUG;7VzL zPOGwZOStCFuQx9X+~r>sBzy%9Ouz)`Dc4QGyN{ zU7lA0qbQD~tjheQB`H5+n?+0L7tZjKRiT3Qjc>Na0wL@_D8j1@EAB}wchFl?_fA=o z27F&|b&+;`M$DcfvL3j&A=xCaxT}F~Y+~X=)kaSF_#~-4^EpPN{*!~Wb6%x(0Wk=^ zU4Ww$^Wn*5M)emX;ujc2akOo`E!b^@w7MpGr$M+wDS6+wop*K?!eqyuqH4#=JAR9M zJC*}C*YvUH}@hW@6_N^&TH+=Br^5u*D}@T!%|E) zw5HZ>!P^_;i-CExyq)FP_pqL_UAQcDz7igrFZDYfYG16RiTD#bM(vQVT_vCW%;7kc zK=JPq?KXkrV|j`g^cGN0Yb=L7$N9+lO_K{mcMtUk*62!6432*!@L4up!}zo}b~w@g zxc+GKqtmp0Dj4kfgs0u?HIIayYm?P=@BH3JUXQBoF>3!_&@B0UbPE&+34;HWCWR@3 zUnTLOU@76Ti^YrHMZdXGLI%4b+^#%n^yHx6T`Ae}jGxM59)Y_4md=JeJ zk}J~r$ls&uz3T<7%T!wXky~=q5lR9QVCJv;W>miqVhgXW9^GEzw^2Ok|?9NTvkDS5`bVOB2l#TD+*V^s+zQp2vMWJ$e zJ9j!iy7R%%-zM)xhHCr^SaBzd-y_ZDYmf4w)EjM2;Lr;!$>$JI;t z_XyLQJj5s=5CEN$?fO=ekFqa)WGmb!7oXdGA*=gNqD2J8o+QbXeC`K&zVeYVU9Wbn z&=t@-wb;%r-B;JRdM1av=JjtPptRfi#1|mhA?0JIb_!vL5WpEYD1V?@c7TLHa%Ca5 z9?5Q3z7IGes7j7s0X?4Sv<@eHW1tpI%`zHK0*WiWj_i;O4uHSIDSuU45kaIha)o&X z1-sxTLTp4?YMt;mI(eu3+yKLJ@bu`AW!Np*6LU?KDhB z@Y36bjnx4y6<1w2@LO(p(K7k1wAdRt22q0tTs?1%-B~;1K&k zU+NDC-F2vzmzmUWY~NIKua-|vU{w7S^M8t;g|`BZIbdDVqTqdz2Sk!eNc%fLY)639 z@BxNfS07v}+{`ONBfPE!!!^Z%sutY+%L6$ZNqx}28z)|KN z+*xaA0)GgOcXcy%!uFN-Y`~Ur)763RkrMEFLDy1vifc9j#H#3csLUuNonK^Df zgHDrufPB~veKO$64*v{EHo2}90B1W0LO#g$)rj>nt@;UoUjgJm$RK(p=z@QSg-4bR z;8q5_W_lG3%Xhwi`=*X6Q`<@gC^2J~a=;XzusakKP2J;JIA(N=vR?2+RQvW9>J{%; zy1(zNcZsR^9qzWu*(AT0lWc8b*kw${K=?_GqpE5D!*qVUoPKEWg#KyVbpFW@`-L@m zux0_|5*jOy1;9VErt@DY4-c&O2n~)qp1h7@v@I?Mh;No=b@@0qaJgE`T^I0mES<4C(1+&#JK^RY@LhZuOeE2C-RE(UgJ<51Jq`Xl9XyiAjc|@edt@y6kq|A|)*Zh>^oJ)gofY zMM)v2A7!Zh)vGaYBkIxSAe8*90d>9)gx3hDaJ=Gk77{#j;OAOFr-2LDnrFHIG%n$v zc8Ld6PaTDVh8yXt%{b}?2AKw6afEhLxUo80$#Kk9!^^YNxg-RbT4l%~%ahL3%UiIZ zY;ayd6m7WUyH8702d5m}$LMvn6f|MVjbVd)7AdI=K2K~9iMg^pIkY}-lY6AkSJDqL z@)r&32T3yD{i)w5IGKO%yN>s!;L0f~XiYrPNM1F#6GAufJ1tbj1z@q2;Pa(+%DKjV~ zh=FkKk9N~S<)039z!#{Q7X=^ntW1YD`}s9UwnsdbS7-nj1(nUqI?H0Yt>oRs@w+v8gaoXAI+$4OJR$q5DRD@v+v^+Mkj|QBWyO zAxdfZf{tFQsoK2iKv+ffEHO#lIMDl=x4B`##>ee!@r4XF{F5 z1%UOUA@S>gs}c()f$#$46cT+&egyZ0Pm*1M4@K5Tu<9Cv&huLue>B2V0FJ&p_xi>y z5Q72Ld6N)gr8?-wfk(~G+{VEIgiQTNg2CpV(Q0Bbd#N-_5U$?t~S zg)Nn#N2cJCpNC2MDsHDq$Jei%HWQo>_M}_Neb-|S9RYe_1BOV&U@AUhRP91lT&~DH z0>K$%iGW-;T-dF-xp?3AzB23$jFvd5Z}w&JJni^>mWSUOAKm_93H{8e@zMMI9+9wAe_14(J`#{MR774F5Bn9*+rx4OFnm zn}g(z&7e7@yZfosm27ph%m3B***X3^;hb!fyoK&mvyR7~5<94IW5)0JXP>B%Ff`k~w5$hJdd^ zJ>99(UTy<_fY0HTS3&*9H2{|jE0%gG_Zo=2{-<&r5t+ciCPkKVAZJbR!=;+o=%z`bWcJ}*r5u0 z{EDuYw)U88+Nhzg>!hi%1E-?2hswL;u3mR8c6}pQ9g4y$O!i4ZQX;gJd9LB^|W}GyAE22$` zA<*8zk#r|i_gxKWQVHiD%hZ3{b`=g*RRfNp@lgzi|ApfC$eMRo-cS9Pf^yuix)uuj z%&b3#M{D-Yu%FX!9dboEe4~lc6R-ItQ^aJ{+{P zMwX8KM{7y7600OTwbf>GOeT}r&xt%$NlHL1@}}3SQ(W+GfR}&2R}<%@cb_w)Y#7k+ zqkVo^S{kiWAkr_^8}97g`M#a8PK&Kt)9f|Nvll_TaIlE~#w`X&wp#wvN#UTdw+nZx zWFkJqV7r9N4)e7Tz&dAApx7erd2MMnR{o%I?}5G2-ILtL5K-nHlIwjYaV}EYU$uvB zo%SYu#U@{J8yU`NzWOyZMBgpB|0B~{O-mHGD~b!%=xw`nC)r}&`EnD^3&W(Ku;^xAi)DkUw>Wm_?c|fNT*1SaA8||3jLdk(%H^ zMutl5lcpcU8Ks0fJ38c|GWhNFXzIZ?(p)Z_=_G=WwTFX4bG~70Qb4kV4^@;=0sxo` zhuBAGZ(fA#I;Gxb$%(=a!&*@HnA$X69t_g?_^hmVFfzdD2O+yXufDQ%ghPqAKePOi zo4HJ+{M|bM(~G#@2UaeBt9pLNOa7GemF1k5 zQG1K6#3_T%u_y=~`?d8b-TTUc+Nfw!Wr=$4^=jF>5osmifF}>>Jp63~eib7lq4?)mQ#`!H3r_&<`Jf-IQ{R z8pVK_ZO6N1+;k}^EA>&D!TK38##Y*i+B}}$&{zglN$OXPfzrI zNoC<-T(2emry6bOxc72*s~0!H(%xZ4@e{Cgxx|FYItJBGAr&E50jo?RGT^+f-c z1{BJ+v<*pwSw+`xPYzz*QPNS0U`LFIj>_`-mD7vc=da34kGrW9c%#$q1e{Q+)C&$V zmiSQp>RIo3`Jh)bXWvQcX?VqNuE;&m${N$KarnC}#Xg_V7ozqce`<5*+n-~DIKwg5 z<9N&DT50loZPVg6dyQL%Trf)p-1%|aIoZ8^#R|%RxrtI+;kE{;@J`)Tx9dQvq_sWa zCAt-PUCIEB3oYP8pw}dWw@|U5i2F*th5Z-vy-R+B8a#$cAg$o-Bq%`d{Y3XeM(bl8 zk67wQd#G-Sm}Rm(*?g7vfF`stXtphSA*9bYoklf~Hql2Lv)%vIG`=wP6Ew_?9$^(~ zSNbR2#?cN{xEm5|rGm5H*H~Y}Gfm-@6otF8{!^Itb^FKWhSz zCd>hkNml&v@N$os(a#$l_Cz^otk>05*SLCZGFaQU^HVQO@#TcKC2T4o)IzAu?6veC zJfK+4E1LiA$ndl+J%R(jx%u#wCH5PXl3H`3t<+8OOfZ=?RG2^@tJtyMuv_T|uODjl z>sXf!t(%SrhBGI|GT}oNVU&`2XSh2ImBE$ph$_?)$5Fh)6F z`HP%gnO9qeC#VG*ODa{niO+8$-t`?Ep*1?rV5ZN2ClSOQRadRb$@Rs)Nd}#gZw&3x zgPW_!ca#d)I;jXxUEQzYSb67EQsgk8Mz~30^fi-Gw7l3v3WB-gE#njW9muaeymA>F z(#d>x^ZR_^AJdFm8F|y*RE0)l#JQF9wyS@4+@h)52IBdo)C09~kC27qdRT5&DORSG zXL)n{Rhjzch!8uBvNFMQ4tDJdmVwjrj1fjG;HlclX{Q}VZh0ssU=v;fqRkJ```tQ) ze+$SnW)@4lXZ4Igwfn!`S|aeSIOx^1`XC zB+EwQy8i9q>E4y0z8ZVaF->iOvp!`w5V%b);u5y0Yt0irX?n0;-Q*GvWJ2Fr4G{VZ zsPH_+#X!a1K`s&S$oVX?&m&_>U%(_uN=As^%XFvP8H<}q)S&Ocnf_zNxsyOVbq*WR zjXnUOtD8H2pq@lI$SUF`?}YGJ75CBv>bKIn(^$DBUotVu+Vc~U;r(t?xgW9nUADl*9)>IJ8-k`8T4_9c!>$nYx`j0nKZr17Q7QVrFw$@wkGE(@K!yL+NM;WV6fr z;R~`xk`^`0J6$2etH#DRdnrA7_EN0Jagv^7$#?F{rwnbI&IaPy9|m!WmhnMKX;a7) z*k+4iSi(Jq@&3@%H_Xi{M?^M6W7KsQuYFcMJg@A7d^Nj&z5}LbjYd=+zIdP%@g|V< z8sRuV-okBLuf{&YXg7)DEtgn}ig{nWf34iT>8GU|-Tj9D=0d$Bfi{LttN2cmdJ>OO z3`N43+GU5<&0$64b%`&fQe;gxI)0LW{3SwZ3|lqHis0R2TJ^qXhhD<_>3}dF3)L== zRq0qSFMd!Cl%bs8O+prpT>#KN`*(d9?E9%XreQh_@Q!gw&Ogi9 z&66bfQh&gCcyrzY6{nJ23c9tsjVfg|);kHf%INmGd&g_A zVXCGxsgHp?jinVOmwjwPY(nPoXWL$jtj~$J!mH+TMcZ6JjzWwfdV|K zu-%kVCr=}zt@5VQb^IBBz?i^Ga(#p7w3h@q^)8w1cj@r+`@doStiw?-9?98L@`ubg z-ql|w6@Q(S)m^|Y)}B=;xcK?E7iFGoA^jLW%*P|>+i1G}iMXsHU%dHBk}3DBvV$E1 zif)@s3U>*h&DE;h6%UkDf2B{Tw1}6iOx)tks*0dDy(7Aqi!sb~_o|)mK9A!teu|wO zU8XUKnfljUvRXdmgf8m3{=8{$BHUk>NqPkgOZwhVt>y{uFjz611j&966Ccw1unEaF zrCy}q=kBve%TxGI=l>K>A7OOfV4r5}^@45Yk*gkqk@9fY%}ax6$=}G%_P>XDJEOE+ zIyJ&6nnz-0M;Z@6&}~B2frwpy79N7T=2JkpuSIAT=XBHC8U@VIP2ufh+(Ga1f74pX zQu^Jo>Ttss+#}-nxp74gWpx!Q3+^|=g=r!)05$~`pC{Ki0Q-`+Bh6tdZ<`loQO?qPs@arGnvT{|-<7dtkHT_8H?87KY%h;TU1-nwO-m z>jHUrtXz>!H2}GT$X{#oK)pOq@p>E|F+tei*Kzd3Csj9-*1ym5mrh{`Z>)Jheb^^h zFr=AQ#Rr&2#k=x`^E~}Y7N6%XNM~A7VO$&uU;_%hX1~~92rt)0 zAxrd=L|m;Lm)C9ad4J$-X!A-m`jcv5cNoomBb3{V;SNgLIM7D(x;w_v*ZO^0!!ASt zjBAm6`L69+lYG~i5F_Xto!>u{eJw4R9rVC9y*|L3A#V=t?be2Ai`*TQjIp6M`*u;= z-p3xH*72Qh_0oqA@e7if;{%d`Ns0dXqMsAbPs0jU!XUA1klha7pNgpFmWzzpXnh%I ziGat%Jz&D}mx|^V8_OR*7RrR*wiO!Vag}0_m*4-#ANq~uwR(^hDisdX+mhVC@{dp< zCL9jXkt8i19e2zKk(zVc`#w|jf}4l@y3Jv09OzvBrIV`rOQn_K-JWFeejpJpqWzDm zP8QRLYCMRBgCiO=oYA1=cLeiZ(*Kw3VzysCVD(C5v}$idr+L1w_O~cR(mya*?bo{ zlpA0m>++N3+`*a`Dygo1U|ltke9B2y#KgFKYfhS#TJ~ z7If6=5_<;~og2M=)N0%M#>?5GV|*u_d5FyeD<F2Kkk%oHm)Y@PYt|5bD+^NoB}AyBYr!TBoQ_xT3EbvU ze}6Q@Hi-I<&N&6;xfKvF)qwjsDL71F(M_yxvwI3_O|ug!%xi z#)Ibn24*t4WKh%p?)v$d$9)L#F+^R-X9;CyVKxq+r=er6&wgkcHz+q`KYcTq?=YlH z$2R{u11mQ3)oKkwZge&^VkvZODZ*a5D_3!1K7^Pq@15N*sRi8cCZnAnc zeKH+fM^-%4Tc%xG6CWi(2=9xqQG73cJPpC8C;;P_8fp}P(YkLZKx~y17bCjok&zM1 zjm+{l@f)+i3HcyKDvN8wAa z^RF$6e*H%I8P^gx35}fWdbn11m3Unn7<{2*!PR*m$Kb-+IEq>!J(pi7W66}-Ae&dj zKyl9lC1Q|4S&kXnUu*dch18}-k#W&&dxIPs_Ya_RZfz~_9Pbbl6Eo8YxvdugE<=vs8Dua^pT%>9C4mtVzEbrYgY9W`Wq#OpN%ECKR*=2yhztGc52mQb5 zbzIzic;4e+lhN=IHO$@s&g~CSmc{T5jWF4kspW_Jf^0v4&-Y@@a1DIgzWuhD_kZt1 zi5Z}306c{3al`3a+cdkMmD1q5dJoJWKBY4_H&+3@?yGk8CUh&{Q_`pg%1$nsO*;ob zz(F8PUjR$^W9uknbj6*o)bbHdv?f23=~{e#^bwK>lBEe`V&MJ(5)$K=w`kTA85yiY7#O*L znAd)D1gc>O`c0)!^5x8sYM@i7l<^WSp8a$RkH2d73fSd;@#^P~6lzcgO{;o^STLqPLu z*@kD{X8Gn0>V2CE4XMZHN`oG`Xb9f06Ds1C4?GeU6w0ks(7nY58g=Ye_^C=B-&gh! zTpzCD_JkXxJ0$&F8J6c@00IH1yFdVBcOYtG7>qlBuWEtEMWvE}UVLx)J0YRemAYTw zf$D@}P3P<~c&!tyypFf$5xg4WO9TD>oy~&phX=eD&USk);XGFX{rX7{$7Z4NQWHmXB|ustU2KSyJUI5#Lwtz0oGJJ?XZeZY{6nTTJ~- zxyjp7xUNZh;r~{K?s&XNP-iI;OOU3l?zU-14>k?K(i1~^!=SdZJEVO8V#~r4Q5G6@ z07~`PTNJt^s3zR@`wol1_%NI!-7`D_QL|lZ2MEFL3DFn5y&f!G)U)8T4v&a{0tfl$zmRKh zwMJtfU;W(KH`4hNyKbPO5~nz4qdvcMSN}0QuN@tABfbyQsKqIX$xiia+CGb3q+ijg zZq%oQzR15IeaNHHY{#!zvYUx({|i;OOGpSM%byX8AZRaOOqzk}9>LR*?q%V#^(qML z75eZG9KA@RJ%Hc8f!0EvA-tX35Cw{O8IVX4HFfpCftBCThH-r13(HhThWm`Hx3@6d zr{BP;BXk2Er9ce0)1H|-H|XI}@I{LKI~hRyvh=j`epECo!^^AO7*Mb?3@qETWhA-; zi6JG24qLJFZA|!OOR+N4h^+{Ce2l?rt7kASq#Yf11nV66+E({UB3~6-KBJ8`3FpHP z*i>cKmXis5&q9CYgylwOdfmR3_HVUKVzTv~dC$VV^!}j|yPT;2r+ALI3YInIiQYVT z76=KbEOwCq#xTf+=RxXL{_}N1WO%|)enG)hBn27ByB%nt=l&lz##1PGK&Vx)n;?M~ zVi&8*ND?s2>==lBy1ae?7eYELq1OT?5;{@Q%fMBcD1Pr_2NL`^irfFE1z^|fM*J=K z{8K8+HC48I3gmqzr~9i&7zSd=Lqe3n!^q>gyV$yh_#T1CRWH$aLt!s`B9O^b<5=6a z1eedU@y}S9aj0Z~74LgwBI~VBr@?psnsvziCPPtJ4bS z=U+lveOgggjs6RYWjfi+!kUN(Pw7DVpr3?xPYMo_9$1KSd(bm5;1kBK0@=2SF7{97NErNlUHxY8kKV@WQiq_N3G8L6q(=MtuS~eSYlS=%SqY!^7rX5oG^n#D( z3z>hZK+ly+nwU&Z%`<_F6@@4R*S)h_pEM)Yfct??M8oIz-&?HRKZ2dRu*x4@XDct*B+ zEVbQvf1Rm^yECu`KJqQfh-pqUU)Jh~nb$hF^GcIUepff$9L1Mw^kmMZJ)cZ9RS7=@ zylqVnajFg;N$u~<^Q{!&QQE{>kovQzHukdepyBwc&giO5XUg17b!lBW<@*}l&qx)g z*bmVxr7T@zF^afVAwWZ0XBxSWjPYlEe4n#gT9;yb#nebF1K}ez%u79{@&BL+zur!0 ziaEeBsA(XN5%`g>$-MS8zGBN(n+g7t(25T|JSB14PX)lbNeT1a0~P z3p4s%*eg%Fk6JmSHUF`+WvR9(bPw$ivioL?>Ego2vw)FXNrsb=?doVaHd>}lMqotn z1JV({wKuolO(l~v@nrP7zVmdd7VGu06H6{UNW_Qtt$$mR-k2rC~tEqk6a^W*kSh}fxREe_6c}9yW_|=yoxat_-|P-rp$cT1vH2(W)gquo!rc7&Yk4tqlvS$W2&6;My^! za~YHmi-OIEl7^p!2i$)i(M{njl&?9VcJp#`=f&WFV+uKI6OV~$9*gGvQq=tGD;2(f zQ%k1P`^_UAH3o@ob8N8g;Ag(G3lzEeR+_@UPljZ$S?R$`!HkZSUN#;LU)F7}=Mu)X z!C%Aav>kVC%_H%4uJhyE{=H(N9M!*#Y=nMBa`j`kA`Xy^@NF650*^}94+MxH!V-?>sI*Z1W(;aD?7sZO(dRuAhG?0vXbZ#4~*fMtXweV+O9da6@SIG z#OoY-jC;5n)8=>HHZ^asvF=h3?xeSKNT<hFTe2U>ORUCAanM8 zRb@$38!`A5H7vqH;q${yNKHE8W&zsh1tFdj+?Fq<%Qpqp7Z;SCC$@%!3BJr2NoASL z%Z$q+zQ+Ns8Nzw9z%z$ELl{9%yT{Vf;VujEf6=bK|47}6rOgg4S*#lC9-2aE>|N>O zR@j;@uPcVdVvb(yOKRu!hRmzg=N%-yiX`*2+A^4=!Bfj`z>W|$(0@BOYSbgoJG>g% znX-GmH%AeAD=wth(H+ht|F!U8yTr~U3CnOG8~HEG96tFDTcVrjB%z!fKMF7fGg2kL zCX?T*sx;20U~ep`l%?rQ?z$GOnI)H*kDuOe87Wwm%{D1DK_DehOn_N0;r(hlclUbt zH76gtg^Ye<1`a?GJ>UmE2hGT zbE8Z3FQa6ldCd!=B*TZDde}T6q4xIZJIp*C1Eo?G1P(&+&lnF9+EX35dG2YvJPR6Y z6__)q%W|czU|0M$v=~BasaWWI$K+MDWkl(KTkF=dw-`+w#G=x=8XP~dy(7Q>H2>zA zDk$Zh`Vmj2TO}nnrOZf-+sio82DT{4N1OR&xITn@#k(tQ624Ej|LTVQ6tdjLD_eF^ zGHFW`pqkV3Y;Jr;BRx+Wq+Dsdgj2|)&z4DfK`!@pRyiWf$EeaLEOhG9E!Hl642f_r+NjcjiNfYdg z1DWW$I)C!k$BtY-;KjcpLijy&Np-FwM**3x3-6&A}B(<<#TKz3*;oLzbb&|&D>^l*Hk$&wv0gLA>-l|+o9#2 zq5H)@&|92wG|j$t+bUT!rUb88Y9{ZJ5AyP8h`I|!bG@UZm5~YCZN&Antw}M=&kLPh zRY=sgLgz<&$Fcn^``U+FMp37!RrYryEC>j*+PU7~ynL)%&9MB3^=}~)do#1Ud8gdd ziu)ei)D`7YTIuBX#N1)%zoY+B;(on3jB`XkE3lefZPBH`IW{F_LPE-}rN~}~S4fQ= ziXCRR!~1`{a4LJEZWa02Lk!EkEMY6@TXM}^Zy(h?GNL>^_VKYFKYny{*@%gyf0x0kF(dnJNTj%VZNNmS%}a>c+JD^{R{2}8 zY0{>r(mo??KHH;W|J>VM$`~!YIWE6_Bha$G)yq~mZy7hJ;{46HV(k z(0Y&&rScbd?s1_c*|XLBf`UpY1|h1&+W4cY*>jp3i_szeM%B4Gd?b~<7Pd^J+X2|r zu;37d!yBhYSC3P)60s=Ovsaxsk{Zc1&uSULmsMekx{|eUP2jdPl?9QYWC9z??f_X1 zwIgw)wLh8W4s<;be>c!&5%%-toB#gmzGXyh_tRSRxdImdKGID6ya!2hSDmf~|2Kem z-)Gqzq24ilFbImiRaw*Y-(N7nUsTVip{=*eJn(nWet7ATKSHSRVzkCY>taNC#(Ai{tI8v(L{#Wd;ZCl5F(?VTlVK?1QW=g;%wfm?{&? zEU6{kzg8n~`2M3~9z_P0|-V{(*w9 zJz`8qRJwKMU>sGhvSg2Au(4Pn(FS|(iB%iYw$J}A?BRg@9nAW@Hh@;}!(jwb5a#62 zAp*exze{JNe=Q_V!wyN0fbb>gCejFZi+cI@ec|!>Ufjt9bnIEqGz&te&`n5DXr$T5 zx^YJJsOtIW;iT);XuCKgn?ok1=ofyOxo^@5j1>gBLt`Jh4k>3>l*HVST-us}a7W15 z(nz&k8?RV-Yh7+M)9g6~)uV7)Mamrk-RfTdSw$tM(*OxaksuP+eCrkkhhSnPW()e3 z0I7Nl7#$%6MIRJ%a7=imUq7Q_&B|^W4vvW!zB=*SJ!mVD&;OH`=OdxFVt04;XtrgL z;Yt8wYl^abb#Ev{%qnUKYc03MT3-<&b z43+pPZ~x_2TH$1z!b__-AadTn7p-~3xb%lgX+@Cb{(Y;bPEM6c;{e?4mp5$=gNI`c zG8>Sf&PGU0yXpdChiUyYq@lPr=n2_QK18850LvRIM#=l_rOo~UT(=PO8r~qJaakJ~ zy|bHb(FZ`J91+t)>e~fqfFMil0lTSM88F?|4bbp_4lORyeT z!QWsum>3)H1Hy?fJp0-2Gqhmp82VitIAztr8?=ht2}o}{?Gn3G1r=%;!{gc=$qz5Gihk4ZKhf}IwfXmAIWkvBrG75&X|rX@{ak~#BgF2*tVuC)J`LTSZO2LS%U0HDw-U zVD-2B|4{4swjkU;aCPp(7YJ+c`D}U%!%&4fnrT}Ho&wV=AF1)#S_VEeycUSnZa zY|VZ)M4^BbDT9=_fE+0lub7x&ZcYyJr~_)FAMmN8>>HMnTD?k&4d4!(LK0)9b6R1a zM>Efc*Z)D!l+Nd8iA=wDHXuMw9_A?*_#tMKq7HN7b0UDPrM4bI8QE1AcsGl6)T(*G z+TpeT=N)(eMnIas25(6P1jn+w7yQo8%liXfpuY2T$lKJLJ4qLGzC8$n>ua?z2|Y!I zR?!QOi>So$_u;j3o74xf5!bKaUbrb!tUB%nb(OH{hhu3ixKNw4^%$PY(cawJ`J3E& zm#Fe!I5ha2TZ=SJtQdsP;<9yvAN6fymR44t0ixBqM`2e_yDb3vWC$2Tib6pKE$X`y zVK@jGP!JT;iA3*-98F>VKf2yBpsH248_lJ1lS>28ox(08nJfB%o~{c!F*7xreYx#pZ}j%Pg42sjJ}C+9+GI~~_>WzZfV z^uT|P#TWp4WWi!KX68M>5R-xQyN9G2fiz1HGWeXHm&3Hr?s2azpE!BiUT@?fM7Iev z@cUZpz#)#`mXl)hh7`zNI|S@5;?t)t$ih`G zQUom04B|Ws^uC6{E3h1}Y1mYBE&svRj7v8L_}#`x{%{&9L~!ch@UYwb>f71UL-HS} zgj5eHqR>bq>aV>j&?w2eNx3cqtp}S4URMA zRWWUC$QXluf+;L`eJ7=fR(kNqY=P~do9vogLr}Q4VYYIo{~a*mBLe9bBPaqG!D$HG zci%zFO5>X=S~dWAZ@@khBlNUYTw*@w<`(O!$BsfEZk3~>05`jG-D0>go2oWhMDgZsN zgLz}htG}YqJexz52CzdE=vPO=)JhT516=?Wq_lyRF5tAn=F1cGVe6chpjyNj&DgqXL9>(V@BQI;CYpyV=AgBioj0 z{@QOvlGgPlAyQT1Z0RH7?Ttj2Bd~7D`4St_P6d13{GNJkeFxl|V$O5m$(If)6NF+8 zKbQIpZIaL%cf(-n*bgh+MVxC7T1Zt?8+^RM=NH~m!neHkFyYj(^ybF%RL~vR{j5F9 z(5?!*10XXr$pZ3*zP^}kJa)2yJ_%<1#jze@JXGY3=uki-0LJitIM_INRoWJ(9KOvU zwmowI%U?ylaPnF4GT5M}L%i7XDYHWD#qkvK%7vH2Yovbz=CBblF;9vV;kd&Fs5~qp z2e`sPI4cPnl&^B?`?U9strvgB!-R7l7E1c0=V`8I)jE`?xto^90pnyxr#5|Z=-Swg%9n0 zBxYffV@ikqUl)ra4h>qoDNv`RkIL!i(4P*XRN^k8bFZj~LX|X{Ute>n%y`4#Gv_7I z|1Qgvd?&~hG&TRod5Z%u@VG9(vs|s(1ToxY0!j%*Yo+Y!N8Q9?1+or^f2Z{>n-XVY zbINYZ>rwNTX|CUr(n}Dz*-GVfi3Cbz2j0wYjVg>GXG1j#?**)`pQENo>bbn#$6uiI zsQ$m$wXT2@E|rG@EdN5~0o*Wit`FD>Nz3$8lU?k};fc%=C_%S+6 zL{}~nnqzL0)=sYh6xG8KWQ~-v{+qHnyXsF~*8cV#E)5lkR(Pa{&(K9dzLDb+o=ng5 zFa}C^nE)K)ed??HZ6d6aPez&hhi-VQos%s0w$Ro|at8kspLGe43#D@S%t&KKOLiS~ zqsguD%hQv!$L|Ey0x3y<4z~lubq@~2X39KJGvfH{bgC6|QU|_Wk6#-(h3fp&Zc2Rw z)mTS)FH;~Zty;gRu>A$`yFZE01F3ByWlynadmK9K!FeNGdlPdChpsOu`W?~(iBehc zLKn0uV&LUO8ZIrAatJs!uIsl^Sp~F6qJ2)4KjXP(Zf6LZS=`-A1|&n#zH^O59R8Ia zxY5(3nFWd+qdUml5@BKv7LF}LHNGF{Sm%z8uIa$4Ve1>_0@x>1R2;CA;q4V&<8%UI zxSj=QEVjZQi3{O^54~d6lfN}tu#i1qOLFM9`@;&bS<=uU&+eEWDpOf^S(6`_l+elX z3>mHt6`)jkM204D84q5-x4o47SxtF0HxxkQtF@RdYp>)=bgV1 z7)V#F%v<+jgo<=QCe2y_AajCmn6_i(Hd4y1*)WqScA5K-IpY*NB3IuZ^x;1H31raM9e-0p}*pO0MAW;)vT~`Iq;| z1(GwF2MenSW1og>*H;d!m-+g18lpFx$;^7r5~dYgEn2$z$vm;OYXa{i+j;llaZ-_b z%4As|692=se@Bka*3gf3^Ygyv4rACBN6g0cWaZlp`#XD=nl$hY3Lf{2)*~0CFT$Wv zQ5|rZDDO!{(kRr3Pv?0W&5&W!9jbYxW?2yG^sSocX>QY23+;u~kR5szF!i1@;`p@Q zs|lIrfp0C9t#Y^Y=8~VAs!WFLF-rhgT3SFMI#BUKC zlZ?iszDCt8@MsMlCKh1Tx4gi<9!hAj?hrYAAXM~_ny96E#%|C3C=+@+Q%IMjoKg@q z^&uzHkAT;D-9F0r1MYOfUh=4;Sdc*0LPkcAl#sIJ&Wys#IcoZeRkPRa`RR+4)>_$z z)Mj0L=E0SZC6`Nx-ukvFTM^>bb1IU5N0B{9ge%Q;7kbPqIr~ zo?baFXBE)P_FS>Oi`?U1wv1q5tx9@Xkt8PTpq!exf-ZhN*`INH$dRf)IC^a6a@8dU z!g={~uZ8`MjR4x4Q34fP-6w{h)OeBfrsrj#H{kd7B`LNd9`^7@ znTGw$@6vP`6w43y+J&RD;xb@bzkwbKl}5EiYbU(2_BBt2WusqSJCHp+{6J6%8)`A^k8VF`3l{(m zl~H?SV59I@ZEQ4w{mF83!PE6^=Var^xWZRY7+8hga9vYF*1vx{Z1+4h6mDzZYqK+L zxBH&&Qn633I&+)xvTJ#ZOGV%1tSNn#(Z| zr@$K4OMcn|IMlSRlfegoGv*|Qb_u708Mt ztWHy!m&0*$zN`yRWxR^Xoiu`zcgF>$U>lWL7g2RuFK%__)k!g0mNfwNvF40SVYS0Y zqm?_z(Tyj*D*E~>&Jn2@=AWmnk)QZK1_n%=m`mQU0Pm;e?%2cTt5TZdf0xOhug=&o zXjkNx5wkz}lD4gH-gfZ9_;uBmZ34W4*}1vR!7Gtlrz`*vi0nlXUM8m3@M-Pwzj6~E z#riTu)})l*RB;Mk{z?qWX}p0YRZb}QULg8A$l4X56slTHe)&jIF$2zPkg)*d&o$@U z?FhEubJ5jc{%d0As_Rd#^a$u&b@9585WaO*Sy=R(DLS92S~3+e%cXt6ch z@GoFYGa3WU^?u?&8xmVAsGZ)I)eE}P{ZQ&~m$IF{ zg$2|4zrUX$=B7Y7QTg_-bhp9l%n|rJPb~l0i|@8E06Mq4pXXWTB9+JRWudt>YEG-T zJ^z+SQZp5)1Xy^y0nf_Ki8X*Ue!7eq06#_p39x}WDDO9T)#m4I00-}mn3%2+I5d)m z{rNSlLOuXd1j(gI@V9S@*r$%>YpVbnk*DkF*}Z2VcMqLk$VA88duYi16T` z9@b-BZ1lta0!Yv#xa)g^dFK}(L+a`SQ`c%R4W$c8bg*KO$`*#-eK{H0z6n&htn6(3 zWIn^%r+Qy(GeJ^YZRk2-;W=RuyAF;HD%Gz5zd+1NMxngighI3!Ad3gq#^+5f@?ke3IC@^6UIgd~6jsoS9O-vp`@P$5f7Q~{qX1_02H zyR)+sz|n#K(W6$z8MnYm04&>MH^9*ot2mtIjy%+z@<(T0Y+J8>U4TfAt^=Z>Xb~PA z9WZVR`d)fy#ia2p)yU0!*b@6aZZYhWSnmDujIv~ExqUQUpiMI;AOHun@5ItjP*p=P za{S#FbO179qyiGaCRqgk^z&98Q-(btSN97ipgMTf)zzB0>MR4TUwtk-0n%xOz>^Nh zwmAcM5h2ll6T2yBoBb+Z9hax50dWx{EiH{o%$Xg0%yH&mmILWI31&~qe;^7gq?Yg? z(H&5b_@N=A7+5*=CXkPlEwKaM85w|9U`#u9^N>+clmTP4L~Qpv>rzaq*pihtnXhAp z^JKURZ5UY;uql}6itBNi(|$(+W)9_BJ0(7tEii!FIiNlmB|v`yBv;Ea1xn;Yz+0RE zwn!{Z0`#RE))pdj=kwVoMyzd$eU7+*%GS}{{Xo_oj260SUm{H8YQ6%)I!_BjScM{x z-M|F&LzBKlQG_o9Fyqa+#7PN*Hlfb`eu!^QQ)FIdi)hfYp5DheAYjwUWY zm00HXH|AUHdX@GzUL^Hh?~xGojBd{t^9nmg-qu+M;$u65zyWSNY-*B0j~2u$CkQKP zX@SGCr)QxkS`V24r$5jbg8?7H(dP*?Z{46^cSzzBkzWai7W*c||%W}bg7g4w9} z2aE}>(hdWWG)d5+i*Q2RWg`QL$f|(S^iyQy^>H6wU>K(7Z9whq0tK_*SorqNbg9|f z8hzdihycMZ?oW|20yqn6b=7<(y}kb5=Lc`e297qz@@-EOPY&|9XVMwmG7En^CqFiZ zsTJEpb=LKuxMpOVQT#yEQ z2jtxY%3?4h6@&Wzo|!n9gRFohI17ll0j55H^^BMg!3Kl^^*s_s1NO>n2#*TMj0d)= zxrIfk&`tV1&bfikZ=KCVFGu@#kx$j+x;nwvX@U?euNKgW_h>%9z> zWwN2iGC5=l{h!ge7ntby@r?uMTMiGz=l5`mAPC^W&?5(8LI8D~10?iP1;W4j3Aq9v zE0NR|#3LNp{~^{Q2bLHRXbAy`!~k+H;>V2q1Sr}QKp}@0w+a0N=*n16SM3v4!#b0P zWeH;TEa2o?7>Z8`_eTL!^BAb*`%$ZV;Km}3Ba zYrY7$&c6YW7rn`3rx~*|7*RWv)y1oJEA z3?WiO>mnw8!4}>658qrcrA6#HxTVNnjxiNK$zJJ=DSv|uxy2% zjdEw3QN0aViWb&##XKStt~uA=aZXNUOJjdQf2ka`^d3$oRsrUNcw2ZIgasPbyUuZ{ zs+v8rsePD~ZvS0)D4`sKPQ|+r18JV9%ZwFHVk+!$(?*q;PPjKBj6((5L>O*|R7UQo zX^v+N&}lh{X|P{oAPy@1@2lfN_?Yn-PtUg;tEHnP0%)4=rB0ZSuQ(SOYpXW?864bl zZ04UsA*VggYzULcW}v-9rBDEvioWBVRpDFMPr4D<8 z{I4MHwieJcMlaHD>eKAmd8*P)9lOOR1 zDRbaygbeUZ()Z(DMx9brnIkMXG1VOR^5QLW_ZyFp?XHcAlvk$OdMZ~2`>6Da{a9gd zrZPSe%RMO_tT8tCFX_-?6=;jIzgB}vh|HF6W_mt~xuLzuSQo+CwtvgGuF)Q;7@$o{ z?;Ik`ppyDMib@p2?r@4=h*&|EoE7uxB#ac5nPMyPM4D2xMC$$ZMVCsv^+0X?mK)MZ zubYyPSxsdoW6%L}Q91R=IaZ;r7}fV0Ilhu1)KXp0X^e zX1io6t@B+ofIr1~*`U?y@?1#T>+)O~6@-cBuED^-f_iX#(h0ZZpxfco`M2)YnKX$H z4N~ExN{<9r247<^$3Q#2SP=f-eShXO4-u9n8^^uPJyS+e`e%|;MmMwob$Y4c|E^qq zjRMVbaIP-4jqk-{i_$}>u_y$7d$sR3`oD8IX|PPa^~a&=N!5Ci(w)Iz^)Db2TVQ&= zgAfSddV^)YS(Cb|duA#H6l>WeOQ<{(zsW`RewX8q-&b^>FmmuW4R9UITKdd#QelHL zi*XuK5K@swV2(M)(mSI3f5WR}O^Ig7XS|JJeMFexhh0@*ozG5PdQjS=oASR0)DuWC zgi0Xthzg@qdQ2i!()Tdp33u$?8}_Shd;@v^_brbfQKEUJJfyufaiyb*(M6TPTKYZA zsZUx+@cwVDvXCg_=REQ;$(C;6v(#AKEy1UpO?6M~Bky88`na8Jca#^2p@?ApSqC(L zjw`|H5y*Cm+goz1rpV69`a8HzYsHiiBK$Q(qTyC>;G0IehLmEI^@VEKXxw!s{KP)W zGJW&UwTtnEg+hNi-C!4M(^U3pXvhqjMzS)p)8qKd!6M6b_vf~AXgP9A6d&Ib2c=?` zTsft&N3n1FEr-1!HsMJ>HGak*Ws9@lNQ~@Rnn=IfUd*3R2s+~Tbt(dXNuo#OABLx8 z4*OK(b>XF|+VRT-%CB>@vTLB;ef{6&Ld=xWp!#n}o5;`GhbR7+DKnc4dlN01ADkV5 zS@F}6=_`QwFpmgv84N0-yFLzSk;oTf7CCY%R&@k_d_hj}y70dZOrKz0wPIT~oMSSo zShdKNU*%M_3g7_l;x9GDDs-bz)+0g;@9v7io)f3mVsFC2p* z(=ilINW?K*KLWi5v)T=8o*j!O_+Ho=WKafHb>I~3_Y6Km5Fr680L_h%9tczgP%{yS zOCD44)%}VbF71n--DMLJA`NeUU~9X9`|K+mD{^e-`e)o`-?uLkO7QXW)*J6y{AF7T z5sr;;+mb|QK8x_-F-1+aMoh@v!>#{r0oaki>Mr<@Nz2+->mxQm&>x}Dx?KAcT<4JJ z6~r$nEj`@^0urGWf@=&dD}8U5iC4eJij7o2<1p)e0_EYBF}Np6fZYuQNczJGbr6!U zEc=rUR^p&5aGbFndv_LuM$J55r)8l3pCshYg&>_kHV8m~^7>{VJ3Bo}f7I$pW6yJK)j zv2k{;@Bx~F-vyMd4)5Q;*V58zm@P(%Ii%pMfhZhFsC)=_U)CIVCln(wpU~5WifRB_ zYmd{@(~rO|2`uIQf7L~^ggS=q^SIm7)#W==Uw5NcZ5n+s#UTDdOACe_NfynUmg1Xn1}IWJ;Q_6~0V)T`>;upsy^lEqf<2D@@11ZYxeus{ zrPzgABQ4utKDLD62ylwJ2GO9gk_y*$6N~3cWQL9fT`?U1o_~Yi^$L z(|K6Q!ca=%&vNHoL}~O#|NoRmaK&2EU(r((h+qd9-6GvDc|8IjS(Szmi@jG+SZgFF zKnZ072dg9aV|jU>Vq>%6;5-cOhlVAGE1n|~ zw{3s0?^Wr3i6lOU`GqwH%%T-&8e2ln74m_gAcEf~ySK(0ApP?EsQ8ry+&1DG1v($R zt8_i^HJU}o-5+-WGLfA3c>bIh>;s9+MJA8dUB69ybK?Uu$17V>kR%D&D!tGuhveB# zj(#mmOI8>T7EVqglF#4@>IEzZC^|3vlZp>S4E|V^|AWCqeA_P5oWG#RUF^5WAwEm% z)zU1B(vn^J7cAURMkF0#7daDxidGCvVeKF6Ms_PgWmv9Az|87c!{0lI%mKR7h*reP zW%woB-5O-a!El?xLT_nrC#9zL81jaRib!AJV8`J!J8`xmuA6xCi^JkW-3sgb(8qSD z)`#1TuI@C_!VVmQjwO;B=mF6?Rgfj79N)To@)1IffU3|{Ap|NNC?xt$%V}MNSM$?= zLy!oyY;5%_G!PZS%pK%ADA7K5<)mgB35F0-WmCBAYZBg1PqgB(?M{fVBFmLD5kxTo zv%A^QlyB!i< zg$SRZ?LS4h&HA54h%eQA04s{jpuGmp`Z~bt0hY|Y-9wjBaQKW#cwX}ktS3t$$Pau$ zkr)%&?nQ(LEoe55O%@UZ4Me{Ye{wXX!g@`yhUOl$Q=b2apQ^w-afjQf`uF$GyRfho z;47Fxc8k?aA7D)|=t%7e_lQ?{7e*1XsaKIktv-NANU#=U!a}J^#r}p@wjSEtNPG@F zfi~FGI-y8~5Ur(}Ca~12hDQ_>5|R!V7)o;|7^432G;^E2?bdh0HzPP=pNQve(AHE{ zRgqRguABo1$Wlgr-O3g-QbwxWv$HegFaFvb3rBb;EK;$ABy`2kRXPUM+R-m1zvrij zM|033iXXb--=r(HxBi32-5Br~6GM<40tf-lfXh){)WNi*qUxpQPLwdRLKICv7unId zWra<``L%Yj7?4ukIfz1|;azQXSidm8*~Pd&<%?q$Dx?|RaIyUY(ICN9PpykY8(N4P z0m=aL@2AOZy*JX82RlWlS?~FBb|;$JJ^*$r1_imO>jQ88T)S0xsD`1mqLJXlhSd70_h0*awg#7zQ=k%N z`;}v(cqYRLo~4mB^!JWD9dsQeBN9rBa`;O?hw=A6B->qdMw67X8P*4__rLPxUuR;5 zuu+@=`)J^^OOwjGtL30 z1#Ic3%i2W_^y*JZJJgpq0GvmB5V}=uWU1fwxc3Roz~ieE8gb=aam(z*0NgJ>C~jRn-=8ZI15MB z}ZKu-fm?Rl+U#Z9uQuh~gu z*RJpX{r5g%p;=k(4y$!QYqYS-2R0wZMX9u7<_@WvndKFQl&kxHs_;(7s{`iQuCr2p z-wjTuBB)&l*uUrOPbM_%%T5dWCR?>iaIV>i--G+Nf7|l8?u!Y>Ea9QyVXk{Q0u1!ru#F~2#QJy3VH;nR z7U!19r+$1e*pv{#vS)ZeTgP2kJYK=oh67sMO^#{IOEIRu=}*a5u-^sx{5`TXn$Syj zg|D*05aPUDAi%&3-}c^=EwJ%19uvJ6$H1Yfl^|$owh9B!Rks$b8jF+q%tA%KAm~GQ z6}3N*v3pr))mZeR-2ai>>!6{Bv#GUW&PSo$>olO1e!FLF8ESs>o1}o=ElmceT|-+$ z6p`3PS#-VZ=!8+C%8d^V4E+?Kr3?HMa(`2kp1yv$1shvdwIOAKm+}Q=6Mp;86zI3R zn>b_^YSMWw=%Y7Gapg4&t&4D;h(&M}oXwb5Uxe~rnC<~Lf(m&Z zK^f>hXT)1J@vCQ_@_WpC>qQ2LZj@Jr+5$Qy&=`zcOUx$~K$$R&Dwaj_`)g=+%24xr zg(bW9e-_A+Vd)>9Os4fVeWpDcBB+=8hTx>;#sDkRljJY{y>VSkUPYkCkhS(4q7394 zc^Dy<)zR9+ZjspCirrX+2<+d=X(fBp{`+YaiQ$h)9)0t^=8v*R5h&M7=Kga-V{`th zagSv(8F_ZdpXqO^7sfncFvs#IzRsmeACJkMLr<^TsB2N0iWgi^M#K>B)bNT~_5(AH z;Kz^r{i`)qyp}78tLJ^bj;o^mKwE1L!ePRi)Ql4NPS4>>U(3L2*uBPPB$m_*F6t=7 zLDmwDRD*Z7IG>S3s*=lAM5d!^Z3rF5H^_%zhreIR9S$ythH?HqEAQIVq!mB)F1|w)&!{D)1{sqWIG+E=4RG zHuz)(l3srT&zrxGf~o9?vwOj0PI*otYD)0Bd%uJhf9M9Asplm3IHByUWVol)zXI#R z&q^qvN0;9cC~8$T+cCbNB416)?ybX2veY@hVa?WMY=njOeivy$B;1^n%$S|sYl)Bb z-I^D#o^L+rOI#;GSlNLG6IHK}D_H~1Pk>uZH07EpHgE^eB!c;gmh}R~1xfh>Kba)r zGG=8LHd?YtU*qLmcOn_Z8q>68U&L8|ZGM+u1-E!u=Tdsjz3VTWr)f+<~bSciefL#zAPO*BAqQCY92)|WGEc6_aP@f!kDW4{ob>;<4!tPYJK-8 zweJ;rzZ0AxvwK4#%9v;UVBF*xwIsTUGu6+kUO2B-_2FYX7E&s6;SYBi4F(GaR=J;I zF6j(>kEIXKyc&56^m#_JC8Q-rq%M-e&$p5;ar;*-o&kt;!VG9buFZ3Q>P|(0RQ~(DW@%F5@AN z{L!-q#YWkaU9498c&pqz&DA|D=@6CK-5a;AISBzEG-T~cAy0n7pii1yB$nG)L zO>Sxn^$i3O*x1;z;NQMOu&Gv~6Fe15|C)`tL;1gt)&_l&v~5-<4l3+LHQr^pnNE?f z=3@kpH}Z7)Aa|^Iv!dkdwg$X2ABtr5j2%}Cld2WnKOOeNmWaOdG)yEZUrb(E`8gxw zm}pWn!R78UM>gfes-AUPt^2YdByDn;Y;0|fQm=SdCjYtKEm`yM0NQI$2UfdmLJAShIIE`20y41iKibdeT$1@c0JXojEs&~RdZ`ulG>8TwzDVGDPe9=YQC zSjoJeQk-yDVNB+lETXBoj0F^*V`M0e{Ld#~ewakDqy-CORBTyD1&8Sbe(EI9dV|X1 ztW(FHoLpyrqo&rpYJ>g4S2XYZ^6BQ^3+Eo^Zn119>NjdfD8oV4Eq3(q>EaL5I|C$I zxfz-dsXy^BVR+pLFo7u&8oak+9ogObO0`HcGrXVYs@3HfK*$9zrF#a|rWJ-NErv`K zVD%~VezsVa73_+PVHIxDj3TiKxt-Q#LSyxIKBOY~ZtC#0pIXaxW)x^4Qj2%P)t8!c z3>k~8H7xKgxJ!ub_voMbVNF@keRx8S72k-e_Fx7ej$c_$K8#iN=Au)SyRoWeT4-Vn z{oABI3#x}lqz-iyrllIG&ve?&FUK&!j#(tn)~I-+7)$WFc?b|-vFMDGhdnMWYCg1j z_P&{dZvu9)B;(6ILYd*9BZ_sfr1RRl4_O5*%Z$*;Y5|XH)%i-fFxpN)NBpO@i|qA2 zR{$;|C?up)S6=^FCvMgj z${;32;|tBL0O%W-=uiN;8p)l7dWh5)1VE8szl;!Nk(f{637T>9R& zP`3l(BLEdQG_@ZHSvJegslnlk@2{yTWy6cPk?s3rH2Je6E{Z*uW2+6||zt_?cDb0-+wI3|HiQFuZ zLevJV9w3WB2!0Mc2<#Fth_8oIazXgu;NTRBVh(n8_C9f7Seu%fo`RsF8=A)RRT3mz+eDS>&@;PGIn<6h5Lm|=shW2Gx{)3pB`4SWoCjyC<4XzQBSB|h-7uvplG zA5t=bBrjqQ{BmnG`QDA$MHT3oNYDqUBcV7$hhvV%FE6O7J-t03 zY0$S@thMYGW3Z9b7dtWRMJ|>^2l@C5i)eUF{Aj}F27KPc9oth#>fV+2LUqqZkV-Q6 z)h$xe2f!TH0lxJ9OM@C`Q4>WyfKTAxC83N4;Pp75QZ@i?eIN}*j6elobTVG$zyzqw z0@St$`I)?L3LeeEYzpVwsqGc$CTGEQJ8zD@hj3y?XgtS^?})A@VmHDsfym4wcZ{#! zJ847wj-JD=39(n?lSg2k|#F@_ku`xp$xRRVg;$S85X*9?{*hXMVFz``D+QNW=WdvoPx z7hrNAqqy?#v|UQsJ(S(?Kx_vx3R=TuFoF8x5gnJ4bL$^rF#ucfq8JFYiFmf$`?DqF zb?+9^4o6f_0Bx|*&O%^1*l+28(aZK^w1iBK#0hTpU*-41qz-12*VK&1I4H+)HJ@J5 z|5U50qBBPw%_bFm*KaLdj^nIdwwa(jZQ^rEkf8p&aEjiWOjul#2@)QT4j=YA*-}cN z!48xO?G;gk=&o(xLJq1V4nQK(V7qbN{h0*7kJ{Jg27m~i0Z@h*i@^qw20dRkw67uj z;CN@|Wz$RO*v~;m1Fw%Hgp(63p8}rNdVY2YNDV7c&>?By0Hh-nv%3(6)8TzGgD;KH z1`v}n==MX`CSa5MX^Ag{WasFgxMa=ds?~IGO%iQOj68XQ@tuYn-%fm%`$8=mdHrIQ zx5B|%q;XT*ZNN0sAHyO3dHlRHE7NTN&U>}A4N$-{+TY(tv;+FUWU@#G#hE(*v~l8Y zyuiE4ge$*oJ>Xm1@RugGyOms9|2|L!5GoPG_beZD^YH<;KE0250jBX*KXTMCB#y_; z5V{yJ0GxoQQwGRC(K3=(4!S5#WLpNc6aqdW8xk=ud*a8hCe3)Gg?}7~r}63BeF4)> zWO(pq0EiBdPSS#+G-v^I$_ml96#Wq!-u=O^Jhz`eyQyvD5q1QT=;jUgNOu(5)*p8c z;uIT=z^!V2YU+G^)#E~UZhvzs*Xh^NtIwgF^NMVYia;c}N+*#60+k`S+LXOBcx^aC zSKgv>9}wA%u4t|!0LR$8k74XL;9Zag3vL)@a0 zd?SZfx8l*^;h~n63kVW_L-!=fH4M~Zh_Y}KxKICSuRxBG zIEt(;o~uG6^Rgs&vo1?_mH)FQ;n6oA>(MMQr71SP|D3X(r{s)$F9^!;@~J(P?l3w1 z%_>s&+rvEl;z^wZ;V?pE#qWw~-`@=88xY)N@0lJS;ocj9W({qd3gi;Uf_#NtmP>J{Qs<82 zp>DeLR@P4C#`3leX$*0q-idw@-aXvS*x2y2)@N~e4G|dOO8r>eo^tYfP0J}&J-riWsSTJi~8Y#kdCy=Ciu(augK=+FzF6ehx{bG`T zhG#12ikarCW=b0+ZMx!oK{EFrv5mwi1zhSY`#ob1(^}psCGxa9Ht}=yA|Kl(%IC32 z(=F(8+kgDt+;9zEOX9TkA#@@%=$@cIGwdVGhKUY@Z&YB7fY8dx8V~D zm#C0eU_o*r^@53|)lS7OF^RFv+G%1-lenac>U2Z1J)}%#e*W9)hDY($s9hBoF!0a% z^&$PIZ#~l->PRI^u0=$HL)5dd@Em)5yR2H++c!?mF51{V%+OTFnY8Lkrnvo=%e+y& zjq+NC51(r3`awO&%otL6@phd0Mu=^R*GG~dQ&HSUhL^^$4x1DDL<}ky%8fO2Nnjq^uyY%z28S%rR#4vCi43J!ovVJ-o{uLpR>vRq)-B`NtTr z1I=?1ZeNl^nGZfO&yI4M2xnBNDB1j(oF>%_bS%oBckh9J7W2-CN9QkAX)AV zm3{04f53QLrjA}L#fN}UdY1k+wvVbwZj+H3#hv`lu8Mo=_IZ_kQF%UC(-cL=@4GB? zo)isJ=LJ9FopgjJ?58V)c*AL{?EW4|5;#42j7d zy5k2?&WBz48gJvCHAG?aqteWoi1WE04$)eWF?KgbN@Lmu{!_L1f3rOu9pglCk|yuV zm0Kv#d0S+gzdR>>oi=_f(-@=TOsTCpR%7Z68~WPXUUN)_3c9a6OE>fAA+a{+kYua2 z$Q+K(OCXu>{Jd-$G0D8LLUQ#7=_w6Es&GHFM^uDt8u?}TOhYQua9tHo)6pZAMNNLGLnE>5M&e1iHG99mkT> z4#v|8t+fLjd+9DZA1jd4J=E&)G}cnl{WRVwDuxO)$}Spmu%t+J(07#Ht&HApG|#`6 zo)y<{BU65Vb0m-1#+N~wEAWLTVNfem5%FHazoJXcq9l41pSPrQ+{8$U{hO{Ufw>NYQ%gQ~#kCHmQzHF0ysEO(%{w06eQQSV^vNpZl z{kZ3ZLaaxW<(pqkG)dq)--RTNKPuGKC$Qt{7agSBE1rAqgHZ$UGpCKC{}SsT7q!7p z=q&3HW0ZntsP-dN^;9f7DOlx1!$V{$r6!vGe1Gy?i4xj!oTA}VBE98wk%{Jg_+DI- zY+`$qlfW|fft(LrL{QQr)>|9Idz)E zJ`W-VoE-vf-t>hlv`ZJ`PunPu7$rbNknZ?iH^b#1?7%H>Qqh0ScwBgPym^!DlGb|Nj!xm|S+nz3yQ>-! z=~%&)90^z4RlUC}(!8VXBtBX&^Dt++-IQh3hM}|Q%$gnAH%jxC=Q-)=odNQ3tXfOr zk8Er~Iwp`@&(OV&ab=1(Tc=_qbcHmvk)kG$<0A=Hnj#kO$!TwjM#iHn*2Fw>W`T#k zboB&0wYU-Kyl4_Ze z)Pr@rTFNZ_hqxBZT~>w-Mfdkqs}ceoC=T&{QTiGM)K$)fwUmZ-V!qd~2yNPKG^8J< z_$xet4!+$iq9^M$=vpI*#;7cjjiQ?;Fb@bLQ>O6nc~toqc^x&vE!Tg*M9qPmK#Ww|z$#r!}rM|KRXm${9Wbq_HrFcM_+P%UN`rG&-~K zg+%$$^rPSSX*H$#wKh|=PlrwUBj%myn0`rMD&hPs5xy+KFGCwf#4JjTeLqspasuQsX9y$qDf?ak=KHjhQHXo7~Ilpu`T(pt)^ z8EHD{396oNS)xhgKh;6 zUl|aDL(nHUWH8FLoKz70*uxX)*A}rqaptZRKJCn?MdwvUjtWMOR+l^dhfiVra; zh@B65Mx7qeb`xYa-I>hF*QhN^iFQ>Rq>y+GB9IVYcI``Jff8{f>ZTt#?C*c)#S=?v z6>)+Fh4h@u9ASzcovWBi4&Zt0Dq&apdlwamZfzDnwBB^;ZtTQfdH~X+H}kddl)VVO zt}Z2Ymfb=vP734nG7WL^nfcnG&Qh&=h0|#cejhQAB+F63$37~r5@!C;qS@ZxESZ+5 zzs7L$sU>dp=z;Ee+X|3UbkOTvyDk zCbCnt|m;dI~m?A1M58B(pRoYrAWz5zrH6v@K)RV=C5 z-q6$Yw++vfR#JT0<;sv&>caUu4EJ3zSvDfZWcHET&H^T03p-k-}0Js z4wWb02VDBNB5D8C5m87Ekn9Tr4PpwOk&+k90 z#c{v#8N2D_eUk_e92zmGq0@mtq}sh6v5afql_b&=uQGA z77cE^1gYY@&X4J@aCWjkQQCD*Otx;0y&~eic1o8ZV&s2G7#Ub{l6};TK-5%qI)zP= zkZ3i1aI0@s*dS9zZfJ=;YCne4cKO4SGsU7T*i@wxT+P|b-_R{#S+&+HHd@VV6_nPj z=56M=@WM8KkF4jMzl`)ZQ_~BD%(_N(XkU<-;_4LEt z)P6d?aY5209`G(LGI6RXZ7+`JEVy6&l;^tF^YxGM?7%azgf0}*LP+IWTH3Z^?1k?_ zrc@7%R}&-YS|S`TlEO^MDD2p;1`F2KklQ`L)}7iMdz+SircQ4d@GYSz)yeWzJopbb z=LCV4f{_tPio^hsz*Q0xz)P;Mh1iiuk<9kMnGABkG>x z50Fa6{{itw3HndKiEgFcV+gC{{PCQhY6)umEO2oIxT9PK9jN~Jgm@rdn-718Y8l2~ z51>!ai<*2!NwoF6V#^x6q_58BF3W&-LBU3|s#HQ^datB>e3wLTa$NVg_+8QT0A)6w zr*t);y?9?Qe7}sdP%EC+Y=1leX96V7=?lOkQbFPv5dichFe#^jMni6U0-y>cs=Wmz zygevBH2E#oqMRG9c?b#Se+=TA4A!*9%kAfRS?6P*eY>ca3_ar4YtBt4#W;;oyX&0z zXmNk@h2Jc8?#S{7Ye(rt-&oD{+`Z)Pm6%_c2S$LzFMkD|8gOE|0AQV{apBT7^k4yv zl-PV6;`soKk?IyGj}IpRiW(do1ab*c_iu-QK`8ST`KiEm=naB~0*+mBT29XO1fv8r zT8M57=q3*V&D1G1#RY6dCc_>*4xF`!gaidpHUai%+!@K@4A>4JSfzj;fN>FM))eDK z?WT};JMdI?8qv}wxp~uI#Z7(k0upg!J^O&0rEu{Vkfa_klZH|HODGuy&b_Zdnc(U$ z_`8+T$o|)w8sf0*wTqCaczKI@YTx+XO+Adf`27$yxd&ylVZ*21q#J5GR&c5!@u3UIhNX9tnjh?O9-InO*cuvnJ6_IdjMoI1_^hb zWx*h28rpxy1&-gsLjSWLIiEqZ#JxWaOruReJTibRH3+&Q8^p^7xN5B_-)5d~kL1U? zt`DI=_>zA0-l_4v6=-nMu_l3ci~LAAQAF)7dNRWo?v?Tu{IA=HTRKR!fcZtV7QyfU za*S612<4k8w^E501%gf%z!al^6F&op5bSsOMqvD-etSo`G(bZ^O&Y$!Sthxxz5&qu zbqJWv2Owk&X*et{F1qw5OXlSvcJ=Gvi=ykb1y;(1ut5#``(tTod9Qtbix~K1TJm%P zrg8`Vlji#M-RV05)r!XFt)sRNj2Y}*94mzh)wr3aqZG+b5ZpjaK4b6HC9cUx)}2{M z%@E#zI_iKcj1`+z_+HLq<_zsnOnnJQy&Y%abW>2VG=b5^_wiCQYGFGnm=j!ow+{QI ztRRoFwSkC;=oG@AtHF2!G$waXp?NV5anW@zPb@)W)w;U8v{VAK7Bn?&FcXkp34S>a z<`pGE9^h7tSaN~ko1;}BC|2|;?M&c1X~mp#dT50#d*;B0WeK)-OSoGvFbCS2`S!Kv z_?1rsmv)gv`tA#uvj`Qcpn!X{K&Ki0f{63lwQz|80t~>|K(a^x5etC4!gb?A&%kUX zPYZ)vzbfMN^wjYc--j*Lrg)k zzGC+UtW^YBWM*c@2y9&e7oBE=RVfYdSZ8;)8H@uW7ew|bn2qJYaYbCvVECX6a^y$d zpzm@c-?r(d;g+lQG2j%w0IcUr1QgCJe~x(QsYj$B(W{w_MUK>N9<640!qNr(V~tPq zhev|lD;9o!L{2;=5q$S6MUuJ+l01)mrY~heI|#`u1qv>CgZ28s!}V~^O#fP^SPfv+wKc*&&zeACn%YZfGhF;-%WjiM(>I9L?yxV5P(-yXN2ARLYsXN;dDPf+4V(*s8;BD%De!0QXi59r03JW z1DTer0ReZ>h$!oDwV#cZHS6>ONU-YQ)*~n=I1Y@*sjn~i=uT(h9lF4{b^7wVamnfQ zVrxJ2kg8$6U_6CJM4%%rq$dNrZ{hnnMTPbr&%9>$$sUvdgJ($=LgR2-ymgd+|rdLpk!(mi5{^Q1X6&mDUj z^PDh9t?FbBlNAn%bGgcQ^0J{7Yrna^u(;>}L|Ge{H_%GJK&a)l zhkfF;CqG|W{H3M}R2+P0GPr_ufTmIROG7(iJ(Iw6P5adjulL7U1bkPGGES5MM^W~! zQltB6SND+Tys^phPBjxxsV%t-$Kfx>sebnWpT>mBUhj|i9lWrY%-?~A=uhtx1MorX z0tsvNZvCyXv7L$X)yL0bFrUVt=&u=r9Ud}hwY3s8Zo7Su5{wCib8L55+=%)vFL-Jj zvAffU7hfwHk-&m)-r)}o6@(W05xlK{z3hHGVdZggG`2oo%5*O!99dZyK+_$B_ZF}w z)plqR0R!+etyX&CkpKm-%R>C_C{kvDm`>_B;d#8(2|`>Is$o}&O?Uz-5I`UNvNvqi z17bu#O26@V)(Audh{Es{NE16cI#S^)5Wjqw*OXrY;@6vg?&css%nzpk&FFjHJy|l# z3?Ql@LK^b7xWnkrhhpi;b**|A$G+lj{Fxq-(mV^@lQ&3pd42!yTfx!);29@jcA6WN zvc@x_!msm&u-c#rK`S1NujNj4Dib{$Cn=Mk5)~Cy01HPCR)o%ulWYLAM}=HBxJyAZ z31&yKo}Qj9KLjm1ucofuit;9(B>xRxxAKYeA_68AJ2WQ5wqwHa@ZdUF+Du&9wjB9n*G5(DYx5g>xC6ya??UB2&aXU}<01x|&&(S6PoKZ|-(Lx` zXSn~{64x&7|8W7d0xv{DC_215TuZN15roj)`|6H-Z3P^KNGoFnLpR#U(Cv>~-B73R zaCJqfzvu8ma3crN139bwGqv;E2oyV0Q;Vxleragd?X}mUbC!9-F~N={&mKN~q0MEn z-@m)n5r&9KB8Nr=`3IeZcU&t$gLVoq+n%40@qCB!iA?2c7Sa7k-^^fBSVyN^1xqMxEDTRqkAxI*`;EsV9+j)Va9zy%ta zRr$>-cAGafoRdE)a6~V0b4?C)`9mT0-~OKKkxZ|_y?7l*|YZA>%KCx z|542BppQmWWq{miC?h3G$2JtNXe8Zudgv|Yu%vkU(p!uObRFs3GHyVoOe$pv7k3Rq zQ$=pyZD?5JxHV}wdtGb>5%Ou@7gQV)wis)%i)vamZ)m65G+!a3&=p%C+nhfdY17Pc zOgD}-lwT4S(|=J|qng^dgj4Kp5=H>-H2Y9Knf2VUX}Pn`HT<|iV*c36@9Nss zwL3dFmPIydtDc%we4E5Ari{cqH`?vDVX7I}Yxz+d@HqQmdi!mW|2xhiyhHPbYf}*o%RU9v^?)WDjU4#RE8E-{{7vijKKCMaT-~BrufuOK z@+b_?<@+_poV-h$9Hucv6c@HPX-N!0?z7h&I8juy9E04HTU8^%>5W1FvhY>JLF8Mv z<;Mo%J`d8S)7yT&fBf-Qt*oEkk0|WgV0bbW5s~@a^9kp?Fn7XC-4LnRIobX4DYMFC z7h%acsi`TS!hJ=kfaShVsHp}!P)w`3P$fR8P^igXUe&K| zIolGKa1)H8TU)!75V^wwYgUhG?6rAiVE=kZoj&*$aZvp@E1_AqDF zt|$qAu6L&CR&`OPq_ST!+__?@g1-IS{SNAHNw24dZ}_z#jeub%8s+oM!XIT}KgfCu zM}Wfk!f-d#9kbN2%Ge6_r%uU>UxlIztgjsn(q_-kbZcAE@=}(PEod_s;TOL;Qf)%* z;mYBgH|I}Uiy6IdiAyH7D5t)&Ii(fmMzF-5AQ4W7v4E96-@DGAy{Vty;-DX88+3BU}JB;NHyh3_%nwfP!I8HMNbhImKqp8Nav}_ehEj}B)7d61} zzbin(Jgyq1NBbx9{(C7SIoOh~-+EP{^jPneUXLgq)u01udNjB>H8|Km1S9NLQV#`6 z-j;Ooj|zGs;16>T>xwYzxl>W}tD72$2{J)BI^ zCsDVVS+lLKWo5{26lR8v9h>F(ERcHCMY(bHYkC|Odeg`8 zBXxa#d^+(y)VAE}jHG)XR1+Wf`E{up7#82XIZpreHacvfTY}Zvu>FtT z5G5*-(VX~6&KijO5?chLo5<+(z)HTLyXLd@P;tfST0ON?P0}yNqf=Ym^c(bL>tP0y zL^YIQW<5zSFx;5r1!NNX5&rITQLKS&POl=bO!wcTH|~}^$&0ckV?!~8b$EYt*SJ>n zR|E$2Z903`97N5WfE*~#LtZq6eC`LaJ4JyW=Rz*%2xWu*=&s;^F!hH>)yJGg8K1Q^ zlO6=#&1e>B@x13p-!9@fA!_+-MCJajk;U!qz?E8;Hso)(ICtzzcd=Vcn>$0-4-b>O~_LO4AzV%v=C|@P(2( zIbEF0z4F#@qqf4riAuhjemZW*?kC4pd1JMC)x{WIL(3c1Up8;dg@j ztL!zl9<~|-K18T&l?LI$^A$k zm`#9EAgEFkZBmGAb40goe`Ml%7=GpVcZDtv!GapgsVo2@qjH}&h2IIgL(oq3mTHx} zh4$gw-uFDFPg;MT(ZNn^(EKO1*ZAdw7g_lx%_Y;Aw$96Vb(%JpOJ1j)P4*rWseb+) zHJyaR2kZxioD2N(HbFA(8QdvHeDAe)Z${qsi)&KSduVPQer9QVZ5(elRET+V(?*NR za4V<|ka;cmT4+gI!|gRK3jBJWRLuE1U7(#md{Ju~rWQx1IX1LDcCNRGe>noMu_$N+ zP%*!-TTRc4!#ssT#8v7@a56FOSoFrFEDDJmqVkC+CqK>4r@6%ITpP#mXN&4F*SldW z$WbK!Plz14#n0f-^e2{k0gGQ79*YHeRLn;C>~EL8-*gv5qhTIwjXMaaNnikKL6%^~ zwd%8y1!zI0n|^HHxBo_gki%^ zH#}qs{66y8D$+{dpfQ- z6#|JEYax9EF}$lxmcwGN3uz)eO5yeu7Nl@KK21NROrMRrT9pe3iUcV>qsS=dk&CBtpbSfxMhjg1}=7x;$valk@yQKORi57zSzy z_UCrdR0pZMoZ^^MxuXVF(5Xb`>JXi{AqrQ7X#G3jGGwYRsAgrg)69B!0DuoLe`V`&epy&TZpE(p}U7)2{cGBIib4mpPD`Tl+|ypI zq&8$eKXS&qXUv6+QXLK6w`uOb{WllhwZF`Xb;tK_&b8x_yu7rb)*q#;o(M3S6K`iI zh=73mUz&n{i5WDfDTJZ$Od_iO;Nv$=Wfu+Uxxu_Lt)D_SJT$T{&697dd#Dn(x^cQo zWAlOllc!P6##7;;kv&l@1dF5qM_{r#eWx}o|*-TvrS zpeh*`m8g0{i^Tf0e<$T3cn+ZqNnmom&N9rK7N)(%Pm5{4N&T{XWtVgvJxFa;D%QH{ zfW);it7aud)uQqpc#Qz;V8_Fmb1=I~G)aTEaNE-&lU)E~dO6EOXgUQ?ZsoMH)zs5n zJovVw%YwI`O9+ERu9v~Kg>*>>5r$bkr}Nw_Z!(f~oU6y_@Mr*M5dHhnA;#0Y>v?5wFz z!SEd?{L5ReSr?0*kCY3GLBPlPeBp=k9qqGCpVzl1eE?+76tY)WohL|h|58U91db~2 ze}vl@uLmjwR0uNu`tmNqx_QS+PCthC#)p&p9b;0b?#<5_Uv8ft^xVqh-S-13xYZ#< zbLEC!o>Svfj;f2Z+I0;tG_`?iw|b~H?}e+dNAEbiFY}OkA4}T@kl7mWrsPh)0>lI% zeL~khJIslviu~p~-W6(qsE+EbhwuokgUtv6xmNIhwIHIYFCkYh&VPf2Bl_At2KM>H zqS+TgN4CrPg3@~BFn-gMQPtGuO7nW+u?daNAjb8P3HJ2<#~5{(oY$FKIyezN)6H+1 z!u7pQ%fscoWsnmi8PT(|rbs;p^m`6H+Jp2j8es<_Fb$M}{{bn2gkZALvttNhU}Xgq z3~B&;K^>~c$8f_BV67%dH&l+L35|keKx(us5vN{2r(zan0aj=21)X*Du^fo+Pxh9w zp@bu2XR0h;XaM>usS$HLAgMbOMY#ViOuh#B@a{4tY(M$lFz^-P&KepTEIs-uA-wC& z*)eE81#NoJ0MzV&vH=?TAQ{$PBx&)Kk)8vJgSoix&5?vW!#%^BMX7k)Yp=5pOW;ny z-ctv+Ti7wk%xFS{7P55wJl6HcM*L4;Yerpt(g@7RdKVhrjn4;%l>62$!E3&XuM%Vu!psq&@@Kt!JR( z#|?q2LQYLR0BnMu5yVJZ?R92mW+H{2NNFK3YF)z&ke;`Jq!IvBdmpH&&a*Wj^A!uK z17zI5q#*;Y6(ms-sp^F9kBZu-ZOMloblRKX7r6=gmUcev!;oTYOK0n5XPzJZ<2qIC81Z#Ol((%%~kSm85)7n?Q zq6QL<&raKbGQX#W@^#ql_`>jHVAli)>g~zNX7xV@>1#7pDPAIg9^UK8QY!Izi&>SG(XY&<8JAd1WO&K0ZOtfeQei&~aN8;R4JY?8-2Ew(rCo7TTPJ3ZV*G9dc>K&`%$ zB6pK-0JxSGa7~mrTy#wC{c1_=>%Sp+h5rY$ToKe z+e=B!X%8EL6m=zFPU>cicR{3DDq-}^<&leI^HoQZiIGS85f)#t4`7C>l;Kev*qnLRhS)lAq4olpTi-vn(L|fp5z@ z@dui}zfOa0{S>nDF~{2vKayA?lrkg*+%`6*LNH~7jfS=f9HhD!ToFLduPr~EYb+T? zwEAn{{a=M{Z5zmgL~Jq8Hl}Zzn)E@;@VU+|xi#HjTp+uF6V`H?PDmbovQvWu^WR2GVz=fj0&yuA)kgOYmo1 zMG`z9vuA}Q_zV*`o`F`>Ux>#u&^=hM4NHG?B;Np^Z0$o5v-sjHVCrfEQK}tYXhd`( zcyE@+fYMioRD_+mCJykH-9GQm5lY==8bVSD!R2Hq6GTk#=J!;G`1&0%tA^JE5~}|2 zU)@J(z*!z_)K9=hy&2399K3(MAi|1BiJ~5zfR&Y#fb#`D-cveblRF=--?AhntlBdd zOTSBb+V-lJ;5zx$Mxnbsd~A!+TodZR*yGjXRQN~YPYdZs=TU=U*e@*J#ReUC)YD=>;wYBr{VLNACrVw zB-PVjD2|kCrf}#WIYgUK35-}LT$j6%L{I8~;miklAAujCmGu`vwk231)us(k;qRc@ zX9Th&8c^9lI+IaRy@yPu^KJQmW?vadNl62NZ48gjfs`LXAe(;fFOR{_h)_H{srTMK z#YUoGHsSKKii=afS+-6jz9uG?4n0zBX+BP0?s*{k2PmDOh20+vNIbyot=$Yh*Qi*| z_K*SKy8i~_wL4B0d?WZxSp27F&G#NPKQQbL`M3fYZc;no%Xf#s`$a$m6XT2OBMBZ31I&bzK> zS7K%_6>ENY&S%2KaYp=kMQx6jM1pJS%|A`|c zPxYHU$nA&ir+qWs0?M$_VYh|_=zhCk{l9((;N^gqeY;cy$ydBkmQezmw%%M$dD{Y{NaisQPtPW^0%hvn({8_mln2q~IDed=#KO9hF_SJy?x>E4Jtw{ddfE(QyYRbrypy9x@7=m3bV!mMgs1AhYY)wUm2w{*I{A0cd2Vm8Csqq|Oo}C$P)=>pKsZ}jjnhqO@9lw2|CIGik8b1K53Rkb*hf|lRd}4qC1%2g_aw`=VURjcFqHV!qq(4q;IhUmU^cuhUCG`R7<3C; z>Z!w!rtDTeqqJ{3?aLw54OTQesx~v=8$!`3IYLwt9F1D11hoOW<%u9z(B-eF{Yggl z?q~7NZ`N4AjyYE{y_cRZvS4Q~h;6}i_32R) z=fjEvhenGa?uwE2^ZAk1Og49%e&W}PB0M>gY*p68W3>dn4-i@)X_fz_Wz zCwt~&NyU3FMaRc+>RH-7mC|Rwqxn=Oh8}gDE^JFv_`C`udZVPQ_E>bFzduf4*wA(T z1i7?Wb$*bSAb55=qIszA8JkDOt-YzzOFk940sqsNzDrrFaUVl%CqJFj+M6Rj-j`tpLz?Sy#xp`P@U{n{aX`6B$QmUV6I;sXtJ zj-L;He`JO)Ijs}(F}7*?X|O@5rkQcpjPlr|6fwPLcCY`#;y~lHj!J#n2zCqfxccDN z-?`r^R=+%WN`xUl;N!e<%vjrFH%|KzbI$4WN8#A4F$z?_yIJw?KQ;zWpyL6rNq6sO zu@g1?8k4&}jKiW9KS9ViL`H9Tr_yauAN<3}u=I5E8#}oD?p$Q4Ep;n%Sv2J*Um@O? zg!&G%;Og7EPM&8EzCGBlTCK7BSI&9ImtBgmHxJM==Fcy}o4bP}bo| z@?nx82aBUq&+!Ry^Kj$Z>hW02bqd5|U&dxg2#?l#-xMTQ4xLI>Pe)yjuWS(N&{>4a zqj4xr;JA;7&WwZ1r|e#i(2?th4-s3B%rV}e#;e~pXlS6ll1SbAWsYuQG&cu>wZ-@2 zqU~Kte)(T)vFKPV6d!Imn%Nf|Em#$|)L3SvI?NHgRJszHt^Bkvd9J5>l1L+uc96;I zft!MzUEvfdQ6DMn6LUYmS^mUCBkeESCo^^YHQ@{iZ-R=vj#k@e110YohNe_pv#bgS zpUf`Cu5i?EJIiVOSkF-Bic8*##19<^eSe=EJv_bU1FOWPV+1>oiJjdVuTA=tBvBt1 z{PIx6SF_WW&7`w2pY-=);Nd}5N7*!g?+7Ri zb>nS6E{~BI_^7&b>ZfTL+ib@u_9d^`#b2G0|359j?@ytgFU_TT1!AY-x#rcc)oZPW z{pK+)ahf?w8yL8;Fjf=7HBZFWY~>iMqf$Z`Y#>3;5-eRkUU)^X#3EMbF`>v9z7-zf z6^*T^1D<+|u)DLD(Fd}<{0-;RJ`Dp$O*~@`W2=3a&U@)_>)!y57$0kr^uj2(ukhPc z8emAVOT>a6QEa?k$naO$<6HLO&CR88PIju(iLw}Ub;>fSaDB>Gl z(~f$5ln{wy)pq&1(u)oN{m8Y}GC@w$sv4h56_J{~)~?VW5#9Qmt>4@hoDdNhtNzy_ zn9R~V_kdy+@;~{iE;&>267s_aPEQ+{HPU%Kc(d_NoUuQv-~9ah@p~sc#;bOQsyIHl zFdy~!+~v^!-6~RJqUAx{Cs3IRm(^x26x+w^cGcs#gg}gkXyS_{;! zL_*3KcT$@J&ySwUfkG?;&Plfmg7&A%5~fHAuahKdeRRuA`kwAvXE9ojk|Na9JrnTF zaIkr3%=tq5>bJ@ZdwC*wCGeK1UlUtEx18?!t^$?Zq2oEc5t0)@MxY%Hh=K&VbPG46 z1gsgLm5(VL8Q)BeHbFLu_=`W)S?4p!`XB6+^zIArCo`B>Zz&R0l z0T^)pahU`oLbLjM0l2nC2mTNPIaAAs#L8D(G!<8KtQo$x7epln=5M5%bh>qLaV3`q z$x}Zcxsytf+OyW!QR)Z^4hfWR;H#PSsn-my|8DD4mP$?sIYH9lF1UT0n-P(32t;92 zWo2eozzNR0&PrBGL&Lym8V>H}Fw^_@-m~`KVMi@@ckx?yTaqx#RfF#L6X@O?!HD2d zr=_Da1KwvxOH0eQ_W%QV16r>i;Z~2qoBs_Ila^l_V9NRm#%b$BlRGC+>o5Z!I+a`H z&YiGsxIF$FA4vbe%=-wg&gNbMoOpKufiXI`fH}??t|fq3MI}<*%};)UZ5si%3A$@* zeKg3Jnd{)F#5Q;&o0<4BokQtnd}duunty(_3-HI6LWSU zDrZnP`G^7qf?EEQSqL>OXj}A*slCeDgR&H13PX{hJa1Y*0+8<~&NJ~1~v82gN*IV|trbbN4mc32{Z zyyM@6HLvFR)cm5w0RJ?Iqh;dDMNN0}^a@^Ku(^_0!0+b6ecQ+pX48T?X#nfMd`{T? z_fJkMh=fUvU|H}j`tR0+-xwMLsTU~W(Ga0wZP!n8@RdhLjRUR$nZ;UeZf@a6kSXwR zicTZt-riyd(lLTm#37R%QA>K6JWOuNkiiM!dSvd0(DI-+EP;9h88=+?a-3)2dP(G& z9TibfOk%&1n*RHpG?_f5a-Sd;C+{)0iaiYFUIlfatG<&h)^DvzK{_gPtck=JM368C z_0Av%et@TrAXR>%SdAR1xI;9DmqGFc1qG&`4}+^dRTxBq9+N7trV@0=zuH@el8XSo zLNemfsv(L6q-+y_Ww3Jmq@H1BVPSdK-!JHQbRSXYLtE`2Wc!;|u4|;UaB8=>&_viW zj9EJIgs(I*$1lqI$BKuHHdOd0^+|G%Aj)cZElH3rL;MHy9zH{0ws-4DOe~ZCSC(|B zMTSWhK~X@7ehpF6p}}%01Vl6}GP3E>t}y~BP)o_NvOa}G3U?4VJ{>?xG@*Lr1K>_` zZ-V8K|A>2q;tjo?ha@7&*AicP2hz$9gM+=TDAxskN0^6~uU{`dSk`1eRRN(WAr-F; z>;nULe{k=dC0|ra{O?0hI7GKj>b7FkteZF|Eo>UL+!xo-6XPly%|Zc!$cDT(08;Nk zE{SHA$a4_gV0pV3-BpK_qWhv$xwjMIES>?do1^BvCgu)~xy=^tst z&Qkm+p&B~yN`GAM`iNU4Rww^z)W~o#N^9XWw}f5}Y?i6tP65^=fy>Uy#Z?iVlFOjJ zzzow_Dd52adJzZ1O*x{l2^F!ofy^uvckKpB-Kdwzjvqr-e@I26_Lm;4vr0++?N$gZVa)wtQ z4e8{G{L#l)Fb7qS$ePbu-#!}qHVSXo9s>+kzQ*ga4%*6H%Y#+||YMaxNd#K*c@u1K;3WkYB*7MEG z7O^yu1%MN)xQ2aH8e^m$X zS2-C7R)bze+VNCt`wa07$T7%j?1qW6Jhe1`u5>RH&((ZR9ZQiX)hh%qRXFsjyzT-< zf=*NDlb$Q#xfrxPS8O=we23ZZGc>4)W9Naj4~%Lh_xp@Ph4m=QA`Oyp8+%gTkJ*u8 zYI+OB=so(r@;KApA&=?7{IzpR)pn5lRk1Ht9whdf70!kbDum1E`TYGmJIA)cSHoDU)xd&2Lo`dnGCWoRJ$CsA+of%ucW(x8#a zEsr_wlWUKvI|&|e#lWO3ARua+bmQR|D_zW+a!-~-9-HU=dC@ulT6V8L>!ED1i_@7f zkG$>ptPpUFJ`5C2R5+X*Bt0!kF8$ zoiPVK3+B8;R6-@`i7!9@9P%A*^(DgQ+8o0Tl?fNAv#8~n%C52#l>71R$VMmfU8)gQ(+^JWqq&cUb!&RH73VzMnHL@;Br|Xcx5~*55iYlk7C6{2QNJXy1@9Rr3+4IBDBZhg|g3aJH2_@cNKa z$!sGyG)-acw55d|`Gw4G@CwZyy^9~WEQSJHT^S&m4 zy)IurT{Uxzy~={-2hXb2|9+hQWLOvF?)!5k$Y-Yc$1%~mHz+k4=gi4JI}go>#U@NP z&1F9DkUn?;PS(MU#A`mWIwt5D_#4*0qorLvo;c#oBt=Fp*S-s-xXiC5iB+I=+TRQr zDD%4N&_>MGQq1H2F)5kujl%2MAUVSVFSQ|Oyp6DF2et#@SlL-de_vd|>1lJ4uB%#+*k?L)9Up4)0hi0ONRn6id-n!S$dxN$F*e@K6zrGCK@= zW}FtGZrTH!*HiC|tiQz}cE>!qZx#pMmF@_wP#T5x9+&F6v$(dbum^M2`3JsIwe?ZuFAb5#ezB=XROA4D zV_HX>npQfm5@L*)IQR!NQT-ICvf??mcg*Wk#69N&vb5zJ=BZmU7-GGBUsTOZ(|@M0 z+E+g4uI<};5~j@HrKA&H{S5aj$@ohaOx;4rBxW9T$uqngFR-xxVC&>9jOH`S)7(Ff zIE$#Ae$>mD&vrC7h9fYgM}z{Qo_WQ%lI_bLTFyuDW=#D*v3%-gF~47(Evo17Wq+8! zDSgS4ybyNTSXjCI&FKfEoZmlKc}v73GrPlC#tz?Jc)zi0@4%DdIG0(zQ?;I5fcuO9 z?(5qTP^Q#%V7;t)H-jI|6x^Z}W@)q)P`5dEB(mRSoF1<>G0NJ>=8hf8W;JLAuuEKI~PWiUVA7zA>mM8c%XRzzv z1`u{DRdwCmC#FCEXNoxKhmXnnd^d%obv)!E9&~UIHSCMa$mD>7F)?7jD+7+9m=MXQ z0kcyIsg4UARxnNYEnKNL!YAVOFO|&hew*(Mc(=x`L5nT34rvxgb7q}iD-EIxe_%oN zQJGjr>w&4#jYu8(>u=uIeM0}+C4;*dN9NqO@Fw_feUvbEj-Kt?{gR?ok$>7odoOg3 zJJafxZ}^#wnK(qi%ozb5G!HlvQp$WrNLR^Uh^q)lx{{o#Muy)(!otG;8CGNi#Fhh( zi6LmN09X%g6`2|{ZCr`WjnDS19h8j?4#?z1-=umuGmxKIK6{ zzuDHSsf#Y(>p)1=f98Eh$y4(OONUk4B4+G6I~7^>n)VsML{++ygl2Zr^)fS?6=>q? zpDUpMis3NI@C}r*J&}rBngdZ_YhMi zL0$m(ux9IRF%j4Ue7ozgtgx<0No5&T1y$+5x!eT#A21XV90frDBNzw;?ti!{2mRw@ zUWjKfmR2|d=F4NSUMFXoT|!&X{$qG!2w4F<_j7iQbhOab3BTi@?B@nqe|h+`^~B(d zezs!&M^<#_%48tMbG#q-Cckb&B*9>y;jkBht5>)O*FlYf)q$Q~R29AHd)rq%nh81& z?u<=JQR1&X8Vc_9+|f_x`=qVgLrh5Ju9Jl^>OKf2S6WeL3jT~3(29U5@=m_olMf%c z{6-!g+O>98uBP5xn_k5XNhPCFr(5STjiL zOG->saCPNHgV~jhZM`it=lge8Nd7c{{6&JJc=+IeWPquO>6Q16zH2K5)_t%b5FEwBXcCr;pKd zE&EM+cg()Sj6njMm$Z2MQ%7)Z5F={Jc z+qZ%kth3=^f;z`Cam5BKM6ux>G7`gNyf89Y1QtZXD5Tu3y9H1}ynVvmsX?!|2y-d-(&;9q@k5)3Ns{hglwYvfmp9wk`T%ntlu zz66=YJ@^#Z31BU*8qaA3J99qt45nmf4?zN;$yboK0{npBCCK0n{IdfLuwYD%0?V$^ z;Pt=v2+NZ_+n3ys5frJigmQ*{;~%t(?NWw8@n;z-XJ*R ztcvm+Ock*dt$0N4QUlNLI|w!1!UR?D72jD1ph+{uA|ejz<`&P`-3{}!Wh&+#W)wA% z9;0D>bKl{}x9^6C#KbG(sk$^~m79}ajIWFl3`eU?SKyKeb>H}YOY%_^1G)od)B3ja zUFq0ct)9;~bt?KbnDT4Uz8qV0ivKY`pIB{w&t(T?8v{?4%Jqt#)*WyAGP=Mv9)(9D zdvX=J5cy9mq4W>2QiESs5>fAf-?0R7?qv#>+4xdm^bhTahlNoPg=27Za#N8VE!6G7 zwW7+#L_CR?fA)j7A&KDa?&;C6@Yn%tO>3T%<~|JyK}qIdV;z;;W}p*u_3fS6huw9<>j2CvcD|-f9;I`0IdNx7hx{jKjm<_Cl?fpvLL!kI06(D;oT8& zA0(i1r$Wo;Q>a#Y4m&sk@gV8HNMR?adC-w(l*^2OpY*x4(N`@@g3{`W z)8M-l`=OWrUmHN$gAJijl(s%w=#$R9^>uo(Yin!DQ6Gi@j7q(Dfk;9;*6zT1M$!r- zcB`8R2HX$5ByHPdohBPpzFA)840Y89)T_wDj}m&nN8V&M54n zTZN*nD+>O0F;K2<6|4F|)+5K7+C)r)X^s1%MvLLx;xba5toNMP@iz)i4qt6nB_~{H zRqG6JURv13ot+l}^i@+?ZN%bG(3&9=@$wFv<(2O$rsabwEiQ*&s{U*yPSM6y8YC5t z@ZQ#wo1P9XbtDw%E3&8Pyf}#A{*gPXPqBaPoX(V0;O!2t^68PXx{%nzsyGZUyDb+u zWC6_YM0G;p7!o6zXDC|{q;La>4y(4#jksjFGf8@1OAPuK0bZW7^q;?SIzL-;YmkT0=RVj;eeds52}WP& zt%AY9_H*--Z&{*?pI92j=lFz^mxQpQbfa#~^7Kvxss1|iP8uj9cb;c#2DoYfe!CxM zc2d@p64Xz;L(CLXJ3F~gjbj%g+Ro4Q8ZkCKurdf9`%Q|J%51B74n^8cY1t&8nikim z@Hu`T(OI>9*YFu4sD8 ze0Gq_{rg!rDOY5I8DVV&w+Y6vuA6R*{Z7~HkHZ}zol50w`5>Y`_bjgY!9EA_tMl!G zHM#NnIV)ch>z=y@Us~2!tf9Z>Vh6&!Q$`s*XvM_B_gB0KO7Dx8-_lVspC!JxcZVr? zMrBeO-K_1o%Uk$q;tb!m3m#)g85Zl+zichDv-UE>nk_w~_(#DY^h)k7j_Ig`v)mO=Tfl}%#MmD)aTL}iZAIH+Jw!EkB zQgyMIJGn)}I!LTQZq=6Qcu+IwAs3B#PyeckVVDnP|$|g z+om9zfIBqAsX^0f>#3_G>p>=BCU~EWqL6nu!}qWDgJjB*5Zh>3m8T@E*l;8w&@cpl7BqFsy$u>(yzlEe!_* z!KN9we`qM1;R9T)L}ZQnYi5wVe5H_>qqS)%o%f)zh&j@h;QcyyoJdt5}H?r2(oh>1%~%hJzM>`~PBnpm#{wTUf$Y6C;sQgu63 zreE5OtSa2=iyTc~&AvI$Cc4cM>9Np##bPivy^rs8n361_+A5t3ZjCI+X4<4ksl2Up zR&UJLtCOx(4r-`p%XVFyMahL5Zy@C^M{th~l|$Z3XTvzIWOF;){Em?W%f8yQV;EP@ z6<0UHy+{|VxV*aUc2^v(JNPHq&iH{fiO%?3zex`4-9udgUB-ajjYB8P=hpe>r~GN6 zora7ua!&}`+kbezx_&(hmR}!jgIt%sZBlO&26>2+Ra}5@< z;T&4a3LV4Kv7-Pe*Mfik!FAB@pymRd@mE_%0$61V2Z=xG36(W25d3X8xG{b!?73Q! zP)p;21mzOY=iB$a;t2FO^?EX~>Us-?A9uWvfArGT3-LBi_feoISJbBLIj#MdJfZkv z(9XLuZ-K&bF;P|B2<@FXXYy?i-tSx{f+J1hvsGmbEy8hPrAQNn2c9RZMq3% z43-+38W$wf`guS7OwUIrz|>_8#o^4Rpd#S)4i^YUG$-ELK)OQ~E_cuRRGV&Zm!8n4 z9bS9N?8<-ot2a#e8Aq0$l(o_1f8jicCty>e#k9O8mSHr#6bmxIj+$XzytZp{ANiP# zm88pFg(=ZB^2J!OTH+F+@#DDKp#HvcN2MROWWIK$DZ66OY@~n?Q0)`D>7&{YxT*xX z<`)~!%))}ND-8-G%WhL`>LX|H2hv(1gTI6upDX(z4g0}K4cGk3^n)C{!yft;XOHcV zp42{Cl&^Iyl7|#pqVCY*H5<;d)$69|@W$vQvx09644a5O&q%?2zrP|g^OH0!2TnlX zg@n8K_}ks|C&&v4!y(GYzKP+(m5RO(i$%Pow)R`-5yqRpd=9vm@2`ZQ)-%OaY_>7kNCW@2kn-c=n>aCOU-0b z1G^Zi2gP*6@nb~p2VA*pM0?fJd_(=^=Z51|&)ets-=m%9BX(s@ct&wwlX%yTYab%6 zE(hUOe(%msm_o}?tBX!ap7Rgi2fT^_;>*a&Ac~@dwl`RJ?@0M$mC=%q`>ih~A#Bd1 z`GGaVb>GBvOy07`)M8x}S;n~whA!i}gevuL@Kb9HYY|82HNh13R7P$o;b`TfKefXN zFR{zjQ4&1nfF&{rWbN}4l>3v=GaV$qq^NjMek9R*@Xa*g03L`*RWc-t5d!p^SA@N- zPoJ7B1*ok=M4&4?#t;{E)wO@#qiA6!gG#*o=BnQ((FM0IyvW_>jUVXQgM9#6hX;}m zMO}NlfYZy%6?h%9L&D~Q<*}I_oQKz+*-iS+k=bG4Tvr~Xo=#%n*QzskQ5~(3CY@5W z@#mZ43?5BN;Rqjfmu{`X&a-iHJf*p?dc!bwKe6L7m5)?qO?2;f-oXt84~c)QpAKKy zgZq0B4ic~EL~MxbVMWp--_=ciqnj<^?3I_BE4Qqi$3q^6@)+)hRjLy{S>GReaFlgcU`Rb(`6ugKU*Ml}Q2bpsDu(YhWe6oDL9Zh(W(h2v(x5 zJI~8it2S>BDGjA}#ZIZ5T!kk((aDgfB$z{;T}o1M6vk&so7LC$SC^`=IaQZmhwj?z zDjt=C055{8H+t`?B^_x$YC+|g!ciofTJdpGPhQ2qV(u#q+me#%Mu=7rHj@en1NSHF zP~5OX-FjQl&xOh`_;ug<-DFDXvF?0JjZz!vd$*CRijVJH@~aoO8R%Q9F`XCksU@75 zEzVPKq-Km_tX~qtWA?gYPOl8_`z)0X%Hh2k%2#F!I?uHc1Y-=2^zp2uY1w ziPtZ_@$cQ++HJ8DrgXg4d)t9zDvQUVyOm7dq+E%)p#y7G{~FP3MZLPsb8d}YE*>kU z>vM2oicJZHmCt#mfoj8>f&GF5-2a?#q(M{0+%b-3CD{~Q8N-u16mG3-T@>OTLphn>{Iq2UH}qGw&?=7+@H1Lh^>a6v+3o3z z#umcDB+L0e6vVLmnF6J|V23#vT;;E4w7x-_U7BLpF~xrJf{trfR*sPU zildJoJHHP!$W%yCtu9k}YapdW$26mebbMzn@P^_aOx$+YpLmjV>r>KLR!UK)%Ib~e z9f$}Nhxm+MfYkIG*?aA{)Kf@W;T~O|x>0zdAM?f8s{<>Yu7c!#AuqM*je6IAx8#Jy zC1}dnU?l=AyNu)Pw62TQ~Rj8-4jSz~;mGsM_*) zXsBEt3Rwgp@yaWXXI?SqiaWRNCI_k1_3P!2Du-VmSn+7w(?7i%mhryq>%dlJIQmLl z@?3)xUB#ftm`vBKv}tSW-O(pIT@ts`9=|_p{wLB_?Zawup#3?+Zpu5JyRN(uRQL5n~#hWm}GO}ZD{NpAz!JCEhll)JH#Ng{fxA{t3|v9PT85RXTsxK<^OeyIbY$4 zd>wkX-Ioov84z9jh^~u;+f$v{>7UAQ9J4D8I@DR*v=y*wOHH^)H1 zmGc!)&6bIg8~KWeY1Kt22vR2xo%XP3sDZ)bd7ohB7wew^Y@1g!+Q}SkU!T2SpDJ4e z3=XL)vrUDt4(_qBoTo|)L(i^TgdO(8<%uvt`(V-50X%kkTy2yuEm1fEaA2j(cERVJ zO7yhI`s^iiult?qc_ADIW8B5vGZ^113*UF9;V1)y;&3bbp%h~u>6UVsI_m*jnau=F zA_W(rUEqba-rpw{SwTn2#SA`DDSE!(xJLA7SigE;qRqloot{GK+_}l8U zG$~hSl8=w1Tn=s&R1|IRFl5B2VNAg-yGgbu!>QXH(Hn!L?o0_>d@VSG)f7Gbc-O;ArgX=go1PlNJw{gO1IJy zlG2FMB^~#9y}$dCVy#aLN4HiXxI<`9o*Wv`^n&2z%IZV^8yc&qb9>0nglRQ^i#f%fzaYoG$ zwM_8c3%XfgtnQ>{@G=?3p*(TGoM;;w((S!Q^zip?_pZJ|UoAj{GMiE3D1UF_I zKO>f_kg2{@oR2yKbOkhW*3K_YynCWK2}nJl7c^`Ib~i5pWGx4eO(dNM9OLwU*KIdn zfzLL6Ik+g2a2fQijrqh_BhVB4)4C3WqTArY16GrMdl1av3qx9FKA3#V5yj@`ml!Z6 zg_NMQTW9oF|8OU;>Z5X*M@3SOz%sAzi&OV2y?y9`Ec3d$R68=4*WI5s1Z@%0whxYO z4SPLon1d;~_(ALIbJR#jE+TTh{c8%Ea3NNtb6eu_Ra1Ic6?-tk8G$w&5wK0wyc$fo zJjl6yP-s7OH!3^U)gvEvLx7Sr0Z-siPT<@>K5*1f4z=!=&61N-VPn*kI6QuB+~*pb-(UHXnaI|zWC+w5&~|E0mTB6+a_V#89`0Wmp{K$A^o896cF-` zV*$_p;Vg(7t%1O+R8A2;1@$QDXF4t}W$2D9hOnOR;LfW!D7b|C*R4_JuzP#%m4QL> z7k$pR(A(@ZkSH`&Zu+?Y+cy@MOX!6g15w->G(szkr7--R3_Pue;XtC^Nlx#dy`?4^ zA3y1y0khR9=q_yp!&#*J^b}Y?647ScpTe6ziayIqOIyIl{0kndqu@>%vo2dst?1w!{RG#& zkiUQIr%8a=ii7W!iC^U0o>X8v?jDb&O8M21`R6elRL#P!66t%MRzlOK>laA#*3`TJ z0Wv>5y>#>0mWbv}B0|Jw7gBz5=aKWN=To*juZ#x&T6_kKOYH2L!N?|$MKH+ zCTOYu08V`XO@J&e8y_EYeh0-fvD-7tplayJwl*`%&bJB_Lb_3lK+pY9H6|t|3y~m4 zUhJNwTS6(ovCz{?IKA*h%zFnC_zUJwATdv-JLHaf{w4d96w2v2&_NC%dSXChbHQ|$ zeYC6Wtx7`E)>Ku&A+$=TCPhaR6=@cH`n9}l0fXhdHKW@dN}dBtEB`JtIIHgU-U`2H zOiZNMoNcTRqn2p;DlQ(GpjSDTyATvL`Sd;g?Fq|vmJ3ohwP+9YhIe~2aYQe-kevZ3 zAjFrscE*bNZeec+$XTcZcx4xC!7YhlK({ic}w%@Gfh4Id*kuSARKc=g|-@ zZxI>~&Msy^xs3vy##hYM;mRbiEA~`T37(h>e|k{iI-1}AyrSleEtnvu3=$SF1a&n~!o~wl7ywh zmL*~V;V;X(Tih1RBi;{B)`Y2o#N5qm5?}Nlql~!@2^Xu!+U_5(XPlS3|FE06JR6|e zK+TUH5f#-wRb_pLKmXYD-?*~(F8;4o0W+Lh+#?RgeGdvA;`m$o_RN`P zYrS#vrkHJ;JE-k(p3E9HHyw`|DfHMw#2vCpOW})QVAzKJo~mL47laHXCUc_H2fU)c zIA3gfmfR-JI{_crft&YdTEOifp3fW)M(xPHge70%agQ4=#q-#(R2*_yfF|IlvPcn?4B>D#|Vm8Ofp zkaJ-Cc3Bux_54@#++@VJsJDlcBCJ91wC!PG?}01q{*-lzYV&0Z+vhRpJb~^Aq<*k! z7b}8o|8Hn0Q5HX;hs_u9mw?`ttwaZ;aRf;W1+9sCh1ru|14)m8>MFkx4BzIgf5Y4i zG9x7rYd|0O!S431Wr=o8&ne*&f%Bv0t0!O? zKn7jnaN;nB=XbC^9=`R{(W^y-40jl4NhCW0tbi&=J!>Xygm79GdqOPP9tf<6_}swa z{LZRn&VqBOxP{ANy74DEq!mrpXV*D~vgJR`#h-a@!^(su>d6?%#71fjhG!&i+xS+U zdfX55&((eF2^Yh|-;ht5f0ETpD#~;PM)g}?A3Y08AdJX9bl{kg54#$<0w~vd#DMh0|i(^g*Icb3?3sI*a?dzadS&32>Pg9KN zML|qXgxn?_>Su2wBrhC)5ix_(mnZSs?!P|$?KpwR#nA4h1&C#&=jV@sD*Z7rG4btr zbIn7~snhMV2^)cbzis*m`CQOTQm9||5%$Otct;!WIBMSV@$zC{dylkLAPN)rnI#Y= zIlPq0AadXsn&ND>l6+87CHz>`{^YM#tfADd=cb7h3Eg?^#p%c15-g?reqFmqe9!Wx za&jw@f?Ip5;H$>ZJjE9G*1HxzHRmR7j%0vkykN##g?c!-S(=z+7VDHPW*#ZJCsXbp zSg_2m_c+h1$a}pzDDhBoRrhs8lW&i;{zmr4l8Ef7CYAKD07k`W->`$1*W7xvyALVB ztV7Nk2Z^*Oo4T=S$skLHq~zP@{B6_4-o@-snoI927(oG>0kOzEP!CAYT=F>p%=3;u zy@j!IS>oZTw!jKrs+yZ{_|v3LY%X~YdiBkjY=xpYGNqHs+`(2U)`sl1kVTDJR7HEa zgh3W`hK?#<><`i5Kl4uA&Tkc2J5?{PY1EL1j<~}%ecey8;pErn9FMt5^KZcQzRR}B zB>G#4N-wlR>Wk&=zNlVRGzLz!ABW|u1Lm)7z0R^~juIgF9?dyJ2dW6OM2FAZtDCF^ z9!kZx7YteTIdnZ%aei9|dNxk1*>r|NiZFDxXmv9Sp!uM@YWzzQ`^z=!AcT>z+nm$1Wl5Zo3Kp zW1`frd5*p!5MBG9jq{1qMk)S5A0s-_)CIP@#N1*6ty`v9yMesdd5LnVA_puAD##X? z$i9iSR7dO`vNTJCk=nLM`@$)Hs{X4K2}<}Q$tJ=0MlXq*(zT>yiG;1;oXueuXI~0| zTQ!GP0L(tKRgwSF7f+%m{Faov$Deo-xyUWF`f4;zA@4Q*F59E`0;f3l0s?>KsoT=0 zi(|cEq5oFadeImpXyz0DQ=7K|Pd+Fpooa{3u3nn*Gowj|WN5i?iV<07ILj2y#B8Gt z23Xt-^A~Sol)S&*@-dbBLPPn+-K^&+O`XLr%Tb~ffhmU3DLx(Ykqo)U9cy2 zw)pA@{dVlBRSD?zx$o1BKRq$OS0G}a^r`IMYy0a^rqVl{II$^w|s`s9_A@Ct;;o_yEB*7tlO zbJ9=B^uB1|1@W8wLv17Bp|QdzR_8yxy^~4v3Nf9>Ll)hX3r&(7q%`eMTu~P|eK1PY zvx!~~w?)TLkSvh1a4dtV^rS3htud=k1hFmmHBkX-ntnq_JedtDCl6#d(gpQz(`cy5)_> zH?m6hVOJX*wg_-_b2ncKh-;9?X1Z0kAH_Yc)E6fY) zafLP!?WLF0X~pu)gi!LMcRb~+U{)^k2b_(YZRBsw^2BOhHY&M3@tyYZsy`Pl4xlB; zW5JW(7g`SEmE=%mq&c5XR?_o$&|Obzb+Z6ssf;M$p}x!9DkndFk`_6p+xGC<4F1M- zR&`bW#(G)2+b>p9v1`!AwF>2u8_f;;=~2X~QK(w_C>f3N&n zvE&gA)OgcWO-rN}>w8k7&#*b`xrp>$gIQoCtErDVi>WukSGVR8?o_Ogx*5j%*vM8| z^IA+t-N5C*lIl}E>o2JI8I@>1*cxuB#?&aZ|0S2TG;^E634}&iuLO8}`FH%Vjuqbb z@fI)uYyABy`=U?bbNZ3J{l+E7uO5C|Xg}ZAyLvr%Fv#{U^V6OS{W5$tMM^Jt2<`6G^xZNzhu0Rq@ z#7nm!s8lbib^Vi|VJ{XPnYSJ3kcuxc&58t}rt92{Fn`G6Akj;|uPfs(nWG-B-_5ME zKXXcuOr%U$=D#1Sdg>x-H9Z^Tho&uU_MN?%&5Hi?@8W-%Xrw`l2VLLB{V4cF^AtS1 z!_sH`hMpMR=a!PnRQ$twRUr&bN#@-%R2=%ht`CpMk$yn;!Z6a4PbzN}bf*gU#jwSs zr+atjgpxdAIoj}@>T48%f}J$$$ZD3+)CC1;^~CZHQYJB8zC4DVbmqpF0+;K1>%y^y z+s-FdT@8jd@L(3wb8w%u1yFx4Y*T3WcUeuFriY-pK z%jVwe{~MQ`u7mbXzB5Nd^ujB*Hz(g#qwV>%9qU-f^UA4Q?jC<59@0fl5ma%!A&adZ z86*&-jD_-zKO=WOFowNg-HOsg$&J zt-i=fi;vwH6{V`$w2*m_R-HW}nw3LQDjY><7S=x}Kx&aZcQSohz0KG1K3_EA784hV z-oOi1qey|V|8{8>4ADr@3|ad~;#M4c%#c~K%jD=@Ne}~#?z#!4wvowU-E=hMxEL=2 zUX;VT=6-E+Sxxi6tQ2=-&;mCz;53m}AqGp@MO-{}XkPN7T25tfgHI=f@-L+KK!#iDd^qW)8AfL8i-H^0(3_q$)Q}gQt#BOfP*d zJnq$(nCO7uK>;249dGj8G=8r-Dxeos_=8+MIZ(Cm(kCmgh zfOGAd&97retjaLf8{R>_wXNftP0Yus3{mEFvKwDhlURRxlS2a$)$>SZ>WT85l<#p; z?c4(aa44AEoxGZxYEJn*`F15>%(X4aJy2_ez3IVm$7)2A)+$fi;QWf-H_zz5*b-ZF z%Bz!a8CxD?E^*yZeZ_-U=| z72BD4fD!sS6a1I@?y?t+g{|$$O1OxoNNy>{3a4SBVySRAq37boR0m@reMg14h(YBb zduSn_s^kk ze748BLRp?IucC!mopXll1G@Gy;ZLdx&<-98ZS4`!(Ha|8 zsV_)t1%*Ay%|iwsnyR}b-qC(AoyLwy^;gI=5veJBE_evy zMYgYNXsl#M3+n2s2!*OYmXnM737%b_p~2Y7i6|plr^c4@+qZ9>1TMlfnw0~|Q45#z!Y1Jj{vJ4DAIrmj&^+ZA zzp8IS`LyCSg(Mf@X=g|2Xrpuiv7#ENohm@gm%fh)LBEm4_7L+zMYnol8q=Gutq^ z#>@axo}ivGf5LoxgH%#o$}GXhfl)_3=Bfrz2Y zbf7M&W_RVRnG8CFG6xuwW0nA97a$i_QfAzpyl)R__W=Q=&=Ky4uj_s3)<~*vhl+H? zOI#isM<#pCHn`?^Jk!hr;B*Js|;#n*H;Sf+&l(~aMykF9A)bd1BoGA>!*%RlzG+ErIfwpOMH=~CX z)66b#nUm41Xa-={)G1TaY0(YZg$BWM5=87NW05#B06v@miYTw3@B+F(5XwgMaKacs zfX+1w8E{yZF>zx$p`5Vos!FPdvX!eK(Lxp9sW`G^bpCTxN9b)>febrMcyY|h|xAk1KzBoqhkob70*)^uNyBAcoRGe>{~HORT|x# zz^Ju#q1}tqTQyA*Q`#5Mo8pE&1;9BQH;$AJ$j0*2u?USIg$M@h4j~QO`k-r)A%M;a z0%C_}CxDC+5*oN~^54C0t7u|E4>o+(#X_LSClh|n481Ef|7%h)Mw(o{G(n!&E@;pZ zKKgL$=VJs4;&~w*_7X4?q{SgWA&INzu&>dcN6DK6fE~T+k=SqFs!b z?DadQ0EA9RPTnhVxr>j$-|(A{=dLch0oROf><4g6RTF_70Ym}2*9V82L$^D-!NpK@ zjPJ{eFoeXxYdw;cy#_gub-y5tiIq*O@Hw<1Al``}%in?cu;hp96m+z>)Z&SE_{^4> z%OMNN7d(iU2kT6g$CFPiEBN>!vkt+ThlhuAHS*M)xqinduOlXl5ZqP&Kp+H-n0lyN z-}7R2je7#q&g@s>B^m-7Uwl>Ep2abtY35fR+( z&?w@@h;kDHZPM!stW}7I00qm>x6;svMiXi}+?Yh5oFTxYR|S8-WUX>o>B$k(2GHCI zh9*DXZN3E+^EEh+PC{ZFBraN*nVB70BR>KkAvb>w8Vrbr5L~hQtZpSv;AMh<<*@V{ zXuc^q3u=gyI7_sdwXuoZl+bphR0!bG+zj4gia%5Hzgl!eafFN z{+@e*%L^gq0Ww7P#n2{X{%RkdpA|HI?TvAIA-obWF5iJ*T?40%{qG7w;qh^CI_%m^ zyv=t=vIq=OVi`Dp1Zh2DVNpxm3&S4FX!!N-K18;V;}KDh*+gojm7=RxoEpCEB=>R3 zg3iuT8e<(motF<&+68r?oucAOzetZC=}B?kn25ZXn(MCA%-0BnYkfIzUKIGuNaP<( zMrsN{I~2_o_`@nB+tIPI;t(2vwTe)fdo`FE#$2p6H~?mv^6>pNB;^Z%$ze1n!I7o7 z8{B8_)3#}9KkEe0b`W}fD&~OoA_LwW?KwPk#GKh`%t1-S1s)39`ef}+n}q+nPi)#@ zz#uFaJW~QQk#yi75egZsTGG=M21k=%&yciQy7Ay0O@dBR7JXjXM^)@zZ`a-6$}dQf z-AgI{SiHlP>Z~YZz#8HRcW$Rc>;yl_LL#HOx@UUFz-1>~tR{)PaR5voBFQ4x#i2hb z8RQmP0%$xLL|eO18^^+V_uE)!k!|MurjmTeR+RQX~*J;Ay6-JhE8a?wn&jgGVb zV8l3>k`&Tr8HZdyB*@M*_E{Iu+Hqp;&dF!6fgl;RNS7xx27xUp9!$qYq;GW|F}Q-g z7QokN@CXioHGPYeG|GHy4PW^8X_*ph#oQMQVELFQ@{~Bj z!7l__T}w^AecZ_Lkip0qaV6nU6P2I+OosVwW!&C-WR=JH z*B5n*2}O8y(t8+MnTwO*276;&KQOrJ1$O}c@9PbvUJ_UL;rc@K<0PoS*VlIvnunTC z6y0p4eJd*~MPK>f^#V^T4p{GIAhHmedI?h^(d+UgD_;yM)*}Z8UU_->&f;r;G|4>C z#kxm9FtlG7rgqCUX)oFPQOs_!#wLQ@G`PHAxFK?d)-xT>OF1TaHl(!1e&&I98eoTI zXZ{*Dh5lOQL!+cYZY3r>nb5vMcwnH7)z51D|zO7khgnU0%v$dW`1@za|-P9GR#Da2)_;cHdCWv zo*KhQawlBY*i(C~pyxjgpo2&6bq}ufm`m?e>#p@2*GCJwsy@e~F(Z;eT>)4iMZF94 zC9ze0=&PB$spir_YcknyMnMABg<4rLV>Ak1@_sIBOCDepKY7fRcv2U#$ia&f+hSYA zlLI#|_8`a8#B#GM&tf&BFE}I5P?J{ntp6m~^uXcwMUVg+c7b>Bvl|D?O;#BXPQLVz zrsHCKs8@5UMWzQYjTT}`~#aB;Nce=jSGl$cJgdbTmAfy9W&iVM7 zoU981)3t;S^#G0C#Vay zKq!iqWr;ccxC7MzRP{1eZc{-)0b40qQt27;n&hZQk}p>_Sy!8IDpg;MhAjG2zD`JM z_*|<~f=tDry>k{kSK|q+FWf%|bO>hykJjH|i@bp=`=(5MI}V~T0(abdn3Q^ zBkgPnI_Ae7|J-BPN#OE2ym;)rJ&1uPBm3P`vXG+Bktt)8tl&jt)sTixQi-P@L1FNHEJda(I!3$H86se}7 zx}a*bqX1q(wUgn(0&B9YD46bYXK;h z&Rl}l^MY)uYA0EjZW7ji0Eq+YJH+^!w6=}&e0*j63IMcT-K2g% zP|ac5ntn3nC%`dHc$%q|UzXsG;w9(mwL{xDgIpfv9KOC`4#YXCJr{0S6J??oSw?r) zyu2=oJ41cDJv%*_Y=S!^-8}oeG_JQ~E~s>9Jp!v}KrP{KeAdbf)^gmHcPart)W7s_ z7VzC!Xoug7^8V!z>kOlr(!qKs4Os#A1K)7^j^?N(lcKRY+;(P{?3{k9HXO~Vr<56$ zpJA!_zB@oEopgD#t@4T%`z2fZ2YoQm!L+LQpz6VrlF|g5Hp1`o8T6 zv)G8%w6DG0*jhC=iiV-`dM=N+OQCx%Kn2kS$n4V?YS;lHNzEujVdm>+>4RZ*`d4rBaFCU=Y z_{`KF8Gx^!?~IUKE2ljsAaK7nuA9{P_1o(5L%(sEcw@#nex*3rWjmGdQ|0aMbLk~9 zHD`DA7`#e!d8a!1&=rp?SD?C9{jXESe~m`I5+frdjBt;^G0o#r+Nux^j#N+4wJOnx zoXoGhEi&$ka1$`KXv8($gLlGMud~=MRtOKqukk&m%P{`UWXCn6;Y-ZSwK+YAh1|*4 zJU$pLgO?OHA@$I1I-vIoe86uqA?pDk5$xJg+ngtA=99KC)kHgT*7#^=&?}FGOhd<9 z2edr$tBJ|qq|IQTU+W_eB#K<|oo`slI^W6# zl8mBlkyqqw*1G0QGXwmGDC{3O0#H@dvT;+;n$55&%>|bu#^Q0;Z=O9E91M6K+BSfG z76=;?Z{fh};#=dE@k84OqXgHnlLWt?Wj8E@MwJu|n3H8ivP`uF^p+T+uz4t5pAHnc zN!B38RpWOo{rqJ=vs?Tu7J5sg&Q;n&EtWnx`<^7NRTep*kW~X7-9Z_>)+FN^MeyqM z%eQc?Rlbm6V0MiqD4u!SH3|2DbkTr`PD!mqTm+M5;L(Vz z?^B`bLT%G|b;8-co)=pHjTLlWznLKok{q%?f1nHJi>b_5|-*v@BlwGv5l4R z*VOyICu^({2t%ZBSH03Na;f6ewibbzF6?It z@B?gMPvsO8cvBd*ou1=zRfQML<$NZbhy zTb*lUMx9HML#6nYUa}b0*gW;{%Lwrqm(83Fh0q$X8ph2(O=V1TW`K@%97tr$_@B%|l4(N}snSQMpVK+|az6&`Jcku>KkDgS+1-1) z*CqkxoVBRg*L{u4g~qVf>N`VmHFLUrJf7>)EI??N4t@AH+c07c$MYf-0XvMoFdI7b(L zT#N?!#vNEv8{Y{uW&Ygo;81A5rta=2?Oqv|Db{%VwNd4%>!*T0iePihJx5{G1&5bs zoT3atpFsOL}nc?EE*8F5Lbx0K77mh_gaFQN;Jk5z9~JQ3Wjb35mjK}xIv5C42rC34HM{baM6fsA!z}+XU4{2ZGz8qE2q-E0k*IFC zMZ|;QQNCFd{#D7sz%OwGwyVr$Kge3f?(D7n=kv$rrAg?SV5<`V<-2 z3hujK`}!)8-yts8Hnh>?AnhxI-3Z6`;ZQ2E1Q0m$!R-p--dn&d?<*uNbwkv++~dc< zAF94PhL!D{c7I;cx_=2)ewbuhAKKNEwN@xg4?&H05L*xqL5H{P@~F7gKG~(=w1GFFk?pS8{j&*;9Q@lk#`G3 z$KU1E2@nMnct;V!kHYgh0kG+_^#Ber>wmP;va${4M=X_SSVXJAOk zGISk?{HX%0G6p1}iQplO{AO5=fU)7W&X>g-1M(SZ99F+xTptG5mig6N(0&4#wYfn) z{Z+kON?eL8XfHrS^HrH}I4ZmhKLC%NOS>jsf4AqFAA~i6q~G&`zd`Hpbp0>5awKic z)I|aAx4%EQz=QQ#uv%9TE;?~IGP~m57tBgHrw8BMIlESRW0#K30R6a8 z|7JTIWO|4J60~N_@1NAdJ1Unr@VvTsgP7PhU;gC+u&EWvmGZrQ+d=H||ARTAz%%JB z>j$JL9;}u?gol_bF*RysE8Y=)v!w_Y%rNT40L>^Si^c;CLFf$%)-p&Q-`GdS$ybsF z<|9VSM~270NApJRRHfPff&)c%o0o>1{Yh2Un5%+t&2&G|B8YBJ%1@jwM43X> zdEh)0mRt?qJLb*z0ipy?XKBcuN9?a0XV5%;r}-l*0R-e?QXg;^poyc$b32eJ`8kYG z2&Kp;7!z)|=cAk+{E0FaF9XQsdzus$9+hZZ(h(?>+rf0U(ftjS=}+cipcmu=7c9`A zc0tbwcQWW3UW+=^$drO|}dxE9X%-6#}V(`EK0{U4wC# z#bbCAX&|0MoP+DC<9C4p^~=jEE7y(*_eqAyn+JE*&Q4Op5V=`4Zn6D7K0v+SBbWxD z<=?>?7i^q}Sv8RKBz?P9OeDGnr4Njip?x6^01e0~k%Be9f3a|zm{VSwF+7%FS zIG}g5Scmr1ZM@HCTTa{pVMNLiU7_9lgAHd9+nUetQbW}*pYrnVB@Z4Um?L!Eq{2D| zS#QPj)^`+*c2ITLsKWgbIVX(P2pIHh6^m8}4TI!a5y0p_V+EvC;aD}(H!0Tr<|@pU z4|%{|MYrsQ%ps)@@~hy{gJl$AYHk5frC10-tBRX1-4M}h03n?q^jnY#*yuD(uYw&N zEg7yFz-1nWN6-(Wq@aLGrrEMky5r<`L6o_^b z%&YyfQ9d$wkeV;L+i_blMLY?XlF1dfC0N*mZ31NEG~DF%mV<*M6eiHG+D`zknTGcV z2L`5rB9mRW+!qX+hw{{!tj3Fxbz}))JUl!+2=`D|-9Gt6ES1y@C)PTmS0>kAg*vOL z4IOqXHD;!p#&F8qIabpy=#l0%-*E^{0$8JHKvV7S<}_(|H@f%8pJkB$ul#&7mj&=0 z3cR#Gn9K0GpFzCV&Y;(2R8F#65Yow2sLO{U`BMGX|I-2>`cQDL{t5*J2>}Y*jt!#} zDTe@tk5N&UKfmz9`=tlRI9PB{qW$@LL|`sZc^(^~0A?R$4T`)YV=&Bu#wcc>F_dzm zr2HLHer$F8r2@DRewG`As*ns8Rk9z$Wta@T6NrKPh9wweat#*M%qEmrBik66h%-BA zU$bCgq8zM^1p~&Y-sEvoVO#Ojnvv0m8Z=q|h6{Y{VI1}$=Pw*+wRl8@9T&%!qE-NuC(>JoqzxeE zdoUG0Ucb#~5-#=LSnN5#*uTKza0Rlxq@|@*VC_q$5kQ*`;|)^IOc*5d*R#Oq?6sid z?{wT&wi^^XDzzM8gld8mfbtqBcej_i! zMu`{3QD_uCMq1nMEna$sY*teO8!tBgP1b0U%T5jTI$Qw=>bV(vx`l~JSW=mR{3@iwN7wq3PfbIi9*apT8+&Lf%={f8? z2yb{a=OuA=$eegeS_H;T6wMJy`P%HXi-Xkt&|lZbkJSQxP`$|33cFP3;3{I7j#T!E z%|rF-Zo`rq*qNczBmhz?hhZU#4jw@zvV$(2FgRjeT+U73ud#;H32*E32p|hp>l{|1 z%2&*56)erVD*c4~z>R^kIr+SK`s)a|HpcOq;*8~M8bj3wZ!_-hGlUu|X*y+v*aSrN zJ({l>j78<*4Y;Y$BmA-WT(vA5XndLvy+4}@6-yM_-jEKPoS&Eff1vxDUpHO=H|Pfy ztqj}|fu?x~era%R5%M&KYY2auO2EX##0Gvh5YQDs5b;qBYH^|!a~|=PuRfA&b45#A zdNmnsEM{4^$rZ7pms;gGoqaEESW^poCT!2b(jcRf8~lJ7>Prz5OC12gfe#vRN?|Lm zeFqL*mW4eW({zrgX`Gy0VWd)%!c-MdPb2fWIkKkA0p@`m+gmLW#!-~Ged9NVlF>`&- ze!Hyv_`g^85KS*5BV+RStM5Q`TELO#U@@5M2OLo?VFnx^h1+v(!R|NI{kJ`D@7qkI zf_q(+fx|ZjH?XU;j$ze2fDViAkYm~UT&3P=JsZfYA5eBIVJjYkpW`3bk7{flTpfXy zmX{;hp?Ks1ikg~W2AB_2+Z4nk0RK>oN5=gC^(XAr&a((@EYc0fT*yOk9)s)#>8Djz zS+Ikh!fG|yUU#Uggl@t*gKg*X_`0~Y=%>Z3 zJmNXgYmd$lDEj`Z+4En`1N>$>=0}8arB>9__!IxJo(|rRK7U(|9keG@im@<~@lcDx zP^ICu8nL$bxQ{LN%eQzZKi1?H7-?wIN&*@#j$8>HM=CAVk)~Ie{hd&0>Y#x#Pc2K~ z@C-SR!x0*Zqs7C+r84nLm z4d8%{aiqTv*#2Cgvf!B_7YukdK;yN-0Rf?+V4aF&P)J-H+(!O|BTyEcA|^{-frA_z zV1PD{(l0pzvq~n|g`p&f8m=OT5twbMa1Yf0N*F@>km9eBtr#y_LKyaU2yQi@Fr&YN zKP*L!gYuY}E7Fb!vo$3O`Zta!lse-;a)Mf8=+4?#J{0Hkg|k_UL_(|IKe8@{S>f?_s7u7?{OLL<=eH{PCf3+NaJ@o*dwPlpV=BV~A7j711Ut$D zukPn+G#f}nQR%U5NEcdD%R!X9{VeY^T_km!2_P81H^d9ZR)rK*=ELaNX3W&|1KRs? zNk(LoATYy4xGkfEmI(2RgVAvGJ0JWSlul~Rbnl`bq5JzZm~(0x1c0Imm@wml7Mc`w zGnXXZ++VEufkTqf_X(!*%IRxA&w)I83&-N6@>Qs2%%UU-p=xhE#_ADEg&?T8kr>C z9#{UEw>If{bNolZG8+Jp9!i!pZKnC6==UUDB{-6(e|o;nqvt}6S&rD2uDz2r9;PK~ z=|t7e-3BQ?L4naq<(S9ZxpAn^WOW|@p_Mp;W)5sh;%fUn4t2~XkeOu;vh+*RaNbI5 zeln5T_MA{$>G3MQc7D^g(pY_|ssMvh^1e`(u1X$yLplLgq4UXKkyyh=c>3v@m&qBm z`@$yitbsWAzz~?vx|4lS9R>>oGQt&2AKQOo@Cq_n0}ui_&!dD&-)S$K&SKI^9KgNq zsBCi|P6&I#%P&i$X2f&!^9l7C+t4Qj^WQyse-4VqqFq$VSGU*3LKZPo)bFBa*|NgMv?)z(ZP?uj} z?%gs2s zJ$jJi(tJqlBHlJIb-wYY;rHpm@%UGo8&zpfe&qs|F+it}mWRGb|p$p<1#BFlV$HG>4dPxNJHAEH7OOWLGu zn0NZB4w!EU-%-z4|1&{PU;24_m0_vv3!x z?%)Zzrggudg?^Lkmjj~FpI+o7)l>kAqOK~!qx^YHC}bxypTRR(04RGYXsAK8t(mT4 z&#Ty|fNTz(mtQ4cT2wgRps|(7y;1m3UiDbTm!^e#o}g!mzjtxJLqUtmANMgR1nc4~ zNa#kZr!AvKb*te4G1vXvx=ZU&guK2<#pE!fa&p7)8in6Ch@%@qG_lD8`03}}zT$6HW)y`lS#mdUfMBhi0C1!WOlyXHiB}ynDcPw&nw1q)0OOb@yeuHHOaPGLV zs+$?nkT1rwg7=#)KZKP|-|W*Do{*@U2u;9SD?>~=q(ARiwNFB$mwJGyl^0sC_C>DD zz1&ppf%R0hviGwGr0TVIWd8se@xtoZp~&uD61B}v_BhKCs3E!ACL_EJjMcZ$Y_%q= zZ~tPuCvC~Hlk$~WRv8E{tyR(6#h7~JBE3Fu4;6)DyRf2gGb#aa;rXR7mWExzS_zo8 zHZo3js|M*~_kvqnl3M&)Smzby1KOUkD7kj`c$l-=m;JyoE2CKO7K>8Kw&M%=2-@+^ zxbBSV&7xy6W_4@gB2g-#pC2E7FgouH@Vo0Y(S`Cn`oT-Td#QMB8!8bZ*{@@sX_@zx zbad*mk(u0yAjEaJK)`N5>)V+r;M)G{8rKlprt^;*GwV)0*2vpg{HL1M&P-v(N4@Do zhlV9J#MQ~tTQm@B*xg;rq5d_>rL?qj#;0<0XOqgWj+I`$m8rV?zZEeAY85);8jJ z!h0#R@}4!qQAR|M^B4CVD{xA1^qEWfu*6|+t`;J#c8d`*C5nc-CNhuXuph|iRRpM z{4%5z4f0pVlfMIt5!2iu=R9+L3<1_@27aNYwCp8>@^g#A>-9#y&_no_)?Jty{jZ9E z0!CwS`<`ld_nH`Mk3|c$##Z88rs=`~Q?jl)7~JbidYLb=2?<!HNF)7?!qR0yp zX~FQD_KD!=*pFXvDHLRvq)y3yDYFx#!j>sY9rep9n%OK*LZ54V?o{nMMr<7U)4o{R-@ldhyb(Dh3b&uOr9Dn2Kxl`fFRIFV4@ zLiyqETmP@Kp$?cb@Oq1R&e>dzp+?+PA!C>EPnylx&b+0M`qF<7wMWVKOUwG9qAeF^ z4doK4x02_m^Bi9cvi-;p1-t+^|9*hGf9I`mDIlfLr z!t6oU&A9T@VsQDxi;9rw{94lQ+A-bUr`Qnn?ZR94*`{1L!H6seNL=OxAU37UFp9j3 zpeY>hcXJ_>+s>qM7HWUV*Q6GV5jgsBnjgY%lUj2WRICICxKZvo_iNshtdof$p%Ee1 zM@=G5$=BAQ9E5B#KCzcs(kZ%k@7!*`LGhH?9eUBug4#!3!Q%z_oImz<&`u(&Qfh*v zevo=ox$t!S?|)4l=Z}plTUM}N`9;SD^=7txP}KuNp=f)o12fHrmLJa}d=S>*--qjq z$!{k#&}5i3GcIKfC4Le7bm5v;ai`V$$b9|l9<*)8cO(1w_Qmgh_zT+w4g=?CZ@G;k zsRd2jZGPH2=Hd}Imo_@j{%ZO>q_KFlbTwVSUz*=jb#wlxK0ZeN9ucOhv5JE<1)o30 zq*Z2|g`pMdXPPJLaYE5<9hJj2rBQShQf>|dfuSFBg&0yFl|PV?{(cL~%w%@($o~uG z9Smub_WgR!;$Z&9b%PrdqV7d+8p#dOf8#t?iO{E)ODf71ZMTSsSdb#nN1Y+YxI*JN z|4JRz9rwD{!aDu@T+X>d!c6k{by$FCBgea5T~@!o>sU0SSrlcwr*S=*U_pWYdfdG? zx9(>S9Epn3UhXuP-;{wmjH5nNh}uVifAdY9=NjNo?AwLjTWBU zPau&$#XNBdN1;afiK@@|{Jo-Is82@6le~SNA4GQFyHHSq>>N;yh`mYP?L3nu`Sh6Q zzml4oBMh33L8nH;!xseK!@Rvw?&mp<5|`LH&`Q=4#Cg9+q`5PICP==FJKlA09b;C( zO$JkurbP;+=z$=I$wVCfdF40VWx1sAvaX zI>jv5f3F4~hc8nM?hipX79JND$EaC}>MbdciqeJiV;keT|8=?M*9PCp{O#TSc@hRc01p zInHRc)q*F}OaU)Y2vKMoXmk04xT#v6qP+9t{J|1UbnUr$GR~RdGRKQoueM3Y?iJ)9 zkdc0)o8}ssQ&_Nomh5i}d-9fhDeaYoxnz#MEj9QUBrblDUJnV;1il13RWmm!Y&wPU zIl#@p_iN#z!ulqm!l}j9mM4Low(YNe-7CQMC&t#EO?wl-@7zWbp3o$@+!vsB2*V`OZ71@zIDoN z(pECIVEO8!JVw=5W&RVC^HGZ>`ktGDAb+edm+?(Z(w7_Y=PQdT|C#UVYB927EIdOg zq9Itg6V}|&_PhNJU2fLso%Q#iSOsK?2uO?-&J=-{cR^XLvU1qa(1670-CfPwy42Ym zCO9T*VY_zC&X7;hMC#fblnk+UIU4&);i|)%ktFP-Wu}^%npI-Xmoww4-Z|Y4 zssD7a*GE7h^pU561Fyr+CgzEMkm{@wHsR_T~;0NqUdq=IX-^+wYqQnqs##u6nI|Pcz9hv<}!bws_zpp8(suI3?|9(t+ z8!?MvCc?3>wnj$*I_N!wPD)~jbE#)OJTk<`+T-Z5W^E%tReaad99*T6tD?s4U4a&G zt7Y;)u|vWQ`<;9t08Kl4d+%anV@FjJFgT|s99<7O{&=CDkG~}UbLVa=A;x`F5A8xf zCme<(EP{s*d=;>mGLIupAvXiq8w!9Pd?eGn>*|C6+vEYSg}wy-8^y)NPL%Su3=9mo zd3oF5DjpFZ|9=Ym@^Gr&sO@ctW6G2qLuL{Zg-XagXC6ysDkPyOlpG>5C(>Y^r$V7w zCuJ514Vp-Ulzya8N#DKoz5l%bysoP*m$T0~dq2Z^*1GR|twpvy8Ts=3Dhj$Ykkwg= zfU2L(cN90 zHMX}g9(&(kjH~SyH@(^KbV+_Tw~x?>DSZ<|&yW(jZJVto7OMC*UC51|X;fv&xp+|o z*#z-WSThk2N^@-7xbe%IyW+oo{hFGZqBS8iyHGOQ^YqXK_Jx+Ib z)@8l;;jd$8EGz1EJB$}MH4zR#mPB>`ybSpL>z5};#-JldqP{lmGYAS&!2onkZrQT8 zhl*^QxTL0tlSvx0`dT*`ug&xezT~zM;S$;+4Gy@%USh5g7x-d>%)Ld^R8TZl7We(;wdQ`K)o}su<&rnO`E7ESh)02jHRKm5!9~d{+HKz0Uhgt zDVxUUk_iY~|GF)@6w7jG5SyYFwZII!`5B+LJPBUzUTfVJ4c*sC0&;)dubvV&3e0t>m3W5e!f27qa}-_pVeo~9ju z97*8fP|n;=HnDZNab-a<%rLg3M8@0Oy8yJ%qoEOVDx@00Qp2$Scbg3yezSS0Ze>)etw$s zuJF>q1@INc*sUrW8pl6u_D&w!XxOqLdHb%B@ zs$#&aA@frnKSCh%W+-TAP($G-Dnmg@Ns0Lj(9*1HUFvkTBf$tU>S91A!a;Nw1CQtB z?Z?J5lRMLo>Ys(Xn)h_CWYh(nvG#~KGR}%=G#dMc`JX@0h|Z+al08meJ2yYy8o4wL zsL5x(ZJR8J%fwTsY}Z*^TdxiX2r##_tO<(p@bFLrEqkS@sSFi}1^|o?b?4;fege&| za7Ix_CyxN5S+3BtD-Y=9X*g(y&7z)8u*GG(W0$SeTAuMs>}qz#-Zhz-ANj4aoO^5Z zu@U)?9XnR_KFKMhk981?cSZgKOn%bBVAGr*>+M@3qL*w z?{ao_UcYf8$^Z4&-d)`8ms(ULbuctk7FiSE_QV@eHYp}1MnQ}0_fiNENyFf6l&gye z4m{W6C8h93^Qu?-a+IT6DE4mifV3TPQ)yu4kXwipt1_4T$48tR@r1Su_KHT<2N-`sBBNhzq*;}xVM?L$CjIKxi)&~ zrTv~8|MZEpfc$#B6zABno0cc%h@NG{p;Zg%IcaMYTGEJ|l5Ni#(BgO$XulyUA_l#E zz{V+}!I_$xI-zI?;QawIpN2jo$w~kWMHo~zqi^5F;BeHXM1zSTGcZgoEe%1bPNBG0 z<+aYfzIKto+tD~K$poc&lxRvpp`a(@v*TD%)3BfS=yXCMiyef1l?u7V$+}((uqi5P zYKF&;>p+@f>+zzwx!I-8oq;59eE02>Qdbv%GJ|ZS!bp(24!ylcK7S?&WCP`FCPLr9 zKotx$RY*v$)J}Uw^h#H7f7?Wy$u;f8kCT&;qWTWiz5|1UhPJk+BQ#fk?EL6>TM7Kt)Yb6#<*R40rVC>C<+cl`tls z>^^J1+8Ys}nVgd1;qA>V$&7Q<`NI?aPW^9w@G)$U#E5MQl7JGC2DX47dX4I!i^!)c zfOQ;yTxyY(mZoh)iOD$5$N2TYi}9J?uBhnA3#A;emv$k>H=ncsJn6{=JI7_=(`AK=chii z*U0LW(-41nf%OXt4JG*!kG*?YR+q2-Pr53?a(H<7oSGk>zP`Rhb~pKrphJXUHf!u= z%f72cZNm%*-^LPsd+p6}`@2^;C}HczZ>Od%U#a9mBYi8RlG@fX5h#&)GBwreeD7b! z{u_sUTwGj6kTOMwPh4nM+4VgdnvrD(-ZZCxoo?!xg%O1I$bQbGyR-9Nkx^1tjUXQ% zqqw*@RYYVAGD&0s>g(zfunitQKJoBJJx5#Oc=QV@DkvbUo#t*Rnw8plU^(lKMWg7_QE^2<%n`fNLbInM@h9QegUuMXh{~P1ZLXE>9-B~W_mJHxkqK< z;+FF})-JfFXn)<|c<|;sk&uZeqydPuVn@%^Ujq%GX@FR9IV^ z22n(4u#2Oi!`@w;I!7RPs#Y^0PgAh!++>~-?*4RUW-RK}Va~6<{G%TDS`=waE?p|IeL^d8EHB0jH@_$qUkcW$rW<{$-*btAO-`-DD zGeAH?hggmyDk=(nkXB;-kwmqcnp)QvYf3ccp{1t>L0O0{lsx#ELJh#IU#v|qz6(&| z8F+X|f-+>`;^I=;d2_|zUr+Du3(0%NA8jRNRan9iHXl8KR@e`v-II-V&JyP&x7{q0 zg*T$3qeF--PmCOGS$6yP*IQW!21+diJG|E;FRpBGY9qRaqr9FF>8GM}?aSNY_OBj# zV4zC#dIldq)(;N;H2NMp$AU|hPh9-3+h%P1epFb69*diPKVBLKR5a42S{^)L25YJh zC%AG8cbd2<*(!^)=-k}gM8#uO?Mo=Pi~Y@k1jj^pYWH8g+PRa^QQUG=LwVTc#2m6u zrQyyNs-?Bnm;k z+6&u1GBQH$EXXO0U&R$Ev^$7lGLNC%A++53n1igVTgApNIwmJ+Jdwu%Q-}h;6Q44? zQnbq|D_uR_tYu}5w;RAwLe@Jqe|WXAaqZRIygV^Do!zhg8~B{<_FsL5!2!H8OE~1J zcUimFqpbFpmZFzCa^6q&(dh+)_qk-J!z|b35wlD#wE{!nE-_+b(d{&kKz^YnhD)K5*k?x#*3;vxrPNfs@Cp|!`k+m^NKnRg} zF%Du1H+MUPb-^Ecgr2>4;RX4^rsE6OBYxvJ<%5&kiulnZARq$GX3F`wF6uNt<{_gv}QMOj+Uzm{onKeBl zeZD-y4!Gv*K)2TY4yVErt-heQJ4zfK1|+v4==~mZ{Ily$zpC1G3(?cbs!k>g3$fvbGrYn1gyw&=M`96Hx^ckn*d|1qGL5|(}wS($! z`tQ;~E5VNp-h%eeca#u3YUVks-BlTOhlv;Eg^H%BI;G*%qk4sQ1fG+ZYH=m@nCKms zQRMGt$Z-}X8@V=?=j3J@Qw{e75YS`YaSt3>;Gepr;`FO>xbgp*f;g_b; zC!RsAQj#jc1`~CMk4g>Wr)yLmQkj)<&C&Bb81*h)*V)0YfkC&9^Iq?I#k_PFN^0rQ6><#cEe~&>;7nF+yFkQc6lrID-{$yq&hD`wyR1M& zob7w@j83Y5!@M4I8}&@f{T(Gct8YdWxb?)-wz4fa^IH9PhwhzR9|6D?uM-SWU4}yl z>?y+0pJJwDDU!Q9-p$1nskTk5Q68pxSu*O6tdnY(*=%V%^elnVgncU^oW@t*#T0C#Ny$S%1m&J2Vo}$zFC%8i~X8yjKkUt|i8LDjFdq#z6 zo(wKS-oJHy>J5Gb(RNuVw1~g6ZS85+$ZdTafQ1KM2v(3dWH*MFbVNKOE- zf96g})+sTD-t9)$D{LNbk>G1=mvMOJOj)wJ=+Zzn@Wp=ldGb$1 zs;*D4OouBcjZS48KFwJ!;1Pn*+3lxvJ+=DHJa?vQTS*oXG3`8@xAL9R?6Pj7-I60j zw4r33_6_mN09I`;=}_-ctJRl2G&Ui~l@fAx-{0t7DLGT+*I5Ghttg^=jJy5#FDqs? z41Sh4Z;_Rx>a;TL)qRYGoxGnK?GLe?1t-^F__0~rYR|QnOe$Quij-Imff(;~9{G1q z$Y*Mbdus?&CX zeQAAr=9z1*p&imYsA@2wL>frfgHg#6G5VD2S{GI=AMshW>dQ_5))wc%aRBnimO1A` zy(Gw}fp=I=C^^1AbS^nDQI&;ukuWA~czGDyZ(Uw~IGCZ`Wpb=2MYT=lgOJq*W)Iu+ z4ZC7^WJ2>MA~wcs-?!33loHs@e9~^0@#Qb{FDjLXRGls|GBUm_>HW7Hd!%!Iby9r1 zTkE)}Yn3f>KZb|(ErjIjeNGL0My)PMZE?9|YHe-e=_$4F=Z|ddd9~8zbgI|3Tqlbh z#pZZcg>9USj|!4Byx(+Rt#6Da?VK64S^%0Ugprw=EQHv%6S%iI--WAhPN|qqC?(hb zN+O@Gnw7FilDvf)PjZr7A|>v#5l?i?*Pqd3_o_MmmVBg%6K**yHYI#vjuY}+wg}H+ zd9H`glnvU#k}etD2#K)d4o040yL)E%FMbbp_wcxOW(4N@;i>kksu?! zy`UMz)uVy@00nSIjCaE=6>y;GswBtLh?5d1zyveCY~8X&M4tkG!tBc5;iXMI#4l6F zO*=0o8d=h7mk%|%IAY@#IA%egpR5It+;Z<80{{*qv`inIrdDrQdKhh9B|$;LjcMxa zpzA~i598mTeNpc4s|^ecpiC6LcHk8w0d_|K0mF&Aceg?$$PCvB4v;5ml%Ip_3(_;E zDroKwXT7k}(_=Um8R@ZaUm_VAKr-J3W#!-tSvfgRs8Pc{m1dLT{+@HHOsH%`OqJYy z3Fn|6a!R-hUWhc$Z9cTOG7=3xM&4)dX5k&GcnFu@;li{Z5LX_3-5onb5J26B^H8+Q zY1i-R>FGTmUNuLGAQZR{0M^6TH-U5=aAWey$}9xFr+Dz((b_w+!b)q`4h?i?uWJXi zmH%_Y@n5s!W5>{v!3fV+fDj3JDAnx-)sy+z(a{V<0m4}xeRq^s>g(yDdL=t{S(xpX z&kX4f5b-n3EtR`{=gzg-9oJH;n26^uUJO9;C@(7;_d4S9T499Vyu6ptTNP7hT56Z| z{3|>bX(Hr(mw-9&t@=kQIfByXWU~}YA)DIVXbvG&> z;`mPpt;*5YH$B1h)hsaRag3FrVF(Jw5S8eLpan z4mzENFviK__xp#)$PojO{|J@D*Jx|!l8HDZPz8?;&0k4jA(9JZq>2F2u2)l&ffI~w zS%8-zZZF16uysO&u`+ne5T>9(eF10UH2808SMxQyB_fi?jkb{=n!Zl$cln`C$Wk zN=r$Zo0>`>Si6bR^(ilEl)N0T-@IAHaq-*my1-pFHawwNa}Kr(z-X(k`gnV%mzBxw zyc3Z%``;UDU`!=8^1hHpW@cxbL_|ca5E1#^vtK|U08-P5P^8ZoVUzV~394_tmQw0F zmR9cx_dv$I;d+hDW7moiwvmLv@CoyBtK7jiSVF=iW{iK+NRb#tqZAfiy@bboK3dH` z{Pykp)pHnfrDR~_q$C?FvkkiRY1F(PDb3#10uLw%!Rz`-CS50|v%dhKy{NwX^wA?a z`tkArVF0ukd-9|wI75Ki1WmXRGmUaWBs@hTFmO;P zhqI1l#6TcK2nq_)H8f;?`}Xa~_&CMF!h$SdPWEdj_Y5S}S;PJ5KmUZ-Ouk7obeM0UB|S)ax5#bJUucx%1~-| zDr)g3D>i#$c${dYZ{m9CK#GKyM#h!oc8yk!oN_MR*DJy#mEQ*8&QQbWm@r`3; zE+pU*5)uT2??6do%}ezUAJ!n;anm@9+GCb+q-SKrBqwvC6wcIn@rXcwe-2hwR&bZz zd-mJ|hj6DxF2Lz5Z&=u}{jggA5~RsROiWDVv&>(@3}Ktgv8Mc9L&JCf{bx;#pWxP!zglxMKu2*5dSgqAvr3Xh0OQDwahANrXtxe0#Ppc8jww0SP%ynmx^6^AQ!OhoVUv88mb+g-OpI?_5Pfa zzz;vg^Rh}x$zUy=OApze$$yI9P$fS(mS~BrAgDjh5dQJ}Kp+hr*=aTC$oJvhK1|;^+x0s)m_evfzC@gLb zAU-pzJoOP*KcmU*Wf}4BP%V|M6Q$|ZuPn33jjQj%2G*z8es%Wstr(mZ<|2Kpn!N2F zmA+D1HWD9x%XeB%Xsu)Coxar1();SwotNdCPf@;p{c6|lulCP(P?F~8W+a&aQdt{wf;|($K?Arkb1A zFR;)hcE=sxn!YZ#)Q%;q^Deaa;>{(-etjMf-Tx`*rI7HlLlrW~uceB?$e`BOo z@h~#{=+Qty{p8w*8m2m69Jvw2^dxeFyuozOQkVVl2U z%705kGx4{b&z_pXe}g!~9}^QzA$SkGFzxH06rY-EvK(Q(Bvs=izb1xuM<$4tud}CS z@4wNiCanc=n0Pk&lS4>XFp#|^jNzCx#b3ZYF^Q%H6(Lvv>4 z=AnH2mv{2esYf1C+-YLlx^kBJ!1MwJCrtwM5^t=Vz$}K z%Re{)*;ClrN%|iQIoY3w{`9Hf%9UC&qSb%B?O5Hh;?7XDbr64a~ zKz8pVPu0J3QGZQ9lZ5SkQVw70bXpp>*`HfvkfXj2toe}gFk$22Q5X?{w9r9t=TcHg zsbcc;^?ih-N`;p?$buu_%&o%dehO5BIg~)&fq~ZcWtN5Djr)P;cRqL!i!{@r);L_2 zBDCQo*=+0E%#5^w!F}_jCI}VmQC@XTmO1E^MI*d_VphxtZev+Nfka|*atXqW^)ncZ z3NSrt=sGog)rWiS?&cg6D>cT*%1RXh$G>vz+G?qymKOc>8X9u&h|JB*0INepwEcR} z=!QPOZM|j?6_h^5V01ot(lmHn&hnft9!XkCD$Cpm*m5xd=6<-bD0R8b+t1Gov0&uh z*BMKjrENktKrkRla9tThNDepuj4{drveym-`{^AJaH*NG#ICXenVQh{nHd^_H(w1B zs;jThIdE)j%-*kmwgHLEj}gt7?|FvU_Pm?y#{iT_MarNV$e@XEs97Z714>EV44;wf z^j;4vT?`~%M#S9LZKTYCY-8x4Ab<`B5mX?6{H>7laJ8^ke;c=+UVs^YJ2n;!^3Lw_cT8~4 zVcCzZ?d_!81jN?)h}USCR|n^j&;?QM4m2NZvxKtpa`>MRi9Hy-A5YS&a0$s;o{pO0 z>YMRE8&p*2^V4Iz!orD=0J%el0M&vX2m}TK>Yxr#`AESYdhzl7`%!q@V3Fb=Zpb>c zQDey(`Ku)+CKgowoZ7v^$|^Nt5!?Y36CqH7RwSKB)KWH9xS-tG(NSTk>f#z4_U)Y+ zYBa2b(?~^wB8)~IWJS22v)lihR&`LT^*;R_c!n^zrlEoVA3}h7g73!~7LrVA=FT@P^6(%!0~pWZ$x(Zt`=n z`wHvocz_qRBA|d0gWK(9NaahguhnNrE68ZHglge_Rk(CkRHWnW3HoG*PG@Ov7Dc-E(c(vgO(E@Y(Gjk>%VD zjD&$e>}CXn1fgs!iVM>_JK2C$)bt;ZT9`IT7TLI*jCMd}7M7RC-bI73Gm{3A?yPSvmFc zt~=X3PJa84rFC|EeB5p_I|Qn+n+M+~Mrfk(7810pjwg(`=6%f3Qrv-+YGiC|2MZbZ zJ2fq>969YadU|?U-_8zF#SJUw%hccr%klnCAoJhn&x)Zdp6D8xm`Ec`U0hsDDSP5K zyfI#A$-k>~@I>X7_sY-#h`l=)zG}5+*3$e^{fpim+$^}4i?TI=91+zg#F7j3fBZ5v zP>kbsg6#bi4L0cum>u%;-?IMvmn~W5jXNhq$ + + diff --git a/html/inherit_graph_6.md5 b/html/inherit_graph_6.md5 new file mode 100644 index 0000000..d1d5113 --- /dev/null +++ b/html/inherit_graph_6.md5 @@ -0,0 +1 @@ +7caf141b9094bacae1eca164c025b157 \ No newline at end of file diff --git a/html/inherit_graph_6.png b/html/inherit_graph_6.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3ec1d0118bf58a23d9c9a15a82450bde615390 GIT binary patch literal 1397 zcmV-*1&aEKP)Pd9E>Pd9KSI*I0&^`4UI%NKePPcWx_=qoX4X3=Cj?ejaCMXNZrFM_E}JUcP(@ z0BCG%#M07|V2(neKxb#CyCS&VmoHzClaqt|{CrPGxu&tP5iv0_sI9F90BE&Z6c!fZ z_3PJeTf;5IvAMa4?CfkrL`0yXq5@K>6kA(c(CKv0>2xS8EQHl+#givb_zwdBVPRqJ zSpLrZ{P`2X!NH!6aU-kMiu3bxzHPBske;6I)-~Kx92$)V2?+_9o}Px6*RR`{+S*zi zA0P8=sZ+9<%FE2+$Ma6^6+S=L*o6Uxfjt+eM_z}s;$>{0n`TdEzt*WZ3 z;_B*Z`cpeQI|P8Hr>C8c%gxQDy1Kd>x5?#l3JndV_V#u%nM}05zfV@HmCR-{nM@}7 z@ZkeVBobO!SP;w!3k#$7@88q-_&BAdrBO;s3MrLJ8Xg{|{{DUn2ne9LxjBB0!C;_g z&z{l1zyOVoj*?2HqT=G>8#7t0Rw^hcAhlXeX0w^LwzeKr)~mh6nuCAs#DUPpSzY+l2-rjaPE;l!qqN1WGD=UkC&Cbs92T!bUE*T64 z(r7e%TP~NAUa#ldlarGKfOdCx`M#o}B5G-AAtIuKg9GyQ^%WdAyWLKHet!IkcT`hT zLt3p?(DzWXI)2$+ym&!_gM&_U-NadOxO`a&3=9MS*zI=2#>P4wo0gU)xaUYpO5)$A zrltzUZftCzx3?D?8yh%1J;mPM9-cmZDi|Y^$@ur7p`i#241`oF74+Hdb^yTo`Z_Ky zF3`}>AlL`Taj@BJh>MH+laKr8vbw_M;&}f2IYL50U^1B?m&=`w6}#sE03V-UQBF@! zk&%&s^73+MwORxP1z~J#42z44f;k+=Ic;Ahkx0OC9NxWqhk$?p!M2o?6sNf#Lsn<| z`&%ym3Fhzb54~QGwzf7*O-%{5&CJZ;+qZAG-skS_E)EY5q1Wr7R;!^ + + diff --git a/html/inherit_graph_60.md5 b/html/inherit_graph_60.md5 new file mode 100644 index 0000000..80f446e --- /dev/null +++ b/html/inherit_graph_60.md5 @@ -0,0 +1 @@ +5f78ca1ec0ddfc54fa5d70c10c493b2f \ No newline at end of file diff --git a/html/inherit_graph_60.png b/html/inherit_graph_60.png new file mode 100644 index 0000000000000000000000000000000000000000..7868c4bf40fcd49fc49591dd2156e91814e8f59a GIT binary patch literal 2395 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 + + diff --git a/html/inherit_graph_61.md5 b/html/inherit_graph_61.md5 new file mode 100644 index 0000000..b73fa00 --- /dev/null +++ b/html/inherit_graph_61.md5 @@ -0,0 +1 @@ +0745c3356fda5e61da177fba5bd7059a \ No newline at end of file diff --git a/html/inherit_graph_61.png b/html/inherit_graph_61.png new file mode 100644 index 0000000000000000000000000000000000000000..2828a96e0ba2915deb1ec6908561f110ff5451eb GIT binary patch literal 1868 zcmV-S2ebHzP)6>^wUJ8%L`|sk(q6Cxg-@o4ikoR-W#}rf4*Vq4cL6qQ9UtbS~VSMuZAZVfd z;ZRdhe4wVF_&`k&1hiT$T3cIx`FwG4F`Ap3{l*K0nj#2TEEbH6jQsL>tJR9(;bFh= zLh<|d5lBv+JPDJ@I!l`8{Mn_(CvCnpD_R-o9kXAg#lhf!8m z29ZdFCr_RrH8mAoU0uPJHZKBV3awU)ojZ4eVHnu$cErTQprWDz5fKsGp2)~ZWMpK_ zc>d0vJGguIF5bO+2en#_l9CdHgoFS9%FD}PFc`q+^AQyl1&v07w6rt;Ky`IBdV70O zQ&WR$*RDY(li|vhE6B^sgI=$PQmF(0uq=zbygW2DH9;s8LaWsxJ3AXspFRb{FgSMX z7&0?6XVqae8c|nQ2dC4C#Kc6Dm6c)n^5s7F^7idp+`oSxMxzlbl?nimot=$Sr%rk8 z`}FA(s;jGEu~;A$i&0rwiFNDN&8sKBn}Ey|7K;V@_wR>5Ab?h@MSp)k)M_=peEBlx z*|TTQqO`OW85tQkaNq!%o13wB?_O>_KR+K;RaL00ti*;58<3Ne1B2nmx3ampxmdGi z4R-C?g{rD5Xti1ZfWcsZ%jM!~csw3FeE1MwzkcQPYBU;zhKAzk(W8iukDpb?$jAsX zGcyqr6N4j1j$qlcWhg2tn(=D*s?dpj8$ z8zUhhA%tNV?yTGGCZVCBq`$v^#%onoRS}Iw!^KLak~B6pdhL-&B&4;qm5T=k1_%J+ za=AFYB_$=?`dm6}HX9KNg=Au4f?FRSANSjj2M-<)xm-?!LLo^_O(o^!<>b|?S6=<9 zsHouL!NEZSfUqn(ubyn$w23q{G;r(FUrXH055E>c^g+hUz zo*pijl$7K(Q^du^p{J(@larG;e*CysEgp}D-rinBM@OTtuMc%~b?EEs!}$0(91aJ> zV)26YDijLt|G9KzWo4nLs0fLPiAYUNMOs=Ka&vS2*515%GrGFEFf=p-o6Uyn*RMk^ zmxEy#NTpKl{-;>AY83#$?RJA@**Saiy9t;n+-|o|ykf-)E}m(oa5|mf@p#bd^#}_K z^ID6KkH`4=^_CfxnhOB9TBMkzmJ;9f*pG!tL9)q1WsE>YlHb z-%Y^2r)X?!FMdn$jE?Nt%luhhe#yCz`y`p zE*DOpK8@_`Y^YQ!pC52UA`!;M#=LUT(a~scZ|CBMhK2>{uv)EXX=y=7NC=clC3HF+ zy1To%`@L}C0#2Mb0RR{s9mU0q7cnt0!PS5M{5e>bg+wBmqlcvIXbQpNCv7pY@DDAi%9#x6stogtcqeLZwn+_3G7l`SK+M0s&%UW3hevc1WdC zBqt|BDwSgC(xqNCrUp^9T8-l3VgSIIGiPx5@?|I#3anqh9!{roK{~`@F)m%YgviK9 zBqt{$EiDbDrKQ|szqhv+cDo(Gk3rMna3Crw3JD1b*tl^clu9M?^Yf9PpFd|G=h6}s zes$2iapMO0@ZkfoSS)08bku9zZnu*cFJ8=ATO##`DGB zpczn8Q2tr?GX?$agW^L#-ac$LTOi6%{t)Psg5m=;1;qzy3W^WZ6cit*DJVYpef!Yq zbc?Bj@(1B#3PMN+fd2$R3nd8f`TT)kYoJgl6bgm%@8ti5C1Ze=WHx*N0000 + + diff --git a/html/inherit_graph_62.md5 b/html/inherit_graph_62.md5 new file mode 100644 index 0000000..8839a16 --- /dev/null +++ b/html/inherit_graph_62.md5 @@ -0,0 +1 @@ +889640823c85175a0764e4712d0ff657 \ No newline at end of file diff --git a/html/inherit_graph_62.png b/html/inherit_graph_62.png new file mode 100644 index 0000000000000000000000000000000000000000..d02d9def80a76ecc84aadcf6bcaf0eeb91e440fd GIT binary patch literal 1867 zcmV-R2ekN!P)Jd5LlrQ8ATcMWlo$GItz)cobSU{qz=#XM~^qIxmkIe z{rFuU80?|r8OHoVM5Y@zZhV+( z^ZRj0<=_qW%#w6vh7r-#RkJozI9 zlAoUsjYi}4$k;#=(OJArgt8)9KLF)djU$jj^$@8P}dWcMb-F0UC`4hYue{O-&8< z@88e)_wCyUqtS>nXU-rdCI+dgsi?272LPm}r(@;Hl}JlVgVAV&PNxF^)YsQzczBqL zF*-VmXV0F&<#KWPYPDMU`}^a>i4%y9j`o>HZ*MP>l9CV}9*$$jj$zTFMaa(1=0iH< z<>h(REhi@j#l^))OH0GfojYMP8j+WmH*FkmTJTP0W@biKRu=sVYuB!&BS(&KBHFrjD}{uFP-0>t_o=I^qoJW85{t!Tu~@jZ4u^yM{r#z{t83b88I4BL zYPH;0p-@nHdAZx1kdP3nt*zz8-QC>;fQE;MxqOcwKhF7Q%A>Wll>!0+=HaKApz;>>0VrK_C#|)TvWguwa3kFFHCJPNx&`@$oot-~jY` zJpuv(@ZiA%Zi@lFKg1vL^Yi1j6X5$kKi!;30s{km<^cf3#l^UA;R4#)+HmvcO%xUu z;^oVi5Q#({v87U}$MJJ?bQFVwg9r@`b+dcZEhs1mE|&{VrxS}8F9rZ^+nlQFRHoBn zw(xe$EiW(UZq{Tn!E82T%a$!Z*U05^L`6lRsi_HxiHXo?G*GM6uv)DM3=BkfcQ=NI zhjI4oS)`<-K&e!^HJ`xuhdVShmF6)W)W-8+axBFN=(Y}>XC5fKqksZ@xFh`_>y3*BN&HnD28n(N#P3JOqKT8h}% zScHXzp|7uRR(VJy5?sD~8B(bfDwPTe2?;P53|P8!DFDD`v%zY$a`6lX1Co-GuzK}s z#KpxSEG!IHu3SN7WhH`xgMUglu~>|XiVEDibqjL29O2>NsIIO?MMZ_jHswnT-uc}o z_4e)C^!f8=YHn_(fq?-xztw7`H*enfjPd^cdor8NG%_;c;cIViCzHuU4u^w!dV1WN zNg|?;A3xHI7cV@T%%-L$>hJHTZ{NPr)2B~qe0-dUh|Fd)+3ogU&f~*}57gM$Nd5i& zZuX9j4r*;}^_V|6I7nu*nQS&2ckQW6=HX2@BBHUeF?#jt6}^7_+9QU=Vxdo;KFz4b z&)}^|<+VT<|6IHk2>V|Q!za9)Vp>~U`3S@K3t?{%hEG_5Fnq!agy9obAPk?d0%7>X z>nXA-27|$1Fc^$^=YI%rjiFUsF@pdA002ovPDHLk FV1nkTi}?Tm literal 0 HcmV?d00001 diff --git a/html/inherit_graph_63.map b/html/inherit_graph_63.map new file mode 100644 index 0000000..85be9be --- /dev/null +++ b/html/inherit_graph_63.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_63.md5 b/html/inherit_graph_63.md5 new file mode 100644 index 0000000..5dcdb2a --- /dev/null +++ b/html/inherit_graph_63.md5 @@ -0,0 +1 @@ +3274645204c3d6170156a829b7a8df2d \ No newline at end of file diff --git a/html/inherit_graph_63.png b/html/inherit_graph_63.png new file mode 100644 index 0000000000000000000000000000000000000000..197cc4ed9a49a91a94de18be1cab6d128e30b6dc GIT binary patch literal 3645 zcmZu!X*`te9v-qxvJ7JxWDkXmsO)PqhI&b8=+(kl%D%mpl2D8pveXz$gvnl0c4d!Y zCL+ncq->GwyDXjCIp@RqaDKDg&xhy!-T&qKU)OaLEzB`o93mVL2!zYj1Z4@<5%5!k zvVni`q|jopu;DIYP>?@|pX~Yq5_ogf6lG`~oUxD*YLV0@#AxJMf^wi+W10C*Muwk& zI;49MmWcB#jc&)-CgfccZ zcSN|1p%51+do~|FeAxa*bH2wTq{69|;E;NJAr(d0yDh9cgx_AQU7`>0b4=@-pwXQ#DUZNZ_%wvSLuR<>c6yBOsSj zl*P)G&0rD|JlfjY9%FTPBbCma;U&pmruVhAu_x71-f_;RL>@Z#cP@Spvy zmHG0n_)B3BdS8~5Tr<+_1=;CUQBjjxm(HU&QS~zC%li8j#{bx0vCUmwmt|_sM!b5Z z$Onh7fCPG&k2glNA;ZPGN@p0C9Vr=ag6)8@rjCmp2|Q@xZ{$jO%e+93!u5 zW&JjRxO|Cp$4Nw3SeRH>r*lG9R!T($wz9JF&VPox;8TTb&-F1G=S3XME z;+tGW)-hHE=DzLaWo7n`j*nVng^pP0ELir385%Ny`Z4;o{idMX_w{OOY9Nr#&Q9C9 z;4@QxJA@T(PEM4$Ik$+Y=#}f&sl8!F&@VkbD|Aus@15%3P%bWVuYS#T=MZ9JCkGV- zW5<`45|WbzqYgMZIqkbLb)jH42>sc!XU31oFITXe!l%|0<>jN-oVj&u<$v$)PSWE< zsh_$htjT7MXqh(bl`9c%zdaBIVGtfaM)~`z1?z}AsSXu-T3K2qCMH7kvJwacXojXg zn|nXiVVXjrn3$Uz<8abCIyx`}f&gH`1bO)AkpoCFJ6rOEyu6I6Dj&q>=NH-a_4N|1 z#cz!X0CMF`w&0}YWgi3rVZZjH)5qW6$~D^L#6!@5jEoGJkPtf@4)+)=F{J3r$;m;v zxX}0RX%*c6bFfc{iD9PcXh;Q3w+mEMRu-M(R&(hvz+wekaA(5V+psrobh3R1z+x$~ z=Frt`g$rD|bZK^O?nP~_UD2P?(oz#MGqi;T>}JTqIS}0>jYpql*}lEe`Y1eEk&S$a1p`o9K>8BLGaOIJQF%o8!taQyN-~9PS zK_%Pw4azs`Ou:yfVAs8pwsm{uIl-rnF@db+?SIV0mQfW{$rBog^FEv>CcEnv>t zZ*%_IW=&-!86v5xt4pn4s^1bu;EL8KfQltV?!1UiQC3ys8oD>{8S4Oj*=tss;Q}!IWoBU1O(7fDU>8E zF)4|^YT>EuC5;0y-FrzYoEPTi=Jfz>QV4PA5NP1{1XQ=d_pOyelO#VMQ znm!^MAMdQq$Y^NT=6QL0dmq>EfoKQL8vul1U;oXjsHhmV(I*@o9uDE>=YQYa%&e@e z9K63VP+}%sv2b49mwH4PJDHJ9xEv;1T zAZ5EBGc)Yf*W>AQV*np1X=&!H&`seg&k_8$us>op#W!1j_7n*G_TT>vH;yXG!x%h}IV6AxnCHgK_65$g?w+1W z>aBy{zmQP@coj7@D_3?%Zhk&)=F{^+z|av#*h@e{pl@7&3OE=tT3R9_Z@n4$X6cFP z>Do9h_2U7*d7w}OF!@SKN+ox?rR$cPk0pMb{?OJIab0X^_(Q9)+&$|OUIpM#f=ubJ2sy@04WudZ%0l3$u#y6cgamPVD4m6ZhmV!S}d zT37i72I7I7w70jH*f%i)zFrR2v9__Hb#!pPe*Jp(=g%gLL}(;g(WaTfh%R4Y(%Jrw z@0Y%yp`r18qBVBDvg{FMZrB%)%--rpxdRh9?D$xz2b@la_6VF~8 zh#fzkn4C;cUKpzv1@M|zuOSkT8W|atg#CHobo;i9w6sx?o{*5x;P5bRX{;U+-qd7x ze`h)+VX9cwdZ$%|v%mOOLT|72)bzBJf`S_=#MxI%FufP;*!E*$g4xE#<`8g_l91Y< zB|7z5xph@{Umx1bOL=u|&B5LMn1qCc?X_!^ygXLWUZ21~dYSV_75^W9ZSU+j0G&-e z>&k~=d}iZFU^oWJke)tW?z6eo)YAh8bTKFeuvWa&$QktiuC zfk414=G4?Y%js!pVF4P^1ZYrGR3@QEfB8GMEf(1TePYrwHU|aRv9cnyqp<9up`nKv zD=HrQ^y!n2pP$i#2YO}Y<&>PY%Y?}2=*iEN3zCucJFC+Q8_v$oQm0RImAiB{uXX8n zrMVVPE=}@@i^t>fY#N%H5sb;WM8(*il?u~S3AKiP+sh7L1_m$+3JM>dYX@np&ds^` zfmtJKd5zVXwtxI+>g~M*z2@n8`qZgYQn=DoASb?prI9ed-Azx+>(_N~zIIrwv6i+r z(ON+^Dk>_su`%mLOV!)A`ekBoy}n8VwC0wVldNvq*kE41d}-XfG&?H^-kSn6EaL>M z!c>?3pZin30F$?icYpsjad43Oxw!bFSJbnPyn`gQeE`&V@xktbdLUIizp#){zCvlw z3fWqG(%ybinveKle|O6i?0M4W$tSX1noS)$F!>H1K3V1G&V+#CrStnYV9qZ2+_Ko<=*u z#>RHX+dCTY0sb7p59)T2m=UEZ!iOX z=01@3fGo*Xd5?L{4pk7W6%|IL-`I%gnxPF3i(I{W^&OBiuhDl*PfX6b z*~JLn%}5{SpGJs?@ImG;0Vg{DwKj#kwZ0C6S=l&ce)uz&GWZl3>S=KQ1Xz@%Ywo!*##!mCYl@wq z+VH+vnkp;Mlnd_eild{W-+%o&77`MY#}i^%aYUD(^T{O7lI-X2?+ + + diff --git a/html/inherit_graph_64.md5 b/html/inherit_graph_64.md5 new file mode 100644 index 0000000..8e7c409 --- /dev/null +++ b/html/inherit_graph_64.md5 @@ -0,0 +1 @@ +92e375f9ea324584b368ec2bd61344de \ No newline at end of file diff --git a/html/inherit_graph_64.png b/html/inherit_graph_64.png new file mode 100644 index 0000000000000000000000000000000000000000..ada3adac2521292c8db7e67a080d282f7cdecff4 GIT binary patch literal 3142 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 literal 0 HcmV?d00001 diff --git a/html/inherit_graph_65.map b/html/inherit_graph_65.map new file mode 100644 index 0000000..50cdec2 --- /dev/null +++ b/html/inherit_graph_65.map @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/inherit_graph_65.md5 b/html/inherit_graph_65.md5 new file mode 100644 index 0000000..209f076 --- /dev/null +++ b/html/inherit_graph_65.md5 @@ -0,0 +1 @@ +c1cf9e7f2e9fb3b960bbf0fc9d2dcdc7 \ No newline at end of file diff --git a/html/inherit_graph_65.png b/html/inherit_graph_65.png new file mode 100644 index 0000000000000000000000000000000000000000..f115664bf86320dd486f85de280743211619790a GIT binary patch literal 46250 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 LSI^pa + + + + + + + + + + + + + + + + diff --git a/html/inherit_graph_66.md5 b/html/inherit_graph_66.md5 new file mode 100644 index 0000000..07da4e0 --- /dev/null +++ b/html/inherit_graph_66.md5 @@ -0,0 +1 @@ +1912f2d56e96c92979e869eb6c8907d2 \ No newline at end of file diff --git a/html/inherit_graph_66.png b/html/inherit_graph_66.png new file mode 100644 index 0000000000000000000000000000000000000000..57981b26f1efd0cd65809e19e210d3779ec0277c GIT binary patch literal 18123 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 literal 0 HcmV?d00001 diff --git a/html/inherit_graph_67.map b/html/inherit_graph_67.map new file mode 100644 index 0000000..b10613c --- /dev/null +++ b/html/inherit_graph_67.map @@ -0,0 +1,5 @@ + + + + + diff --git a/html/inherit_graph_67.md5 b/html/inherit_graph_67.md5 new file mode 100644 index 0000000..4d267b3 --- /dev/null +++ b/html/inherit_graph_67.md5 @@ -0,0 +1 @@ +794f9d51bc5549f6b619aa67658fe517 \ No newline at end of file diff --git a/html/inherit_graph_67.png b/html/inherit_graph_67.png new file mode 100644 index 0000000000000000000000000000000000000000..206a33fb113cb8514ca3b38621c40063b4bbf2b8 GIT binary patch literal 4222 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 j?XmyQoZhzGcS7@qHvMFy+eR4tp#ag + + + + diff --git a/html/inherit_graph_68.md5 b/html/inherit_graph_68.md5 new file mode 100644 index 0000000..677a206 --- /dev/null +++ b/html/inherit_graph_68.md5 @@ -0,0 +1 @@ +bde002fe94e39013f7b7665ed79c1dd2 \ No newline at end of file diff --git a/html/inherit_graph_68.png b/html/inherit_graph_68.png new file mode 100644 index 0000000000000000000000000000000000000000..adfcb467a3b9ed8b0402d6390decc6b0b4442e65 GIT binary patch literal 4173 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 luIlXn8t= + + diff --git a/html/inherit_graph_69.md5 b/html/inherit_graph_69.md5 new file mode 100644 index 0000000..f697702 --- /dev/null +++ b/html/inherit_graph_69.md5 @@ -0,0 +1 @@ +b1391ee399e23de4bf172955b6d928d2 \ No newline at end of file diff --git a/html/inherit_graph_69.png b/html/inherit_graph_69.png new file mode 100644 index 0000000000000000000000000000000000000000..f49b30ed38e8ba9cbbf71a0e1d616cb0b9793920 GIT binary patch literal 2598 zcmV+>3fc9EP)&Dm@OKN#LX~XXEv|I02y*CBCT9h+96Z2vI%33GA@JCa^639 z`Ms33AXrh}_xU7E`keDzzQ6OF_II9NegK2PU@#aA27~c(!<%T3$z)<4j~DVH#4s3R zC?|w3WH$*rBaE!ygZ9O{w!-@FlG!( zR>quxB`agjz>@VT`0KB~uy*ZQ^z`)1+M4_K@5lA)*Jo|LmsP`fSh79^dc7Xy<>eS2 z9-g%|@7%eA$B!S|bk6A}-}BJ$ELeRSU`q}jJc!%3Z=2YHf`X8flQSF3zYuzQdT{pa zSyWe7V_;wa5{U${v9Sma4z~GPWAWwjcn}JO5Q#(x2?;@TbTpPMS;F;`$z%|TL^fZ4 zwwRSoFRQICkt9Dk>@<7K;%Z8*Ad1$z+I#h=59^LSthi zBoYY@A3h9cXJ-I_R4T)YQ~~&*#I<%?(ni z6k%aulg9bSAAiJ^D_5Y?>9BL>PVCyXi}Ov4@7}$85f&DP`1p9#)ztwQEd#>C!x0`H zJ|hiN?Ulh`z|o^eQB_q1u~>}w_;{qJr{nVF%W!mbob=kB2AkBZH8nNp?(XK=LqkI- zFE59|V3>03{{8!rlaqtU$Vfy)L_jW=BP}hB^DC7~NTpKDpFbZdDJk&w_J&faL~?R6 zoSdAnZ{I%D*VkkH`t?XpPsg@x+Yk{EfrNwvR99C606IH6v2NWuNF)+`^wCGKx3@=f zaLE^m;wCS}m%o zs*s+ZZjz{DjQv1jVqzed%kkM~pTWn+2k*W29%^c8tZK^2%EE^qeu%)pK*Yz#-1vuC6X_{e*-B&ObCXL?V%hzWeSw zDlac50Mypj_H@Df4|2Jjq*5u@4h{~cyu3UjB6{-V2?+!ODlacL8Pnh2Peh~fofsn` zB8^5v07#)wn9Vs|4O8vaLqic37KR-=c39N;;K2h3g+h3Hdvi8RhoYdMAnyD8`SY=6 z%^GMl8b~A(0Dw-XgPWV1)p)eDwBXdKQ)p>vL0?}VIyyS69)8qnHHZkIp`j-BMT-_$ zogWx|7cP8e4J|D#lkU~PzyO3oAy%$j$@$0kwFNdQ0|Wwr$t}OXzu&CSSWPwd zadviwlamt+1_S!~`nY~$<%E-ylga!O;qiErwkML4lY^$FCL|{(xWVM{aH|XUopchNq_|+}+)6Aq~K2tyWxIjCu3s!QbB>Nl8gi ztJPdEb8~Z%nwkn=^dH~V)fFdBoB#lfjEvy;@#AK5=I7^g;}r@8>gwvSVZ#P2Sg-(@ znVIZ`Bd=H`aYn>WM5 z!vh{39{BawU$J`iYUuTPi~8;C>`+)(h?tldxVpOH)mLA|$jAsTUAn~exp?s+8X6if zJUom?j~>C!&JJIE@dZ*+QY_B7V#SJSX_#uS_MPdV70GsZ`RRfBtFlx`u~`si~=nYHMrh$&)8$ezjUn3Wb6@pr}+T z&ZknT==a}$H|cLQ8tIo`exatOCNdZdoV~HJk;=--=;qCvR8v!9^>Alt&gp8HY_G=0 zt)ruZ6bc0ig+ekKjTZG-VzL94&64&1iLqp5m{M6;Nx%K}8xf5@A&HEPr10?YY0dFc zJPly{@8jU$fUvMII669_y}cc;zy3OY_~8ee&Cil`2Anx_2ClBIFIvV+hmVgBG#U+> zo10;8Zx45OcblF)ShCK5fPjD(E#aj_AP~UE$LG1s&0Y~?%o$j+GUf~{Ss8N%maL39 zgVh68Qc}`v>R>RY#4K5fNC6=F1!!R~7z_r3!C){Lj5*D}0Tg}gR&`{~1^@s607*qo IM6N<$g1ib5ga7~l literal 0 HcmV?d00001 diff --git a/html/inherit_graph_7.map b/html/inherit_graph_7.map new file mode 100644 index 0000000..2ccac91 --- /dev/null +++ b/html/inherit_graph_7.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_7.md5 b/html/inherit_graph_7.md5 new file mode 100644 index 0000000..fcacd2d --- /dev/null +++ b/html/inherit_graph_7.md5 @@ -0,0 +1 @@ +3904c53c5118ec448119cf651e61de25 \ No newline at end of file diff --git a/html/inherit_graph_7.png b/html/inherit_graph_7.png new file mode 100644 index 0000000000000000000000000000000000000000..20409b6daca114b60535d18bfcb52dfdb6bd2f82 GIT binary patch literal 1785 zcmVGcE1M3X7!ri-fIj@HD-$Ad}`;ABZ<~k_M}URZntB0c9ygJ0pCT2%l!O29z1w} z{{DU}FE1k{B?VPgRmjfH1^`^Ub`67rgRD6Ug#vADZJSlXrlZwrArgtUOkc0pqqMXX zr%s*n#a8!m*REa2$jCrlT^;uA+xJWPxMoufHZ?Vcf`S6X$HzmX(LgK~V|scTCX)#! zlL@7zr5GI@MO<7QE?v6ho40rG-p!Eb47pssrTPws135W4tk~*4E-Wmdy}cbzo;<Zih%D zLUVI7l9G}D03SboL}zCw=H})gm&?)6(14hjn2@yB_F!>w5iXYtR;v|{9z8-@S{gb! zI@a|uD=P~L2?^-y>%*HjZvytLwY4>1zVF|^qqViw@0vEshWB7@w;O$ZeQ0cKWSMJ) z)eR1W-EN0ktwv;IB(7Y!g7oxsR905PVzHpPxfw@}96?D*2?hoRSaS>p19tD;jhdPo zIGs)u6cnJbu@PluWjJ%@3^W=I`uqERb8g(Yf%^J-s8lLkym%2kJv}&o{(Qi?hK7dl z`SWL%rbeSdR8$mdYHBbyH;0mv5&*#L>?}^4IDwRu6kNW189R6Ggu!44S$k~{EEWq6 z9z2M%XV1c7u|TWU`mOQ6fdk<2c<^{UL3>tSULG)CQ&W@QHF1JYr#n|&T}?ve?c28m z0GXMY2|BK@u#hAqB#`|4eBbT;`}c$pLS!--sjaOII^SZk5VczEJC@00#B4VEj$gif zNdOSH+wF^$m6ef}mKH(?As&y1@cDe=a5#MDy-8czIXURqW5&7L0>;P3VYONzl}bbESvYHoi;D}Xo?vX)U>O-1h>3~8>({R#lgWaP4YUUX zfNk6UDP?JC3AwqsxNzYD^m;u60s)>sf6lr@0zV(1V8^Qw3WZ=82G_4&M^sc4>s)$z zdeFK<)o5#L!>wDlFgiMl`}gm|YPDi)Y%FB$)jbHNwemz22n0w?O@&Y>45?><@&#Md zM%nNlZ2R`@Fq_S|dGjV-y?VtuXS3Px?%lhvbGqGbeEaqdX0sW^#l=u46mU2k8>&+( zl_D)I4TFP&$j{G*N~J9yBjZFyg*`NA`}V*;^X5n zGcyAoj|Tv7xm*|-8TqCBB9RDp?%aV`EJjXF4wOnI>g($f8yg#vwm()j?Rj~5FdB_P z^+V}dIQcerlc$uh)YRQqk4b#ri!M{i=w)a0)dT zg;S`(D4aqKM&T4{FbbzogHbpo;CGRM{^v%agu^<65kfxT=Rb5Ql(6{QI}{3qLZMJ7 blr82j&qpCE$B=d900000NkvXXu0mjfJseL@ literal 0 HcmV?d00001 diff --git a/html/inherit_graph_70.map b/html/inherit_graph_70.map new file mode 100644 index 0000000..07ea23f --- /dev/null +++ b/html/inherit_graph_70.map @@ -0,0 +1,3 @@ + + + diff --git a/html/inherit_graph_70.md5 b/html/inherit_graph_70.md5 new file mode 100644 index 0000000..baec2d4 --- /dev/null +++ b/html/inherit_graph_70.md5 @@ -0,0 +1 @@ +523e5e9c836cb5ae6541f6e85a85cc08 \ No newline at end of file diff --git a/html/inherit_graph_70.png b/html/inherit_graph_70.png new file mode 100644 index 0000000000000000000000000000000000000000..6c000d539817bfa784eaf09fbf145072598ebcd2 GIT binary patch literal 2599 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 JPDHLkV1oN( + + + + diff --git a/html/inherit_graph_71.md5 b/html/inherit_graph_71.md5 new file mode 100644 index 0000000..5668106 --- /dev/null +++ b/html/inherit_graph_71.md5 @@ -0,0 +1 @@ +c44c32512427af2ae6b60933b4c96a5b \ No newline at end of file diff --git a/html/inherit_graph_71.png b/html/inherit_graph_71.png new file mode 100644 index 0000000000000000000000000000000000000000..54fbbe663cd8d11350f9730296e1c2984b001f19 GIT binary patch literal 4668 zcmZ9Qby$;c-^M2(DWD=Lh%|HXBb6AV1qneqq(f4gF+>nVL8O#!l@O2yX{jGdju;^^ z8b&vx>$!N|f8O`qj$?7`-hE&9H$Lb2y~3VpC{vO%kwYL5N|h&y+7QS!L-3iClo-6C zPuVrV8?lv|vLfX2>iM-HHx>f9wWFdar;AG4NcY#((>rOGSu&GtR@A8&NV=22#+mtx zmtJ1B`2IiI`Y};0H&uC`Hc}?JTED75e@t@2soTapZSAlx_F!(~lvCQC>wYJBJA}bP z^?TDD^0<+1M3W4IhDq%&PIl{!KI1~~Nr9!)b^k-(-l@K+LsEhu+50z1iT>ByGJkd| z&6M9(L#U0>!3u>nk%cIeKwEn|>xvWH<^6jKddCQ*EPrz>+fDrSa=s;3Y*kU_%ar%Y z^3vseTfaPCkd0?*=OYO<4=P!z-(u|5KXF1cOEzwjo_vsKF0LZmV0MPFv9UF{L^j7= zo-N6k)OzHU^eo@n+}z|dsVOb#xku5R$gw@x3y$Q z`==BbluZ54Uz#{Kvptt7l)ZQanIf4by*|{{)xp0z2r`I!E#IW1q^ypcPQ_OtqgmFc z8vKkJU)QP_Bax3h7t!BpY7A9Gm?9OGl|9dnb~04S$F~>$F+#j)Don4|JlJx2?(%+S z#)67fdZMVDj*f2GOOlxS-VIq(QS$B&7KiM35lCt=7lla;by|Lqo%cL`tqhY+y7)G7leip z4zD*Wn_p55U9za}en&=AT2?l@jLGU68#_CDJvTq!+0%m?v-_eqkd~HKv(|_w}AzX<*CmbLdV-?B-pIm+Q&7MhjA}p z9}M%DGzFxWmI}ti#vacEQ}YT4v`lNr*IytFXTXTR^p6!>svHktwmZFjp!SeA4>>-BkWevO zEcK>4gGNmM+XL`%i-x9^Lf}{P)|*Q|F2sWeAHRORpW(a62e6H@mvJ@(Kz#xVb|L3;DR8rVur^1e0JKD54gcmN=T+Nc~s|J@)%WV9F?8Vb74DS|@iFBf%k zap4A`iRIB87#$@IG%INz8KDoXbQ;+OJh;uwjE;lqp!Ryid~xvxaZXoQz;!2DJ2-Tn z9q+k&cxdmYq^26xBl-Of)-6HcKYCstt#RjYtW1&cTy&fL_d3W42q3|IF0S{Hcg5y5 zHhR{_DkM2hrk^fkN|J z>kzZa{<{igr?{NH^~C4`-8*a*@&tYmvO>rwp((mD>F*Ek(Xp^Z=H~L0m6ZVyr9O1} z3)z?t1yyj(0$>BM<)<+}BO~KPje9UHOh0LuLDc?c|E{1kfLQt2eC$eBJglp*sKC%x zNr||!vXYaNGby`Z*ipaGu%+o@U!d{)0Q--(jS)8|=eq{KLt&pylkb{eG_0&L=i<`O^us@T}x-Tk+>SHtM#3p+a+28Iq0 z+m7B|V&gO&GqZbga&ineh+q5rOL#1hf?EK<3+eBFcCi!vCh2vkmX=lot4szsrCT53 zkoT2Ai5V9!?}w0(5ahI$mzOAz1I5RW%luD~bbN;WMbfLiHK4lIN6Uh@x7`3CRn*n9 z%gePfQQ_et&#QCsC}N83QR`@^<`95|C==!R>7gBd8FS~(otc%DE6!-BtKS$YHswGd z(xYWAl6L0X3EeKw5BKncniZ%WE8-grkmf6}ZPqTSdpSBeg@uPJ#Bd@vC&o6(2AP}) zNl8hYM@ACCc}0A8ZK|Bd{>?!6F~E_0kg2Jun)-Urow>*B8_xrzWk4JOt**Htk!@IP zYFC%4?gLuart?Q|p#vWb0C|f3_}Ft(XWlHgl`iw@?F5yDo;A; ze|0}mQL$Vd%9ri-X>=ImuD}`F8Gy?~FiYGH{P|OKePg4ns!G3$i;HWg@682GAh?^@ zn3w_UyWQR0W!2SUcjfKVZ>Gt-$vEAtFBx20$5uyYX0rEwkts28>iER=yS<%;mDRN> z5<*2q1#zCNiys)!-rd{#oSk40esp{c#mURdi+iu$`SN;~41>XJ;D;R_UR+$*fHdE_ zB?q(+Bo`bf_F#RiHAgK`{1raW<8pXtsMNBR_}-f{cU)ab z(}m>h>@1|~$LvI{C!b+yU|t^Y-xBlb-UQG`w`pmw|C~^8adG)|w%eU1yP)K0ZD-hzXbazO)Yy(?aO!6OocYV66akL2xvUTq^(c z^gKOwc5ncBrvN;PU=Sh*ZfRB%Xt2>Xi{S*gyF;?Jyqvc%37io`*TBGYe^t-MsI9fN zH9G*CT98#Y>0KJBL`$znt>w|wMtvkhW@D_+a9cPbeK=lDJ3r}eDpYeh!O+#cwj;J~ z^QED8Tau7X94 zZ{NG8VPlhRv_zi7H)d*T3Oe{(c6K(_e+W|p<>UJe!sTAvKgT*g5GypoSpBC(QbOWN z7=ZUdW3rTu8eTo@pR<@o%~Jx60*Sp6UpO2Nk^oTDHSoKTw-=DpP?b~DXEH&~^a(=|pkS_cMhXJKCBmw^2d+gs}6 z;oxXpm@OVzBcrBP&KsC-?Bqgv`R=K^#1;gcDE85cMc%8zcqWHC^$-?ge?W33_ zGJl(sP%;hm9)oLE)(aS8#}j}ChCU9bn+0+Q+5wBJZgBDUN9^zK-(V8W>y~yzSPf%p z7^P5x09k9L=jp>6P!M9(n0L|9)LTuL(p6PeT@n3*gRvEMecI;cCC-5ol9E=gu6^}e zjcQg_?EM2fMJwq-&ZB~WU@Cy8eKMC)B@G8DVH_9BS<$G~{M^!timb0+13^{otrnEb z&CE0dvn2tV9tezF3@1nwYrqj(Mn;BdmFrNRR>VC-3Q#jINfsc6C5;aC?hC(lx2B>UqPpeMFTe%8~+SDuhSYzoon6{06e~s_o^;{F>nrRx&lB| z9R|Peq)wj^M=B{id2*#HKz)@lGHx>vu%rhnDk_G?#>jjcCZ?{{;Q|LoN9}|>Jw3hk z@yc*89}GEq*FQ=~ND%g1RM*zgdHTY?Uzh_4TlE7jVwWBW02B(nLJB=SJuwyYr~|9_pPvqcPo6xvk3g8ZulpTt{^{#0 z8R1c?-Uua*MjS8zXMc2bhBEFLA7?T!FaQl2Px%i81%KP9g*JH8) zpSGEn;A8CcMcat^o1VEp;X({IR5P-&IE;%DfbV4I;4rFmq>Yx^B?XDAo(@P2CZW#6 z*e8Jz!_3SKcrGtBog)3czt3IW&yL)2#AZM3G5miF>J?T+^LNi3212p&Igrkdl25*7 zF%Afk!BJSI4_gc;H1!@(1fU(Xfu{AyZy5V+JpMNZbBmRg7044nOV{@};MqWLu#4FB z+5q2HQ&S`8JX)%;AH@Q{T5HjnAE@pK7C4=qon2ex-O%7*LQu}!P^gM;y|#g5mQo}; zKYwIW5<^;gda|G;fpvS7o>j-7^F zkSv$`zX5*)a0$j~EqRIf`1mx0A6=wUFvgx!Oe|3)mOJ@(lbWh(&Ff=fY6SjM`7t4X zDy@0IF_%)-=g%CUMsh!15WvSdwYTHb^{JX3W4ZxWPu|iNbaG&PJYe>?gKnJ z(CCFov8kEgVKktP>z+#%fh&W#%)#Eid2FoKG@|t7UEuS2GFT1{50zs$Q&LiR`S=tQ zY)wo}p)go$R~I=6NhsCn_P_5bKvIE@e{&WkWR?kFR*3kL z2^UR7t_*PXro%&(vgC5Kp~o_3+k~{VwBm4hHCA>#@4wbw^wA?w&2Ni}ii9=lo>#-@ z{xSK$*X;?m9uTpIE#xGpGKvONRs4IxIF$#GYMlr9y3~M3Zl)@@xTQ`^S_;iL5u9L>urksp(%XOE*g1*wuT5Nepr|>@{G%}^T zLrUb6R=@bt7;GrGRkJY{f-MmI?SEUyi3sEb{@+*3Ec7iJjfOjf&NNMIY>A44Nh9=9 z`IqdrT2^{+JSUVjX^^Cf6q1EOm6g1#(bIh}%o?FIuk8OaRJNbKqdaYT + + diff --git a/html/inherit_graph_8.md5 b/html/inherit_graph_8.md5 new file mode 100644 index 0000000..cf8dbd2 --- /dev/null +++ b/html/inherit_graph_8.md5 @@ -0,0 +1 @@ +092a4d5f8c95b93809b330c60e9ed2bc \ No newline at end of file diff --git a/html/inherit_graph_8.png b/html/inherit_graph_8.png new file mode 100644 index 0000000000000000000000000000000000000000..e5090655dd21934f77481fd2030433bbcf20c838 GIT binary patch literal 2161 zcmV-%2#)uOP)u-FXzEv%m`*! zhE>4~%dje#VHs8hGprd>Qc_S}UOv}p%qjnGHJJ32V7d$r4&u_KOQ@}_g?(RrUO*PDOb90*w`QJuJNXVS(Ycv{!hld-*;^N})`SWLFW@duN z>{{6e5Ef5G06%{pM zeqv%GVq#*@(9i&lMuR8b7uyNx? zY}~lfpt)(&CNwrS;^oVi@bvV=p+kq@?d=T!c>er3&YnGsFJHbOBqRixnVE2Laj{5y zd<}+%hS1j5hP=EyT)A=u0RaKX$;rXv$B*&+`E!WHVgNu)OboKJvZi&7B_$;&EiHvs zt3`Z#JQ5NTaOB9533^3EMH6a3L?|vUhFYx#$8lJ;$1b`|kD$I^syLK(5rKOqd6NyCR>gr0lxw)iPtEsoQmztWIsH&=p)M_=IJb99M zJRUuJ_RMIGo0}UQKYpC<-@i{`VPO;$6hu;~ly2X?P3O;_CkF=ydiwOKVU9|rqQ#3B z)1^z7=-$116crUk@$vDK=DcdvDk?56Hqvx=cc=XPd@3(5r_Gx;lSm{YBBGw29&&Va zq@zcV(!+-j>DaMjB$LT3)*fGjs;Vjy3Wb!Fl|@xmRix2q=;zO$Vs;jGw*8K6~$E12=YtY-Su3hSw`rtS}ne-rkP0XV0R& zy&XE84m~|R6E^=sq0sQ!)zuY_j*bur1V%BfRto@l_wF5rhljCu?_Q%dIF3VGTN`|R zeJ#0MqnsBkSODO!YZr+`*u8ra^a+iP zjktRCDgpxoq0wm2-`{Um$JyB#LJRBnGCOv%JuCp&+5Mf0PN&1_)vK{%#||hI z3OG4Ap|rFVb#-+{b2yGO+a3###{%-{iCW-@bh_^jW&jOqlUG?ELxjp;Ri7laqr-j~*HIRaRD_rlw}v zYj$^cf zi1hUIf3*IqSFcb}Q2~2uZqNb(>US3`Z4i3h)ZQHPL;X;#oC&YrD=WkG>(`A=hkhp$-n)~MlHxgz`;$Fh$e2qM3I&L0YjJV0(etqEt67Fs!3@i= zDwtszRs}OG!>VA0Wmpx=unen$8J1yHFvBveib + + diff --git a/html/inherit_graph_9.md5 b/html/inherit_graph_9.md5 new file mode 100644 index 0000000..ae0cd68 --- /dev/null +++ b/html/inherit_graph_9.md5 @@ -0,0 +1 @@ +3c4f06a6980a906ef8b24f659ff8521f \ No newline at end of file diff --git a/html/inherit_graph_9.png b/html/inherit_graph_9.png new file mode 100644 index 0000000000000000000000000000000000000000..3c463b379b8ebba10e2ccbeb30a53222dad4ba18 GIT binary patch literal 1585 zcmV-12G043P)al(Cr!HAAd*OV;1iyDJc;#43p}QWT?O+5D08~z24-w zFL?1FhG9|}hI#C}w5UKfH#cVhpm5x`r0Evu_4-v$hze|ay&h(>dC7i(A9A7oa^S=7PPjuVsdg4X=!PwtgJ*xNQledb-DOQ zj~>BfGU3jhJKR{i-43~2j;5w2Y}>YNMe94(EF&WWU0q%1=;+`zowGS>YHC)cj-K%N zn$Bjk;q~j+sIIQ&HQa*m@bEv*(bv}prBaE|&`_K`dlpGaNhl~NfKI2w<;$0`d-rY} zJ$e)-lZh8|`t)f;Mn>Y)sZ+36EJ#mJM|E{I zQmN#&B@zkIYPH<9(P$(9h|Ol>_Q~aPQd?U~2q9#Ae4K=Ygb=gY%pJGe?Ibibl#Gpy z{dUciloZm~*ywWnfddD~wQJY7{Fo;AV-afnC4gh%n{yl#F{E4cnD&8Cn z!(e!L81eD(PIGr9UZqmu`t|Fmsj0!cckf`aSkTti=F$2KHJh88gVkz9U0ogYdOa#C zDqNb=+jaB?kDG4Su3ZQZ4@Xy57bFsi)3M84(*g5$XA7pLrjVMNilU+-l$Mra{rdHI z^5hBcv;fQ(*V(qCh=>R<41-ITE@AE3wY+0VNl8xgb~Rq1P@ufL96dcfXlZFdc6K&4 zZ{F>2M^XJ;o~zI^HS zoHm;c6B85AYPHDC%>~P{zkP7*j)a5+Bqk=Jx3?EksT4Aq3~6a;7#ti#L_`Dt;O5Pn z&}cL(j$gNK9TW-$?%%(UhYue@rBb;S?}~we0q(BA5P~B|j<_Aan89FxOeTX=Dn)#J zJd8#o8X6j0nsYVk=nYH$kE+$`V+_MQrmr?pp8EIICPQOmBkz4W`WTGzIofoT&(Wr% ze2z99<#V*@D4(NENBJCWI?Cs0(@{RR?6cR>(o$dMLH$LRG#w$N2SC0ba-jl{Kp?RB jI|quQD2k#e%KLr+J9JB7TI@9700000NkvXXu0mjfWX2R# literal 0 HcmV?d00001 diff --git a/html/inherits.html b/html/inherits.html new file mode 100644 index 0000000..de74b35 --- /dev/null +++ b/html/inherits.html @@ -0,0 +1,607 @@ + + + + + + + +Quetzal: Class Hierarchy + + + + + + + + + +

+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+ + + +
+ + + +
+ + + + + +
+
+ + + + diff --git a/html/jquery.js b/html/jquery.js new file mode 100644 index 0000000..1dffb65 --- /dev/null +++ b/html/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/html/md_CHANGELOG.html b/html/md_CHANGELOG.html new file mode 100644 index 0000000..bad5252 --- /dev/null +++ b/html/md_CHANGELOG.html @@ -0,0 +1,139 @@ + + + + + + + +Quetzal: Changelog + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Changelog
+
+
+

+

+<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17

+

+Added

+
    +
  • Add ASME flange weld neck, lap join, socket slot
  • +
  • Add German, Greek, Polish and Swedish translations
  • +
+

+Changed

+
    +
  • Update WB icon with an actual quetzal
  • +
  • Replace original profiles to use BIM profiles
  • +
  • Update icons to be easier to identify
  • +
  • Update Spanish translations
  • +
  • Rename icons and add them to FreeCAD resources path
  • +
+

+Fixed

+
    +
  • Fix object bases & added extra flange & pipe standards
  • +
  • Mark openTransaction() strings for translation
  • +
  • Don't translate objects' internal name, only translate obj.Label
  • +
+

+<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20

+

🌱 Initial release of Quetzal WB based on the work of oddtopus on Dodo WB.

+

+Added

+
    +
  • Add Cut List function by File Phil
  • +
  • Add translation support
  • +
  • Add Spanish translation
  • +
  • Add view provider class to assign icons to parametric objects
  • +
  • Add miter corner feature
  • +
+

+Changed

+
    +
  • Apply black style to Python files
  • +
  • Make commands to use "Quetzal_" prefix
  • +
  • Extend RH profile profile CSV file
  • +
  • Update some icons
  • +
  • Mark commands unavailable when there is no active document
  • +
+

+Fixed

+
    +
  • Don't remove sketch profile by Ebrahim Raeyat
  • +
  • Fix touched object after recomputation by Zheng, Lei
  • +
  • Fix license ID by Chris Hennes
  • +
  • Fix PypeLineForm pipe generation
  • +
  • Fix typos
  • +
+
+
+ + + + diff --git a/html/md_CONTRIBUTING.html b/html/md_CONTRIBUTING.html new file mode 100644 index 0000000..f656bb7 --- /dev/null +++ b/html/md_CONTRIBUTING.html @@ -0,0 +1,109 @@ + + + + + + + +Quetzal: Contributing + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Contributing
+
+
+

Contributing can take many forms, and it's not just for developers.

+

+Ideas

+

Many of the workbench features were added because the developers thought they might be useful to others or themselves.

+

Is some step in the workflow hard to accomplish? Do you think a feature is missing? Let us know.

+

+Translators

+

This may be one of the most undervalued type of contribution. FreeCAD and the Quetzal Workbench aren't only for people speaking English. Translating different languages requires the contributions of native speakers worldwide.

+

The Quetzal Workbench, like FreeCAD itself, uses the CrowdIn platform https://crowdin.com/project/freecad-addons for management of translations. Create an account and you'll be able to start contributing right away. In addition to providing translations, you can also proof read the translations already contributed. Do a little or a lot. Even small incremental gains are valuable.

+

Of course, you can do translation locally on your machine, to know more about the translation process take a look on the README file on the translations directory.

+

+Designers

+

Some icons may need to be improved to be easier to identify.

+

Here are FreeCAD guidelines for icons: https://wiki.freecad.org/Artwork_Guidelines

+

+Accessibility / Usability

+

What can be done to improve your experience? It is easy to overlook an accessibility issue when you're not personally affected but it's often easy to accommodate once the issue is known.

+

+Testers

+

See a bug? Open an issue on GitHub: https://github.com/EdgarJRobles/quetzal/issues

+

If you have QA experience consider writing test cases.

+

+Developers

+

Feel like adding a new feature/part? Open a ticket to use as a basis for discussion.

+

Describe your idea. Discuss with the other developers and start coding!

+
+
+ + + + diff --git a/html/md_README.html b/html/md_README.html new file mode 100644 index 0000000..14ead0f --- /dev/null +++ b/html/md_README.html @@ -0,0 +1,123 @@ + + + + + + + +Quetzal: Quetzal Workbench + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Quetzal Workbench
+
+
+

![Contributions welcome][ContribsW_badge] license FreeCAD Addon Manager pre-commit enabled Code style: black GitHub Tag ![Common Changelog][cc_badge]

+

Quetzal is the fork of Dodo workbench for FreeCAD. Extending Dodo workbench support & adding translation support. screenshot1

+

+Installation

+

+Automatic Installation

+

The recommended way to install Quetzal is via FreeCAD's Addon Manager under Tools > Addon Manager drop-down menu.

+

Search for Quetzal in the workbench category.

+

+Manual installation

+

The install path for FreeCAD modules depends on the operating system used.

+

To find where is the user's application data directory enter next command on FreeCAD's Python console.

+
App.getUserAppDataDir()
+

Examples on different OS

+
    +
  • Linux: /home/user/.local/share/FreeCAD/Mod/
  • +
  • macOS: /Users/user/Library/Preferences/FreeCAD/Mod/
  • +
  • Windows: C:\Users\user\AppData\Roaming\FreeCAD\Mod\
  • +
+

Use the CLI to enter the Mod directory and use Git to install Quetzal:

+
git clone https://github.com/EdgarJRobles/quetzal Quetzal
+

If you are updating the code, restarting FreeCAD is advised.

+

+Usage

+

Check the documentation on the FreeCAD Wiki article: https://wiki.freecad.org/Dodo_Workbench

+

Discussion in the FreeCAD Forum: https://forum.freecad.org/viewtopic.php?t=22711

+

+Changelog

+

Read our CHANGELOG file to know about the latest changes.

+

+Contributing

+

Read our CONTRIBUTING file to know about ways how to help on the workbench.

+

+Links

+ +
+
+ + + + diff --git a/html/md_cut__list_2README.html b/html/md_cut__list_2README.html new file mode 100644 index 0000000..5b27125 --- /dev/null +++ b/html/md_cut__list_2README.html @@ -0,0 +1,149 @@ + + + + + + + +Quetzal: Cut List Creation Command for Dodo Workbench + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Cut List Creation Command for Dodo Workbench
+
+
+

This Module can be used to create a cut list of beams created by the DODO-Workbench.\ The cut list can use one or more profiles (sections/sketches).\ A position number will be generated for each profile & length combination (rounded to 0.01mm).\ The script will create a new speadsheet object with each cut list.

+

+How to use it

+

Cut_List.webm

+

+Options

+

+Group Parts by Size

+

The Option "Group Parts by Size" will count all Pieces with the same profile and Length (rounded to 0.01mm).

+

+Example: Group Party by Size

+ + + + + + + + + + + + + +
Beam No. 1
Used 2855.0 mm
Pos. Profil Length Quantity
1 10X10 610,00 mm 2
2 10X10 600,00 mm 2
3 10X10 410,00 mm 1
+

+Exampl: Without Group Party by Size

+ + + + + + + + + + + + + + + +
Beam No. 1
Used 2410.0 mm
Pos. Profil Label Length
1 10X10 Structure006 610,00 mm
1 10X10 Structure017 610,00 mm
2 10X10 Structure012 600,00 mm
2 10X10 Structure018 600,00 mm
+

+Use Nesting

+

The Option "Use Nesting" allows to specify the maximum length of the Stock Material and allows for optimizing of the available material.\ The cut Width will be added to each piece to account for the saw thickness.\ The list will be separated into Sections and shows the Used Length and the Parts that can be cut from the Stock Material.\ The position number of a piece will be the same on every stock material beam.

+

+Example with Nesting & Group Party by Size

+ + + + + + + + + + + + + + + +
Beam No. 1
Used 2855.0 mm of 3000.0 mm
Pos. Profil Length Quantity
1 10X10 610,00 mm 2
2 10X10 600,00 mm 2
3 10X10 410,00 mm 1
+

| Beam No. 2 | | Used 3000.0 mm of 3000.0 mm | | Pos. | Profil | Length | Quantity| | 3 | 10X10 | 410,00 mm | 1| | 4 | 10X10 | 390,00 mm | 2| | 5 | 10X10 | 210,00 mm | 2| | 6 | 10X10 | 190,00 mm | 7| | | | | | | Beam No. 3 | | Used 1365.0 mm of 3000.0 mm | | Pos. | Profil | Length | Quantity| | 6 | 10X10 | 190,00 mm | 7|

+
+
+ + + + diff --git a/html/md_translationz_2README.html b/html/md_translationz_2README.html new file mode 100644 index 0000000..29a78cf --- /dev/null +++ b/html/md_translationz_2README.html @@ -0,0 +1,160 @@ + + + + + + + +Quetzal: About translating Quetzal Workbench + + + + + + + + + +
+
+ + + + + + + +
+
Quetzal 1.1.0 +
+
Pipe & framing framework
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
About translating Quetzal Workbench
+
+
+

+

‍[!NOTE] All commands must be run in ./translationz/ directory.

+
+
+

‍[!IMPORTANT] If you want to update/release the files you need to have installed lupdate and lrelease from Qt6 version. Using the versions from Qt5 is not advised because they're buggy.

+
+ + + + + + + + + + + + + + + +
language translated strings completion
de 22 4%
el 305 60%
es-AR 496 100%
es-ES 496 100%
pl 265 52%
sv-SE 69 13%
+

+Updating translations template file

+

To update the template file from source files you should use this command:

+
./update_translation.sh -u
+

Once done you can commit the changes and upload the new file to CrowdIn platform at https://crowdin.com/project/freecad-addons webpage and find the Quetzal project.

+

+Creating file for missing locale

+

+Using script

+

To create a file for a new language with all Quetzal translatable strings execute the script with -u flag plus your locale:

+
./update_translation.sh -u es-ES
+

+Renaming file

+

Also you can rename new Quetzal.ts file by appending the locale code, for example, Quetzal_es-ES.ts for Spanish (Spain) and change

+
<TS version="2.1">
+

to

+
<TS version="2.1" language="es_ES" sourcelanguage="en">
+

As of 13/09/2024 the supported locales on FreeCAD (according to FreeCADGui.supportedLocales()) are 44:

+
{'English': 'en', 'Afrikaans': 'af', 'Arabic': 'ar', 'Basque': 'eu',
+
'Belarusian': 'be', 'Bulgarian': 'bg', 'Catalan': 'ca',
+
'Chinese Simplified': 'zh-CN', 'Chinese Traditional': 'zh-TW', 'Croatian': 'hr',
+
'Czech': 'cs', 'Danish': 'da', 'Dutch': 'nl', 'Filipino': 'fil', 'Finnish': 'fi',
+
'French': 'fr', 'Galician': 'gl', 'Georgian': 'ka', 'German': 'de', 'Greek': 'el',
+
'Hungarian': 'hu', 'Indonesian': 'id', 'Italian': 'it', 'Japanese': 'ja',
+
'Kabyle': 'kab', 'Korean': 'ko', 'Lithuanian': 'lt', 'Norwegian': 'no',
+
'Polish': 'pl', 'Portuguese': 'pt-PT', 'Portuguese, Brazilian': 'pt-BR',
+
'Romanian': 'ro', 'Russian': 'ru', 'Serbian': 'sr', 'Serbian, Latin': 'sr-CS',
+
'Slovak': 'sk', 'Slovenian': 'sl', 'Spanish': 'es-ES', 'Spanish, Argentina': 'es-AR',
+
'Swedish': 'sv-SE', 'Turkish': 'tr', 'Ukrainian': 'uk', 'Valencian': 'val-ES',
+
'Vietnamese': 'vi'}
+

+Translating

+

To edit your language file open your file in Qt Linguist from qt5-tools/qt6-tools package or in a text editor like xed, mousepad, gedit, nano, vim/nvim, geany etc. and translate it.

+

Alternatively you can visit the FreeCAD-addons project on CrowdIn platform at https://crowdin.com/project/freecad-addons webpage and find your language, once done, look for the Quetzal project.

+

+Finding potential typos

+

You can use the aspell command along with awk to potentially find some typos on the translation. Also you need to install the language package, aspell-es for Spanish.

+
awk 'BEGIN { RS="</translation>" } /<translation>/ { sub(/.*<translation>/, ""); print }' \
+
Quetzal_es-ES.ts | aspell --lang=es list | sort | uniq
+

+Compiling translations

+

To convert all .ts files to .qm files (merge) you can use this command:

+
./update_translation.sh -R
+

If you are a translator that wants to update only their language file to test it on FreeCAD before doing a PR you can use this command:

+
./update_translation.sh -r es-ES
+

This will update the .qm file for your language (Spanish (Spain) in this case).

+

+Sending translations

+

Now you can contribute your translated .ts file to Quetzal repository, also include the .qm file.

+

https://github.com/EdgarJRobles/quetzal

+

+More information

+

You can read more about translating external workbenches here:

+

https://wiki.freecad.org/Translating_an_external_workbench

+
+
+ + + + diff --git a/html/menu.js b/html/menu.js new file mode 100644 index 0000000..b0b2693 --- /dev/null +++ b/html/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/html/menudata.js b/html/menudata.js new file mode 100644 index 0000000..563c246 --- /dev/null +++ b/html/menudata.js @@ -0,0 +1,61 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Packages",url:"namespaces.html",children:[ +{text:"Package List",url:"namespaces.html"}, +{text:"Package Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html"}, +{text:"Functions",url:"namespacemembers_func.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"a",url:"functions.html#index_a"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"p",url:"functions.html#index_p"}, +{text:"s",url:"functions.html#index_s"}, +{text:"u",url:"functions.html#index_u"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"_",url:"functions_func.html#index__5F"}, +{text:"a",url:"functions_func.html#index_a"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"u",url:"functions_func.html#index_u"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}]} diff --git a/html/minus.svg b/html/minus.svg new file mode 100644 index 0000000..f70d0c1 --- /dev/null +++ b/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/html/minusd.svg b/html/minusd.svg new file mode 100644 index 0000000..5f8e879 --- /dev/null +++ b/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/html/namespacemembers.html b/html/namespacemembers.html new file mode 100644 index 0000000..a126efd --- /dev/null +++ b/html/namespacemembers.html @@ -0,0 +1,84 @@ + + + + + + + +Quetzal: Package Members + + + + + + + + + +
    +
    + + + + + + + +
    +
    Quetzal 1.1.0 +
    +
    Pipe & framing framework
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    +
    + + + + diff --git a/html/namespacemembers_func.html b/html/namespacemembers_func.html new file mode 100644 index 0000000..cd5954c --- /dev/null +++ b/html/namespacemembers_func.html @@ -0,0 +1,84 @@ + + + + + + + +Quetzal: Package Members + + + + + + + + + +
    +
    + + + + + + + +
    +
    Quetzal 1.1.0 +
    +
    Pipe & framing framework
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented namespace functions with links to the namespaces they belong to:
    +
    + + + + diff --git a/html/namespaces.html b/html/namespaces.html new file mode 100644 index 0000000..925fc58 --- /dev/null +++ b/html/namespaces.html @@ -0,0 +1,89 @@ + + + + + + + +Quetzal: Package List + + + + + + + + + +
    +
    + + + + + + + +
    +
    Quetzal 1.1.0 +
    +
    Pipe & framing framework
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Package List
    +
    +
    +
    Here are the packages with brief descriptions (if available):
    +
    [detail level 12]
    + + +
     Nupdate_crowdin
     CCrowdinUpdater
    +
    +
    + + + + diff --git a/html/namespaceupdate__crowdin.html b/html/namespaceupdate__crowdin.html new file mode 100644 index 0000000..72e5cdf --- /dev/null +++ b/html/namespaceupdate__crowdin.html @@ -0,0 +1,234 @@ + + + + + + + +Quetzal: update_crowdin Namespace Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    Quetzal 1.1.0 +
    +
    Pipe & framing framework
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    update_crowdin Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  CrowdinUpdater
     
    + + + + + + + +

    +Functions

    print_response (dict response)
     
    None|str load_token ()
     
     applyTranslations ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    TsFile = namedtuple("TsFile", ["filename", "src_path"])
     
    +list translation_source = [TsFile("Quetzal.ts", "Quetzal.ts")]
     
    WBLocation = namedtuple("WBLocation", ["module_name", "translations_path"])
     
    wb_location = WBLocation("Quetzal", ".")
     
    +dict supported_locales
     
    +str GREEN = "posix" else ""
     
    +str NC = "posix" else ""
     
    +int THRESHOLD = 20
     
    +bool DEBUG_URL = True
     
    command = None
     
    args = sys.argv[1:]
     
    token = os.environ.get("CROWDIN_TOKEN", load_token())
     
    +str project_identifier = "freecad-addons"
     
    updater = CrowdinUpdater(token, project_identifier)
     
    status = updater.status()
     
    +bool sep = False
     
    stat = updater.build_status()
     
    +list locale_source = []
     
    +

    Detailed Description

    +
    This utility offers several commands to interact with the FreeCAD project on
    +crowdin. For it to work, you need a ~/.crowdin-freecad-token file in your
    +user's folder, that contains the API access token that gives access to the
    +crowdin FreeCAD project. The API token can also be specified in the
    +CROWDIN_TOKEN environment variable.
    +
    +The CROWDIN_PROJECT_ID environment variable can be used to use this script
    +in other projects.
    +
    +Usage:
    +
    +    updatecrowdin.py <command> [<arguments>]
    +
    +Available commands:
    +
    +    gather:                       update all ts files found in the source code
    +                                  (runs updatets.py)
    +    status:                       prints a status of the translations
    +    update-source:                updates on CrowdIn the current version of .ts file
    +                                  found in the source code
    +    update-translation [locale]:  updates on CrowdIn the current version of locale .ts files
    +                                  passed to the command
    +    build:                        builds a new downloadable package on CrowdIn with all
    +                                  translated strings
    +    build-status:                 shows the status of the current builds available on
    +                                  CrowdIn
    +    download [build_id]:          downloads build specified by 'build_id' or latest if
    +                                  build_id is left blank
    +    apply / install:              applies downloaded translations to source code
    +                                  (runs updatefromcrowdin.py)
    +
    +Example:
    +
    +    ./updatecrowdin.py update
    +
    +Setting the project name adhoc:
    +
    +    CROWDIN_PROJECT_ID=some_project ./updatecrowdin.py update
    +

    Function Documentation

    + +

    ◆ applyTranslations()

    + +
    +
    + + + + + + + +
    update_crowdin.applyTranslations ()
    +
    +
    Extracts files from ZIP file and copy TS files
    +
    +
    + +

    ◆ load_token()

    + +
    +
    + + + + + + + +
    None | str update_crowdin.load_token ()
    +
    +
    Loads API token stored in ~/.crowdin-freecad-token
    +
    +
    +
    + + + + diff --git a/html/nav_f.png b/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/html/nav_fd.png b/html/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S literal 0 HcmV?d00001 diff --git a/html/nav_g.png b/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} literal 0 HcmV?d00001 diff --git a/html/open.png b/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +Quetzal: Related Pages + + + + + + + + + +
    +
    + + + + + + + +
    +
    Quetzal 1.1.0 +
    +
    Pipe & framing framework
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    + + + + diff --git a/html/plus.svg b/html/plus.svg new file mode 100644 index 0000000..0752016 --- /dev/null +++ b/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/html/plusd.svg b/html/plusd.svg new file mode 100644 index 0000000..0c65bfe --- /dev/null +++ b/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/html/quetzal.svg b/html/quetzal.svg new file mode 100644 index 0000000..96390ea --- /dev/null +++ b/html/quetzal.svg @@ -0,0 +1,144 @@ + + + +templatehaseciluFreeCADcommandTemplate file to create icons for FreeCAD commands.2024FreeCAD LGPL2+FreeCAD/src/FreeCADhttps://wiki.freecad.org/Artworktemplate diff --git a/html/search/all_0.js b/html/search/all_0.js new file mode 100644 index 0000000..3b59afe --- /dev/null +++ b/html/search/all_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['0_200rc2_201_200_200_20a_202024_2010_2020_0',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['0_201_201_200_20a_202025_2001_2017_1',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['01_2017_2',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['0rc2_201_200_200_20a_202024_2010_2020_3',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]] +]; diff --git a/html/search/all_1.js b/html/search/all_1.js new file mode 100644 index 0000000..a79a2ff --- /dev/null +++ b/html/search/all_1.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['1_200_200_20a_202024_2010_2020_0',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['1_201_200_201_201_200_20a_202025_2001_2017_1',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['10_2020_2',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['17_3',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]] +]; diff --git a/html/search/all_10.js b/html/search/all_10.js new file mode 100644 index 0000000..5258e5d --- /dev/null +++ b/html/search/all_10.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['nearestport_0',['nearestPort',['../classpFeatures_1_1pypeType.html#ad8a792048942d2777c69701eef42ccd7',1,'pFeatures::pypeType']]], + ['nesting_1',['Use Nesting',['../md_cut__list_2README.html#autotoc_md22',1,'']]], + ['nesting_20group_20party_20by_20size_2',['Example with Nesting & Group Party by Size',['../md_cut__list_2README.html#autotoc_md23',1,'']]] +]; diff --git a/html/search/all_11.js b/html/search/all_11.js new file mode 100644 index 0000000..1468090 --- /dev/null +++ b/html/search/all_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['offsetworkplane_0',['offsetWorkPlane',['../classCUtils_1_1offsetWorkPlane.html',1,'CUtils']]], + ['options_1',['Options',['../md_cut__list_2README.html#autotoc_md18',1,'']]] +]; diff --git a/html/search/all_12.js b/html/search/all_12.js new file mode 100644 index 0000000..ed11715 --- /dev/null +++ b/html/search/all_12.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['parts_20by_20size_0',['Group Parts by Size',['../md_cut__list_2README.html#autotoc_md19',1,'']]], + ['party_20by_20size_1',['party by size',['../md_cut__list_2README.html#autotoc_md21',1,'Exampl: Without Group Party by Size'],['../md_cut__list_2README.html#autotoc_md23',1,'Example with Nesting & Group Party by Size'],['../md_cut__list_2README.html#autotoc_md20',1,'Example: Group Party by Size']]], + ['piemenu_2',['PieMenu',['../classdodoPM_1_1PieMenu.html',1,'dodoPM']]], + ['pipe_3',['Pipe',['../classpFeatures_1_1Pipe.html',1,'pFeatures']]], + ['pipeqm_4',['pipeQM',['../classCPipe_1_1pipeQM.html',1,'CPipe']]], + ['pivotbeam_5',['pivotBeam',['../classCFrame_1_1pivotBeam.html',1,'CFrame']]], + ['point2point_6',['point2point',['../classCPipe_1_1point2point.html',1,'CPipe']]], + ['point2pointpipe_7',['point2pointPipe',['../classpForms_1_1point2pointPipe.html',1,'pForms']]], + ['potential_20typos_8',['Finding potential typos',['../md_translationz_2README.html#autotoc_md38',1,'']]], + ['pqm_9',['pQM',['../classdodoPM_1_1pQM.html',1,'dodoPM']]], + ['profedit_10',['profEdit',['../classfForms_1_1profEdit.html',1,'fForms']]], + ['protopypeform_11',['protoPypeForm',['../classdodoDialogs_1_1protoPypeForm.html',1,'dodoDialogs']]], + ['prototypedialog_12',['protoTypeDialog',['../classdodoDialogs_1_1protoTypeDialog.html',1,'dodoDialogs']]], + ['ptype_13',['PType',['../classdodoPM_1_1DialogQM.html#a88048303c070e2c4043816887e90577c',1,'dodoPM::DialogQM']]], + ['pypebranch2_14',['PypeBranch2',['../classpFeatures_1_1PypeBranch2.html',1,'pFeatures']]], + ['pypeline2_15',['PypeLine2',['../classpFeatures_1_1PypeLine2.html',1,'pFeatures']]], + ['pypetype_16',['pypeType',['../classpFeatures_1_1pypeType.html',1,'pFeatures']]] +]; diff --git a/html/search/all_13.js b/html/search/all_13.js new file mode 100644 index 0000000..8627922 --- /dev/null +++ b/html/search/all_13.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['qkmenu_0',['QkMenu',['../classdodoPM_1_1QkMenu.html',1,'dodoPM']]], + ['queryform_1',['QueryForm',['../classuForms_1_1QueryForm.html',1,'uForms']]], + ['querymodel_2',['queryModel',['../classCUtils_1_1queryModel.html',1,'CUtils']]], + ['quetzal_20workbench_3',['quetzal workbench',['../md_translationz_2README.html',1,'About translating Quetzal Workbench'],['../md_README.html',1,'Quetzal Workbench']]], + ['quetzalworkbench_4',['QuetzalWorkbench',['../classInitGui_1_1QuetzalWorkbench.html',1,'InitGui']]] +]; diff --git a/html/search/all_14.js b/html/search/all_14.js new file mode 100644 index 0000000..cca1fdf --- /dev/null +++ b/html/search/all_14.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['raiseup_0',['raiseup',['../classCPipe_1_1raiseup.html',1,'CPipe']]], + ['redrawdialog_1',['redrawDialog',['../classpForms_1_1redrawDialog.html',1,'pForms']]], + ['reduct_2',['Reduct',['../classpFeatures_1_1Reduct.html',1,'pFeatures']]], + ['releases_20tag_201_201_200_201_201_200_20a_202025_2001_2017_3',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['releases_20tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_4',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['renaming_20file_5',['Renaming file',['../md_translationz_2README.html#autotoc_md36',1,'']]], + ['resultspreadsheet_6',['ResultSpreadsheet',['../classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet.html',1,'cut_list::resultSpreadsheet']]], + ['reversebeam_7',['reverseBeam',['../classCFrame_1_1reverseBeam.html',1,'CFrame']]], + ['rotatearoundform_8',['rotateAroundForm',['../classfForms_1_1rotateAroundForm.html',1,'fForms']]], + ['rotateworkplane_9',['rotateWorkPlane',['../classCUtils_1_1rotateWorkPlane.html',1,'CUtils']]], + ['rotjoin_10',['rotJoin',['../classCFrame_1_1rotJoin.html',1,'CFrame']]], + ['rotjoinobserver_11',['rotjoinObserver',['../classfObservers_1_1rotjoinObserver.html',1,'fObservers']]], + ['rotwpform_12',['rotWPForm',['../classuForms_1_1rotWPForm.html',1,'uForms']]] +]; diff --git a/html/search/all_15.js b/html/search/all_15.js new file mode 100644 index 0000000..f55076d --- /dev/null +++ b/html/search/all_15.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['script_0',['Using script',['../md_translationz_2README.html#autotoc_md35',1,'']]], + ['selectprofilefromselection_1',['selectProfilefromSelection',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html#a5d76303ae8b470dd3cd1b48be60e36f7',1,'cut_list::cut_list_ui::cutListUI']]], + ['selectsolids_2',['selectSolids',['../classCUtils_1_1selectSolids.html',1,'CUtils']]], + ['sending_20translations_3',['Sending translations',['../md_translationz_2README.html#autotoc_md40',1,'']]], + ['shapezdialog_4',['shapezDialog',['../classanyShapez_1_1shapezDialog.html',1,'anyShapez']]], + ['shell_5',['Shell',['../classpFeatures_1_1Shell.html',1,'pFeatures']]], + ['shiftbeam_6',['shiftBeam',['../classCFrame_1_1shiftBeam.html',1,'CFrame']]], + ['size_7',['size',['../md_cut__list_2README.html#autotoc_md21',1,'Exampl: Without Group Party by Size'],['../md_cut__list_2README.html#autotoc_md23',1,'Example with Nesting & Group Party by Size'],['../md_cut__list_2README.html#autotoc_md20',1,'Example: Group Party by Size'],['../md_cut__list_2README.html#autotoc_md19',1,'Group Parts by Size'],['../classfFeatures_1_1__ProfileAngle.html#ab318923363c1e16f3efcf8f1a9ec0aad',1,'fFeatures._ProfileAngle.size']]], + ['spinsect_8',['spinSect',['../classCFrame_1_1spinSect.html',1,'CFrame']]], + ['standard_9',['standard',['../classfFeatures_1_1__ProfileAngle.html#a687de95ca467262581b2c6280d436cb0',1,'fFeatures::_ProfileAngle']]], + ['stretchbeam_10',['stretchBeam',['../classCFrame_1_1stretchBeam.html',1,'CFrame']]], + ['stretchbeamobserver_11',['stretchBeamObserver',['../classfObservers_1_1stretchBeamObserver.html',1,'fObservers']]], + ['stretchform_12',['stretchForm',['../classfForms_1_1stretchForm.html',1,'fForms']]] +]; diff --git a/html/search/all_16.js b/html/search/all_16.js new file mode 100644 index 0000000..5760a72 --- /dev/null +++ b/html/search/all_16.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['tag_201_201_200_201_201_200_20a_202025_2001_2017_0',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_1',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['template_20file_2',['Updating translations template file',['../md_translationz_2README.html#autotoc_md33',1,'']]], + ['testers_3',['Testers',['../md_CONTRIBUTING.html#autotoc_md14',1,'']]], + ['to_20use_20it_4',['How to use it',['../md_cut__list_2README.html#autotoc_md17',1,'']]], + ['translateform_5',['translateForm',['../classfForms_1_1translateForm.html',1,'fForms']]], + ['translating_6',['Translating',['../md_translationz_2README.html#autotoc_md37',1,'']]], + ['translating_20quetzal_20workbench_7',['About translating Quetzal Workbench',['../md_translationz_2README.html',1,'']]], + ['translations_8',['translations',['../md_translationz_2README.html#autotoc_md39',1,'Compiling translations'],['../md_translationz_2README.html#autotoc_md40',1,'Sending translations']]], + ['translations_20template_20file_9',['Updating translations template file',['../md_translationz_2README.html#autotoc_md33',1,'']]], + ['translators_10',['Translators',['../md_CONTRIBUTING.html#autotoc_md11',1,'']]], + ['typos_11',['Finding potential typos',['../md_translationz_2README.html#autotoc_md38',1,'']]] +]; diff --git a/html/search/all_17.js b/html/search/all_17.js new file mode 100644 index 0000000..46accde --- /dev/null +++ b/html/search/all_17.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['ubolt_0',['Ubolt',['../classpFeatures_1_1Ubolt.html',1,'pFeatures']]], + ['update_5fcrowdin_1',['update_crowdin',['../namespaceupdate__crowdin.html',1,'']]], + ['updateprofilelist_2',['UpdateProfileList',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html#a107ff2a17605580a0c1acb6a0e4b86f6',1,'cut_list::cut_list_ui::cutListUI']]], + ['updating_20translations_20template_20file_3',['Updating translations template file',['../md_translationz_2README.html#autotoc_md33',1,'']]], + ['usability_4',['Accessibility / Usability',['../md_CONTRIBUTING.html#autotoc_md13',1,'']]], + ['usage_5',['Usage',['../md_README.html#autotoc_md28',1,'']]], + ['use_20it_6',['How to use it',['../md_cut__list_2README.html#autotoc_md17',1,'']]], + ['use_20nesting_7',['Use Nesting',['../md_cut__list_2README.html#autotoc_md22',1,'']]], + ['usenestingtoggle_8',['useNestingToggle',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html#ad415dca1e3080eac8e4d4ff0e6db4fb9',1,'cut_list::cut_list_ui::cutListUI']]], + ['using_20script_9',['Using script',['../md_translationz_2README.html#autotoc_md35',1,'']]] +]; diff --git a/html/search/all_18.js b/html/search/all_18.js new file mode 100644 index 0000000..4622797 --- /dev/null +++ b/html/search/all_18.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['v1_200_200rc2_201_200_200_20a_202024_2010_2020_0',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['valve_1',['Valve',['../classpFeatures_1_1Valve.html',1,'pFeatures']]], + ['valveqm_2',['valveQM',['../classCPipe_1_1valveQM.html',1,'CPipe']]], + ['viewprovider_3',['ViewProvider',['../classpCmd_1_1ViewProvider.html',1,'pCmd']]], + ['viewproviderframebranch_4',['ViewProviderFrameBranch',['../classfFeatures_1_1ViewProviderFrameBranch.html',1,'fFeatures']]], + ['viewproviderpypebranch_5',['ViewProviderPypeBranch',['../classpFeatures_1_1ViewProviderPypeBranch.html',1,'pFeatures']]], + ['viewproviderpypeline_6',['ViewProviderPypeLine',['../classpFeatures_1_1ViewProviderPypeLine.html',1,'pFeatures']]], + ['vqm_7',['vQM',['../classdodoPM_1_1vQM.html',1,'dodoPM']]] +]; diff --git a/html/search/all_19.js b/html/search/all_19.js new file mode 100644 index 0000000..bf30b93 --- /dev/null +++ b/html/search/all_19.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['with_20nesting_20group_20party_20by_20size_0',['Example with Nesting & Group Party by Size',['../md_cut__list_2README.html#autotoc_md23',1,'']]], + ['without_20group_20party_20by_20size_1',['Exampl: Without Group Party by Size',['../md_cut__list_2README.html#autotoc_md21',1,'']]], + ['workbench_2',['workbench',['../md_translationz_2README.html',1,'About translating Quetzal Workbench'],['../md_cut__list_2README.html',1,'Cut List Creation Command for Dodo Workbench'],['../md_README.html',1,'Quetzal Workbench']]] +]; diff --git a/html/search/all_2.js b/html/search/all_2.js new file mode 100644 index 0000000..08ca283 --- /dev/null +++ b/html/search/all_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['20_0',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['2024_2010_2020_1',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['2025_2001_2017_2',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]] +]; diff --git a/html/search/all_3.js b/html/search/all_3.js new file mode 100644 index 0000000..cedb2e8 --- /dev/null +++ b/html/search/all_3.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_0',['__init__',['../classpForms_1_1insertValveForm.html#a72099d016ad8ee89f31acf6bf75e56d8',1,'pForms.insertValveForm.__init__()'],['../classpForms_1_1insertBranchForm.html#ab4cc7e656f78b13d6023a41c3deede68',1,'pForms.insertBranchForm.__init__()'],['../classpForms_1_1insertPypeLineForm.html#a87dd2d1902eb1801e100d5b3c1050e56',1,'pForms.insertPypeLineForm.__init__()'],['../classpForms_1_1insertCapForm.html#a2decc5ab03afea3d70f921457ba5480b',1,'pForms.insertCapForm.__init__()'],['../classpForms_1_1insertUboltForm.html#ade92944e2f7bb003d7213511d77cbaa6',1,'pForms.insertUboltForm.__init__()'],['../classpForms_1_1insertReductForm.html#a2bb541c78b8e8758c8ad70d5889f8d2d',1,'pForms.insertReductForm.__init__()'],['../classpForms_1_1insertFlangeForm.html#a0b0dd17b1b030910270d142ed920ec82',1,'pForms.insertFlangeForm.__init__()'],['../classpForms_1_1insertElbowForm.html#a030f53cddc4e20fd1568f6e21c8cb5b8',1,'pForms.insertElbowForm.__init__()'],['../classpForms_1_1insertPipeForm.html#ab7d0f7959e7f3972d0c419afb2468679',1,'pForms.insertPipeForm.__init__()'],['../classfFeatures_1_1insertSectForm.html#a867d6d210c5077006ba5241e54506a71',1,'fFeatures.insertSectForm.__init__()'],['../classdodoDialogs_1_1protoPypeForm.html#a076b9bf38ab03cc15a22d7b88e657af6',1,'dodoDialogs.protoPypeForm.__init__()']]], + ['_5fcheck_5fattr_1',['_check_attr',['../classpCmd_1_1ViewProvider.html#abc101512eab14f2182508a4d34b0442c',1,'pCmd::ViewProvider']]], + ['_5fprofileangle_2',['_ProfileAngle',['../classfFeatures_1_1__ProfileAngle.html',1,'fFeatures']]], + ['_5fprofilechannel_3',['_ProfileChannel',['../classfFeatures_1_1__ProfileChannel.html',1,'fFeatures']]], + ['_5fprofilecircle_4',['_ProfileCircle',['../classfFeatures_1_1__ProfileCircle.html',1,'fFeatures']]], + ['_5fprofileh_5',['_ProfileH',['../classfFeatures_1_1__ProfileH.html',1,'fFeatures']]], + ['_5fprofilel_6',['_ProfileL',['../classfFeatures_1_1__ProfileL.html',1,'fFeatures']]], + ['_5fprofileomega_7',['_ProfileOmega',['../classfFeatures_1_1__ProfileOmega.html',1,'fFeatures']]], + ['_5fprofiler_8',['_ProfileR',['../classfFeatures_1_1__ProfileR.html',1,'fFeatures']]], + ['_5fprofilerh_9',['_ProfileRH',['../classfFeatures_1_1__ProfileRH.html',1,'fFeatures']]], + ['_5fprofilet_10',['_ProfileT',['../classfFeatures_1_1__ProfileT.html',1,'fFeatures']]], + ['_5fprofileu_11',['_ProfileU',['../classfFeatures_1_1__ProfileU.html',1,'fFeatures']]], + ['_5fprofilez_12',['_ProfileZ',['../classfFeatures_1_1__ProfileZ.html',1,'fFeatures']]] +]; diff --git a/html/search/all_4.js b/html/search/all_4.js new file mode 100644 index 0000000..0552c4f --- /dev/null +++ b/html/search/all_4.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['a_20href_20https_3a_20github_20com_20edgarjrobles_20dodo_20releases_20tag_201_201_200_201_201_200_20a_202025_2001_2017_0',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['a_20href_20https_3a_20github_20com_20edgarjrobles_20dodo_20releases_20tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_1',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['about_20translating_20quetzal_20workbench_2',['About translating Quetzal Workbench',['../md_translationz_2README.html',1,'']]], + ['accept_3',['accept',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html#aa4929512de2dead801c0b72fd199627c',1,'cut_list::cut_list_ui::cutListUI']]], + ['accessibility_20usability_4',['Accessibility / Usability',['../md_CONTRIBUTING.html#autotoc_md13',1,'']]], + ['addcut_5',['addCut',['../classcut__list_1_1cut__list__creation_1_1Beam.html#aaf0feb03e13eeb9ff5490455ef720016',1,'cut_list::cut_list_creation::Beam']]], + ['added_6',['added',['../md_CHANGELOG.html#autotoc_md6',1,'Added'],['../md_CHANGELOG.html#autotoc_md2',1,'Added']]], + ['adjustangleobserver_7',['adjustAngleObserver',['../classfObservers_1_1adjustAngleObserver.html',1,'fObservers']]], + ['adjustframeangle_8',['adjustFrameAngle',['../classCFrame_1_1adjustFrameAngle.html',1,'CFrame']]], + ['alignedge_9',['alignEdge',['../classCFrame_1_1alignEdge.html',1,'CFrame']]], + ['alignedgeobserver_10',['alignEdgeObserver',['../classfObservers_1_1alignEdgeObserver.html',1,'fObservers']]], + ['alignflange_11',['alignFlange',['../classCFrame_1_1alignFlange.html',1,'CFrame']]], + ['alignflangeobserver_12',['alignFlangeObserver',['../classfObservers_1_1alignFlangeObserver.html',1,'fObservers']]], + ['alignform_13',['alignForm',['../classfForms_1_1alignForm.html',1,'fForms']]], + ['anything_14',['AnyThing',['../classanyShapez_1_1AnyThing.html',1,'anyShapez']]], + ['applytranslations_15',['applyTranslations',['../namespaceupdate__crowdin.html#aebdda0315d496cb63f53d9db40a10a28',1,'update_crowdin']]], + ['arrow_16',['arrow',['../classuCmd_1_1arrow.html',1,'uCmd']]], + ['arrow_5finsert_17',['arrow_insert',['../classpObservers_1_1arrow__insert.html',1,'pObservers']]], + ['arrow_5fmove_18',['arrow_move',['../classuCmd_1_1arrow__move.html',1,'uCmd']]], + ['attach2tube_19',['attach2tube',['../classCPipe_1_1attach2tube.html',1,'CPipe']]], + ['automatic_20installation_20',['Automatic Installation',['../md_README.html#autotoc_md26',1,'']]] +]; diff --git a/html/search/all_5.js b/html/search/all_5.js new file mode 100644 index 0000000..8fe8d21 --- /dev/null +++ b/html/search/all_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['beam_0',['Beam',['../classcut__list_1_1cut__list__creation_1_1Beam.html',1,'cut_list::cut_list_creation']]], + ['breakform_1',['breakForm',['../classpForms_1_1breakForm.html',1,'pForms']]], + ['breakpipe_2',['breakPipe',['../classCPipe_1_1breakPipe.html',1,'CPipe']]], + ['by_20size_3',['by size',['../md_cut__list_2README.html#autotoc_md21',1,'Exampl: Without Group Party by Size'],['../md_cut__list_2README.html#autotoc_md23',1,'Example with Nesting & Group Party by Size'],['../md_cut__list_2README.html#autotoc_md20',1,'Example: Group Party by Size'],['../md_cut__list_2README.html#autotoc_md19',1,'Group Parts by Size']]] +]; diff --git a/html/search/all_6.js b/html/search/all_6.js new file mode 100644 index 0000000..8c61c46 --- /dev/null +++ b/html/search/all_6.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['cap_0',['Cap',['../classpFeatures_1_1Cap.html',1,'pFeatures']]], + ['capqm_1',['capQM',['../classCPipe_1_1capQM.html',1,'CPipe']]], + ['changed_2',['changed',['../md_CHANGELOG.html#autotoc_md7',1,'Changed'],['../md_CHANGELOG.html#autotoc_md3',1,'Changed']]], + ['changelog_3',['changelog',['../md_README.html#autotoc_md29',1,'Changelog'],['../md_CHANGELOG.html',1,'Changelog']]], + ['com_20edgarjrobles_20dodo_20releases_20tag_201_201_200_201_201_200_20a_202025_2001_2017_4',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['com_20edgarjrobles_20dodo_20releases_20tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_5',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['command_20for_20dodo_20workbench_6',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]], + ['compiling_20translations_7',['Compiling translations',['../md_translationz_2README.html#autotoc_md39',1,'']]], + ['contributing_8',['contributing',['../md_CONTRIBUTING.html',1,'Contributing'],['../md_README.html#autotoc_md30',1,'Contributing']]], + ['cqm_9',['cQM',['../classdodoPM_1_1cQM.html',1,'dodoPM']]], + ['creating_20file_20for_20missing_20locale_10',['Creating file for missing locale',['../md_translationz_2README.html#autotoc_md34',1,'']]], + ['creation_20command_20for_20dodo_20workbench_11',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]], + ['crowdinupdater_12',['CrowdinUpdater',['../classupdate__crowdin_1_1CrowdinUpdater.html',1,'update_crowdin']]], + ['cut_13',['Cut',['../classcut__list_1_1cut__list__creation_1_1Cut.html',1,'cut_list::cut_list_creation']]], + ['cut_20list_20creation_20command_20for_20dodo_20workbench_14',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]], + ['cutlistcommand_15',['cutListCommand',['../classcut__list_1_1cut__list__commands_1_1cutListCommand.html',1,'cut_list::cut_list_commands']]], + ['cutlistui_16',['cutListUI',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html',1,'cut_list::cut_list_ui']]] +]; diff --git a/html/search/all_7.js b/html/search/all_7.js new file mode 100644 index 0000000..494da9e --- /dev/null +++ b/html/search/all_7.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['designers_0',['Designers',['../md_CONTRIBUTING.html#autotoc_md12',1,'']]], + ['developers_1',['Developers',['../md_CONTRIBUTING.html#autotoc_md15',1,'']]], + ['dialogqm_2',['DialogQM',['../classdodoPM_1_1DialogQM.html',1,'dodoPM']]], + ['dodo_20releases_20tag_201_201_200_201_201_200_20a_202025_2001_2017_3',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['dodo_20releases_20tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_4',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['dodo_20workbench_5',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]], + ['dpcalc_6',['dpCalc',['../classCUtils_1_1dpCalc.html',1,'CUtils']]], + ['dpcalcdialog_7',['dpCalcDialog',['../classuForms_1_1dpCalcDialog.html',1,'uForms']]] +]; diff --git a/html/search/all_8.js b/html/search/all_8.js new file mode 100644 index 0000000..982036e --- /dev/null +++ b/html/search/all_8.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['edgarjrobles_20dodo_20releases_20tag_201_201_200_201_201_200_20a_202025_2001_2017_0',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['edgarjrobles_20dodo_20releases_20tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_1',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['elbow_2',['Elbow',['../classpFeatures_1_1Elbow.html',1,'pFeatures']]], + ['elbowqm_3',['elbowQM',['../classCPipe_1_1elbowQM.html',1,'CPipe']]], + ['eqm_4',['eQM',['../classdodoPM_1_1eQM.html',1,'dodoPM']]], + ['exampl_3a_20without_20group_20party_20by_20size_5',['Exampl: Without Group Party by Size',['../md_cut__list_2README.html#autotoc_md21',1,'']]], + ['example_20with_20nesting_20group_20party_20by_20size_6',['Example with Nesting & Group Party by Size',['../md_cut__list_2README.html#autotoc_md23',1,'']]], + ['example_3a_20group_20party_20by_20size_7',['Example: Group Party by Size',['../md_cut__list_2README.html#autotoc_md20',1,'']]], + ['execute_8',['execute',['../classfFeatures_1_1__ProfileAngle.html#ab126427b12fc9f5d1bad3f2a458e0cd7',1,'fFeatures._ProfileAngle.execute()'],['../classpFeatures_1_1Flange.html#a87d165068c035993e5539e41ff8bdc47',1,'pFeatures.Flange.execute()']]], + ['extend_9',['extend',['../classCFrame_1_1extend.html',1,'CFrame']]], + ['extend1intersection_10',['extend1intersection',['../classCPipe_1_1extend1intersection.html',1,'CPipe']]], + ['extend2intersection_11',['extend2intersection',['../classCPipe_1_1extend2intersection.html',1,'CPipe']]], + ['extendform_12',['extendForm',['../classfForms_1_1extendForm.html',1,'fForms']]], + ['extendobserver_13',['extendObserver',['../classfObservers_1_1extendObserver.html',1,'fObservers']]] +]; diff --git a/html/search/all_9.js b/html/search/all_9.js new file mode 100644 index 0000000..ceecedd --- /dev/null +++ b/html/search/all_9.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['file_0',['file',['../md_translationz_2README.html#autotoc_md36',1,'Renaming file'],['../md_translationz_2README.html#autotoc_md33',1,'Updating translations template file']]], + ['file_20for_20missing_20locale_1',['Creating file for missing locale',['../md_translationz_2README.html#autotoc_md34',1,'']]], + ['fillform_2',['fillForm',['../classfForms_1_1fillForm.html',1,'fForms']]], + ['fillframeobserver_3',['fillFrameObserver',['../classfObservers_1_1fillFrameObserver.html',1,'fObservers']]], + ['fillsizes_4',['fillSizes',['../classfFeatures_1_1frameBranchForm.html#a8886ed18e0e5279df3470229c8aacb4a',1,'fFeatures::frameBranchForm']]], + ['finding_20potential_20typos_5',['Finding potential typos',['../md_translationz_2README.html#autotoc_md38',1,'']]], + ['fixed_6',['fixed',['../md_CHANGELOG.html#autotoc_md4',1,'Fixed'],['../md_CHANGELOG.html#autotoc_md8',1,'Fixed']]], + ['flange_7',['Flange',['../classpFeatures_1_1Flange.html',1,'pFeatures']]], + ['flangeqm_8',['flangeQM',['../classCPipe_1_1flangeQM.html',1,'CPipe']]], + ['flat_9',['flat',['../classCPipe_1_1flat.html',1,'CPipe']]], + ['for_20dodo_20workbench_10',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]], + ['for_20missing_20locale_11',['Creating file for missing locale',['../md_translationz_2README.html#autotoc_md34',1,'']]], + ['fqm_12',['fQM',['../classdodoPM_1_1fQM.html',1,'dodoPM']]], + ['framebranch_13',['FrameBranch',['../classfFeatures_1_1FrameBranch.html',1,'fFeatures']]], + ['framebranchform_14',['frameBranchForm',['../classfFeatures_1_1frameBranchForm.html',1,'fFeatures']]], + ['framebranchmanager_15',['FrameBranchManager',['../classCFrame_1_1FrameBranchManager.html',1,'CFrame']]], + ['frameit_16',['frameIt',['../classCFrame_1_1frameIt.html',1,'CFrame']]], + ['frameitobserver_17',['frameItObserver',['../classfObservers_1_1frameItObserver.html',1,'fObservers']]], + ['frameline_18',['FrameLine',['../classfFeatures_1_1FrameLine.html',1,'fFeatures']]], + ['framelineform_19',['frameLineForm',['../classfFeatures_1_1frameLineForm.html',1,'fFeatures']]], + ['frameobserverprototype_20',['frameObserverPrototype',['../classfObservers_1_1frameObserverPrototype.html',1,'fObservers']]] +]; diff --git a/html/search/all_a.js b/html/search/all_a.js new file mode 100644 index 0000000..4af9530 --- /dev/null +++ b/html/search/all_a.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['g0_0',['g0',['../classfFeatures_1_1__ProfileAngle.html#a51b8634a8f38d909e0a1b4ff11b776ea',1,'fFeatures::_ProfileAngle']]], + ['generatebisectplanes_1',['generateBisectPlanes',['../classfFeatures_1_1frameBranchForm.html#a4b993353571945d910714781bb548567',1,'fFeatures::frameBranchForm']]], + ['getbeamsfromstructurenames_2',['getBeamsFromStructureNames',['../classfFeatures_1_1frameBranchForm.html#ab8498b427c902caf9ef2a3125331b02e',1,'fFeatures::frameBranchForm']]], + ['getcutsasdict_3',['getCutsAsDict',['../classcut__list_1_1cut__list__creation_1_1Beam.html#a258e2eeadf074fefdc931b2077d45e75',1,'cut_list::cut_list_creation::Beam']]], + ['geticon_4',['getIcon',['../classpCmd_1_1ViewProvider.html#a7e7c444066da487cb54fd252b97bd0b3',1,'pCmd::ViewProvider']]], + ['getkey_5',['getKey',['../classcut__list_1_1cut__list__creation_1_1Cut.html#a74759e701e0da7a3c6552c4934fcbdb3',1,'cut_list::cut_list_creation::Cut']]], + ['getmiterplanesfaces_6',['getMiterPlanesFaces',['../classfFeatures_1_1frameBranchForm.html#aaa31162488405a34db7bfa21e5de15d2',1,'fFeatures::frameBranchForm']]], + ['getpropsfromlistsizes_7',['getPropsfromlistSizes',['../classfFeatures_1_1frameBranchForm.html#a40d75694e302ef2e2479546b62d0c316',1,'fFeatures::frameBranchForm']]], + ['getrow_8',['getRow',['../classcut__list_1_1cut__list__creation_1_1Cut.html#a77dffc3a91061a04aed0f020f399d226',1,'cut_list::cut_list_creation::Cut']]], + ['github_20com_20edgarjrobles_20dodo_20releases_20tag_201_201_200_201_201_200_20a_202025_2001_2017_9',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['github_20com_20edgarjrobles_20dodo_20releases_20tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_10',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['group_20parts_20by_20size_11',['Group Parts by Size',['../md_cut__list_2README.html#autotoc_md19',1,'']]], + ['group_20party_20by_20size_12',['group party by size',['../md_cut__list_2README.html#autotoc_md21',1,'Exampl: Without Group Party by Size'],['../md_cut__list_2README.html#autotoc_md23',1,'Example with Nesting & Group Party by Size'],['../md_cut__list_2README.html#autotoc_md20',1,'Example: Group Party by Size']]] +]; diff --git a/html/search/all_b.js b/html/search/all_b.js new file mode 100644 index 0000000..dbddd47 --- /dev/null +++ b/html/search/all_b.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['hackedl_0',['hackedL',['../classCUtils_1_1hackedL.html',1,'CUtils']]], + ['hackedline_1',['hackedLine',['../classuCmd_1_1hackedLine.html',1,'uCmd']]], + ['handledialog_2',['handleDialog',['../classuCmd_1_1handleDialog.html',1,'uCmd']]], + ['hoverbutton_3',['HoverButton',['../classdodoPM_1_1HoverButton.html',1,'dodoPM']]], + ['how_20to_20use_20it_4',['How to use it',['../md_cut__list_2README.html#autotoc_md17',1,'']]], + ['href_20https_3a_20github_20com_20edgarjrobles_20dodo_20releases_20tag_201_201_200_201_201_200_20a_202025_2001_2017_5',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['href_20https_3a_20github_20com_20edgarjrobles_20dodo_20releases_20tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_6',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]], + ['https_3a_20github_20com_20edgarjrobles_20dodo_20releases_20tag_201_201_200_201_201_200_20a_202025_2001_2017_7',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/1.1.0" >1.1.0</a> - 2025-01-17',['../md_CHANGELOG.html#autotoc_md1',1,'']]], + ['https_3a_20github_20com_20edgarjrobles_20dodo_20releases_20tag_20v1_200_200rc2_201_200_200_20a_202024_2010_2020_8',['<a href="https://github.com/EdgarJRobles/dodo/releases/tag/V1.0.0RC2" >1.0.0</a> - 2024-10-20',['../md_CHANGELOG.html#autotoc_md5',1,'']]] +]; diff --git a/html/search/all_c.js b/html/search/all_c.js new file mode 100644 index 0000000..2439177 --- /dev/null +++ b/html/search/all_c.js @@ -0,0 +1,35 @@ +var searchData= +[ + ['ideas_0',['Ideas',['../md_CONTRIBUTING.html#autotoc_md10',1,'']]], + ['information_1',['More information',['../md_translationz_2README.html#autotoc_md41',1,'']]], + ['initialize_2',['Initialize',['../classInitGui_1_1QuetzalWorkbench.html#a8f73e32fe1e944170697d27bbc4a1969',1,'InitGui::QuetzalWorkbench']]], + ['insertanyz_3',['insertAnyz',['../classCPipe_1_1insertAnyz.html',1,'CPipe']]], + ['insertbranch_4',['insertBranch',['../classCPipe_1_1insertBranch.html',1,'CPipe']]], + ['insertbranchform_5',['insertBranchForm',['../classpForms_1_1insertBranchForm.html',1,'pForms']]], + ['insertcap_6',['insertCap',['../classCPipe_1_1insertCap.html',1,'CPipe']]], + ['insertcapform_7',['insertCapForm',['../classpForms_1_1insertCapForm.html',1,'pForms']]], + ['insertelbow_8',['insertElbow',['../classCPipe_1_1insertElbow.html',1,'CPipe']]], + ['insertelbowform_9',['insertElbowForm',['../classpForms_1_1insertElbowForm.html',1,'pForms']]], + ['insertflange_10',['insertFlange',['../classCPipe_1_1insertFlange.html',1,'CPipe']]], + ['insertflangeform_11',['insertFlangeForm',['../classpForms_1_1insertFlangeForm.html',1,'pForms']]], + ['insertpath_12',['insertPath',['../classCFrame_1_1insertPath.html',1,'CFrame']]], + ['insertpipe_13',['insertPipe',['../classCPipe_1_1insertPipe.html',1,'CPipe']]], + ['insertpipeform_14',['insertPipeForm',['../classpForms_1_1insertPipeForm.html',1,'pForms']]], + ['insertpypeline_15',['insertPypeLine',['../classCPipe_1_1insertPypeLine.html',1,'CPipe']]], + ['insertpypelineform_16',['insertPypeLineForm',['../classpForms_1_1insertPypeLineForm.html',1,'pForms']]], + ['insertreduct_17',['insertReduct',['../classCPipe_1_1insertReduct.html',1,'CPipe']]], + ['insertreductform_18',['insertReductForm',['../classpForms_1_1insertReductForm.html',1,'pForms']]], + ['insertroute_19',['insertRoute',['../classCPipe_1_1insertRoute.html',1,'CPipe']]], + ['insertrouteform_20',['insertRouteForm',['../classpForms_1_1insertRouteForm.html',1,'pForms']]], + ['insertsectform_21',['insertSectForm',['../classfFeatures_1_1insertSectForm.html',1,'fFeatures']]], + ['insertsection_22',['insertSection',['../classCFrame_1_1insertSection.html',1,'CFrame']]], + ['inserttank_23',['insertTank',['../classCPipe_1_1insertTank.html',1,'CPipe']]], + ['inserttankform_24',['insertTankForm',['../classpForms_1_1insertTankForm.html',1,'pForms']]], + ['insertubolt_25',['insertUbolt',['../classCPipe_1_1insertUbolt.html',1,'CPipe']]], + ['insertuboltform_26',['insertUboltForm',['../classpForms_1_1insertUboltForm.html',1,'pForms']]], + ['insertvalve_27',['insertValve',['../classCPipe_1_1insertValve.html',1,'CPipe']]], + ['insertvalveform_28',['insertValveForm',['../classpForms_1_1insertValveForm.html',1,'pForms']]], + ['installation_29',['installation',['../md_README.html#autotoc_md26',1,'Automatic Installation'],['../md_README.html#autotoc_md25',1,'Installation'],['../md_README.html#autotoc_md27',1,'Manual installation']]], + ['isactive_30',['IsActive',['../classcut__list_1_1cut__list__commands_1_1cutListCommand.html#a072094370157b4e4090756ce867fa8e3',1,'cut_list::cut_list_commands::cutListCommand']]], + ['it_31',['How to use it',['../md_cut__list_2README.html#autotoc_md17',1,'']]] +]; diff --git a/html/search/all_d.js b/html/search/all_d.js new file mode 100644 index 0000000..bb82ddc --- /dev/null +++ b/html/search/all_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['joinform_0',['joinForm',['../classpForms_1_1joinForm.html',1,'pForms']]], + ['joinobserver_1',['joinObserver',['../classpObservers_1_1joinObserver.html',1,'pObservers']]], + ['joinpype_2',['joinPype',['../classCPipe_1_1joinPype.html',1,'CPipe']]] +]; diff --git a/html/search/all_e.js b/html/search/all_e.js new file mode 100644 index 0000000..2c2ac53 --- /dev/null +++ b/html/search/all_e.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['label_0',['label',['../classfFeatures_1_1__ProfileAngle.html#a9de38c1eb4fe920e088fc13a66dfdc61',1,'fFeatures::_ProfileAngle']]], + ['label3d_1',['label3D',['../classuCmd_1_1label3D.html',1,'uCmd']]], + ['laydown_2',['laydown',['../classCPipe_1_1laydown.html',1,'CPipe']]], + ['levelbeam_3',['levelBeam',['../classCFrame_1_1levelBeam.html',1,'CFrame']]], + ['levelbeamobserver_4',['levelBeamObserver',['../classfObservers_1_1levelBeamObserver.html',1,'fObservers']]], + ['links_5',['Links',['../md_README.html#autotoc_md31',1,'']]], + ['list_20creation_20command_20for_20dodo_20workbench_6',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]], + ['load_5ftoken_7',['load_token',['../namespaceupdate__crowdin.html#afcfc37b9acdc2c5d63e9348414aa043b',1,'update_crowdin']]], + ['locale_8',['Creating file for missing locale',['../md_translationz_2README.html#autotoc_md34',1,'']]] +]; diff --git a/html/search/all_f.js b/html/search/all_f.js new file mode 100644 index 0000000..1f8e86c --- /dev/null +++ b/html/search/all_f.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['makeheader_0',['makeHeader',['../classCPipe_1_1makeHeader.html',1,'CPipe']]], + ['manual_20installation_1',['Manual installation',['../md_README.html#autotoc_md27',1,'']]], + ['mateedges_2',['mateEdges',['../classCPipe_1_1mateEdges.html',1,'CPipe']]], + ['missing_20locale_3',['Creating file for missing locale',['../md_translationz_2README.html#autotoc_md34',1,'']]], + ['more_20information_4',['More information',['../md_translationz_2README.html#autotoc_md41',1,'']]], + ['movehandle_5',['moveHandle',['../classCUtils_1_1moveHandle.html',1,'CUtils']]], + ['moveworkplane_6',['moveWorkPlane',['../classCUtils_1_1moveWorkPlane.html',1,'CUtils']]], + ['mw_7',['mw',['../classdodoDialogs_1_1protoTypeDialog.html#a42c3bd1ca6890f629a610ceb62fe4b43',1,'dodoDialogs::protoTypeDialog']]] +]; diff --git a/html/search/classes_0.js b/html/search/classes_0.js new file mode 100644 index 0000000..efacb23 --- /dev/null +++ b/html/search/classes_0.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['_5fprofileangle_0',['_ProfileAngle',['../classfFeatures_1_1__ProfileAngle.html',1,'fFeatures']]], + ['_5fprofilechannel_1',['_ProfileChannel',['../classfFeatures_1_1__ProfileChannel.html',1,'fFeatures']]], + ['_5fprofilecircle_2',['_ProfileCircle',['../classfFeatures_1_1__ProfileCircle.html',1,'fFeatures']]], + ['_5fprofileh_3',['_ProfileH',['../classfFeatures_1_1__ProfileH.html',1,'fFeatures']]], + ['_5fprofilel_4',['_ProfileL',['../classfFeatures_1_1__ProfileL.html',1,'fFeatures']]], + ['_5fprofileomega_5',['_ProfileOmega',['../classfFeatures_1_1__ProfileOmega.html',1,'fFeatures']]], + ['_5fprofiler_6',['_ProfileR',['../classfFeatures_1_1__ProfileR.html',1,'fFeatures']]], + ['_5fprofilerh_7',['_ProfileRH',['../classfFeatures_1_1__ProfileRH.html',1,'fFeatures']]], + ['_5fprofilet_8',['_ProfileT',['../classfFeatures_1_1__ProfileT.html',1,'fFeatures']]], + ['_5fprofileu_9',['_ProfileU',['../classfFeatures_1_1__ProfileU.html',1,'fFeatures']]], + ['_5fprofilez_10',['_ProfileZ',['../classfFeatures_1_1__ProfileZ.html',1,'fFeatures']]] +]; diff --git a/html/search/classes_1.js b/html/search/classes_1.js new file mode 100644 index 0000000..e985967 --- /dev/null +++ b/html/search/classes_1.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['adjustangleobserver_0',['adjustAngleObserver',['../classfObservers_1_1adjustAngleObserver.html',1,'fObservers']]], + ['adjustframeangle_1',['adjustFrameAngle',['../classCFrame_1_1adjustFrameAngle.html',1,'CFrame']]], + ['alignedge_2',['alignEdge',['../classCFrame_1_1alignEdge.html',1,'CFrame']]], + ['alignedgeobserver_3',['alignEdgeObserver',['../classfObservers_1_1alignEdgeObserver.html',1,'fObservers']]], + ['alignflange_4',['alignFlange',['../classCFrame_1_1alignFlange.html',1,'CFrame']]], + ['alignflangeobserver_5',['alignFlangeObserver',['../classfObservers_1_1alignFlangeObserver.html',1,'fObservers']]], + ['alignform_6',['alignForm',['../classfForms_1_1alignForm.html',1,'fForms']]], + ['anything_7',['AnyThing',['../classanyShapez_1_1AnyThing.html',1,'anyShapez']]], + ['arrow_8',['arrow',['../classuCmd_1_1arrow.html',1,'uCmd']]], + ['arrow_5finsert_9',['arrow_insert',['../classpObservers_1_1arrow__insert.html',1,'pObservers']]], + ['arrow_5fmove_10',['arrow_move',['../classuCmd_1_1arrow__move.html',1,'uCmd']]], + ['attach2tube_11',['attach2tube',['../classCPipe_1_1attach2tube.html',1,'CPipe']]] +]; diff --git a/html/search/classes_10.js b/html/search/classes_10.js new file mode 100644 index 0000000..b44675c --- /dev/null +++ b/html/search/classes_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['selectsolids_0',['selectSolids',['../classCUtils_1_1selectSolids.html',1,'CUtils']]], + ['shapezdialog_1',['shapezDialog',['../classanyShapez_1_1shapezDialog.html',1,'anyShapez']]], + ['shell_2',['Shell',['../classpFeatures_1_1Shell.html',1,'pFeatures']]], + ['shiftbeam_3',['shiftBeam',['../classCFrame_1_1shiftBeam.html',1,'CFrame']]], + ['spinsect_4',['spinSect',['../classCFrame_1_1spinSect.html',1,'CFrame']]], + ['stretchbeam_5',['stretchBeam',['../classCFrame_1_1stretchBeam.html',1,'CFrame']]], + ['stretchbeamobserver_6',['stretchBeamObserver',['../classfObservers_1_1stretchBeamObserver.html',1,'fObservers']]], + ['stretchform_7',['stretchForm',['../classfForms_1_1stretchForm.html',1,'fForms']]] +]; diff --git a/html/search/classes_11.js b/html/search/classes_11.js new file mode 100644 index 0000000..d3b2619 --- /dev/null +++ b/html/search/classes_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['translateform_0',['translateForm',['../classfForms_1_1translateForm.html',1,'fForms']]] +]; diff --git a/html/search/classes_12.js b/html/search/classes_12.js new file mode 100644 index 0000000..fd2b610 --- /dev/null +++ b/html/search/classes_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ubolt_0',['Ubolt',['../classpFeatures_1_1Ubolt.html',1,'pFeatures']]] +]; diff --git a/html/search/classes_13.js b/html/search/classes_13.js new file mode 100644 index 0000000..6bd5dfc --- /dev/null +++ b/html/search/classes_13.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['valve_0',['Valve',['../classpFeatures_1_1Valve.html',1,'pFeatures']]], + ['valveqm_1',['valveQM',['../classCPipe_1_1valveQM.html',1,'CPipe']]], + ['viewprovider_2',['ViewProvider',['../classpCmd_1_1ViewProvider.html',1,'pCmd']]], + ['viewproviderframebranch_3',['ViewProviderFrameBranch',['../classfFeatures_1_1ViewProviderFrameBranch.html',1,'fFeatures']]], + ['viewproviderpypebranch_4',['ViewProviderPypeBranch',['../classpFeatures_1_1ViewProviderPypeBranch.html',1,'pFeatures']]], + ['viewproviderpypeline_5',['ViewProviderPypeLine',['../classpFeatures_1_1ViewProviderPypeLine.html',1,'pFeatures']]], + ['vqm_6',['vQM',['../classdodoPM_1_1vQM.html',1,'dodoPM']]] +]; diff --git a/html/search/classes_2.js b/html/search/classes_2.js new file mode 100644 index 0000000..933c601 --- /dev/null +++ b/html/search/classes_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['beam_0',['Beam',['../classcut__list_1_1cut__list__creation_1_1Beam.html',1,'cut_list::cut_list_creation']]], + ['breakform_1',['breakForm',['../classpForms_1_1breakForm.html',1,'pForms']]], + ['breakpipe_2',['breakPipe',['../classCPipe_1_1breakPipe.html',1,'CPipe']]] +]; diff --git a/html/search/classes_3.js b/html/search/classes_3.js new file mode 100644 index 0000000..2227c93 --- /dev/null +++ b/html/search/classes_3.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['cap_0',['Cap',['../classpFeatures_1_1Cap.html',1,'pFeatures']]], + ['capqm_1',['capQM',['../classCPipe_1_1capQM.html',1,'CPipe']]], + ['cqm_2',['cQM',['../classdodoPM_1_1cQM.html',1,'dodoPM']]], + ['crowdinupdater_3',['CrowdinUpdater',['../classupdate__crowdin_1_1CrowdinUpdater.html',1,'update_crowdin']]], + ['cut_4',['Cut',['../classcut__list_1_1cut__list__creation_1_1Cut.html',1,'cut_list::cut_list_creation']]], + ['cutlistcommand_5',['cutListCommand',['../classcut__list_1_1cut__list__commands_1_1cutListCommand.html',1,'cut_list::cut_list_commands']]], + ['cutlistui_6',['cutListUI',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html',1,'cut_list::cut_list_ui']]] +]; diff --git a/html/search/classes_4.js b/html/search/classes_4.js new file mode 100644 index 0000000..b68a29a --- /dev/null +++ b/html/search/classes_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['dialogqm_0',['DialogQM',['../classdodoPM_1_1DialogQM.html',1,'dodoPM']]], + ['dpcalc_1',['dpCalc',['../classCUtils_1_1dpCalc.html',1,'CUtils']]], + ['dpcalcdialog_2',['dpCalcDialog',['../classuForms_1_1dpCalcDialog.html',1,'uForms']]] +]; diff --git a/html/search/classes_5.js b/html/search/classes_5.js new file mode 100644 index 0000000..254fdf9 --- /dev/null +++ b/html/search/classes_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['elbow_0',['Elbow',['../classpFeatures_1_1Elbow.html',1,'pFeatures']]], + ['elbowqm_1',['elbowQM',['../classCPipe_1_1elbowQM.html',1,'CPipe']]], + ['eqm_2',['eQM',['../classdodoPM_1_1eQM.html',1,'dodoPM']]], + ['extend_3',['extend',['../classCFrame_1_1extend.html',1,'CFrame']]], + ['extend1intersection_4',['extend1intersection',['../classCPipe_1_1extend1intersection.html',1,'CPipe']]], + ['extend2intersection_5',['extend2intersection',['../classCPipe_1_1extend2intersection.html',1,'CPipe']]], + ['extendform_6',['extendForm',['../classfForms_1_1extendForm.html',1,'fForms']]], + ['extendobserver_7',['extendObserver',['../classfObservers_1_1extendObserver.html',1,'fObservers']]] +]; diff --git a/html/search/classes_6.js b/html/search/classes_6.js new file mode 100644 index 0000000..e47c4b4 --- /dev/null +++ b/html/search/classes_6.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['fillform_0',['fillForm',['../classfForms_1_1fillForm.html',1,'fForms']]], + ['fillframeobserver_1',['fillFrameObserver',['../classfObservers_1_1fillFrameObserver.html',1,'fObservers']]], + ['flange_2',['Flange',['../classpFeatures_1_1Flange.html',1,'pFeatures']]], + ['flangeqm_3',['flangeQM',['../classCPipe_1_1flangeQM.html',1,'CPipe']]], + ['flat_4',['flat',['../classCPipe_1_1flat.html',1,'CPipe']]], + ['fqm_5',['fQM',['../classdodoPM_1_1fQM.html',1,'dodoPM']]], + ['framebranch_6',['FrameBranch',['../classfFeatures_1_1FrameBranch.html',1,'fFeatures']]], + ['framebranchform_7',['frameBranchForm',['../classfFeatures_1_1frameBranchForm.html',1,'fFeatures']]], + ['framebranchmanager_8',['FrameBranchManager',['../classCFrame_1_1FrameBranchManager.html',1,'CFrame']]], + ['frameit_9',['frameIt',['../classCFrame_1_1frameIt.html',1,'CFrame']]], + ['frameitobserver_10',['frameItObserver',['../classfObservers_1_1frameItObserver.html',1,'fObservers']]], + ['frameline_11',['FrameLine',['../classfFeatures_1_1FrameLine.html',1,'fFeatures']]], + ['framelineform_12',['frameLineForm',['../classfFeatures_1_1frameLineForm.html',1,'fFeatures']]], + ['frameobserverprototype_13',['frameObserverPrototype',['../classfObservers_1_1frameObserverPrototype.html',1,'fObservers']]] +]; diff --git a/html/search/classes_7.js b/html/search/classes_7.js new file mode 100644 index 0000000..7eca08b --- /dev/null +++ b/html/search/classes_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['hackedl_0',['hackedL',['../classCUtils_1_1hackedL.html',1,'CUtils']]], + ['hackedline_1',['hackedLine',['../classuCmd_1_1hackedLine.html',1,'uCmd']]], + ['handledialog_2',['handleDialog',['../classuCmd_1_1handleDialog.html',1,'uCmd']]], + ['hoverbutton_3',['HoverButton',['../classdodoPM_1_1HoverButton.html',1,'dodoPM']]] +]; diff --git a/html/search/classes_8.js b/html/search/classes_8.js new file mode 100644 index 0000000..3eb98bc --- /dev/null +++ b/html/search/classes_8.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['insertanyz_0',['insertAnyz',['../classCPipe_1_1insertAnyz.html',1,'CPipe']]], + ['insertbranch_1',['insertBranch',['../classCPipe_1_1insertBranch.html',1,'CPipe']]], + ['insertbranchform_2',['insertBranchForm',['../classpForms_1_1insertBranchForm.html',1,'pForms']]], + ['insertcap_3',['insertCap',['../classCPipe_1_1insertCap.html',1,'CPipe']]], + ['insertcapform_4',['insertCapForm',['../classpForms_1_1insertCapForm.html',1,'pForms']]], + ['insertelbow_5',['insertElbow',['../classCPipe_1_1insertElbow.html',1,'CPipe']]], + ['insertelbowform_6',['insertElbowForm',['../classpForms_1_1insertElbowForm.html',1,'pForms']]], + ['insertflange_7',['insertFlange',['../classCPipe_1_1insertFlange.html',1,'CPipe']]], + ['insertflangeform_8',['insertFlangeForm',['../classpForms_1_1insertFlangeForm.html',1,'pForms']]], + ['insertpath_9',['insertPath',['../classCFrame_1_1insertPath.html',1,'CFrame']]], + ['insertpipe_10',['insertPipe',['../classCPipe_1_1insertPipe.html',1,'CPipe']]], + ['insertpipeform_11',['insertPipeForm',['../classpForms_1_1insertPipeForm.html',1,'pForms']]], + ['insertpypeline_12',['insertPypeLine',['../classCPipe_1_1insertPypeLine.html',1,'CPipe']]], + ['insertpypelineform_13',['insertPypeLineForm',['../classpForms_1_1insertPypeLineForm.html',1,'pForms']]], + ['insertreduct_14',['insertReduct',['../classCPipe_1_1insertReduct.html',1,'CPipe']]], + ['insertreductform_15',['insertReductForm',['../classpForms_1_1insertReductForm.html',1,'pForms']]], + ['insertroute_16',['insertRoute',['../classCPipe_1_1insertRoute.html',1,'CPipe']]], + ['insertrouteform_17',['insertRouteForm',['../classpForms_1_1insertRouteForm.html',1,'pForms']]], + ['insertsectform_18',['insertSectForm',['../classfFeatures_1_1insertSectForm.html',1,'fFeatures']]], + ['insertsection_19',['insertSection',['../classCFrame_1_1insertSection.html',1,'CFrame']]], + ['inserttank_20',['insertTank',['../classCPipe_1_1insertTank.html',1,'CPipe']]], + ['inserttankform_21',['insertTankForm',['../classpForms_1_1insertTankForm.html',1,'pForms']]], + ['insertubolt_22',['insertUbolt',['../classCPipe_1_1insertUbolt.html',1,'CPipe']]], + ['insertuboltform_23',['insertUboltForm',['../classpForms_1_1insertUboltForm.html',1,'pForms']]], + ['insertvalve_24',['insertValve',['../classCPipe_1_1insertValve.html',1,'CPipe']]], + ['insertvalveform_25',['insertValveForm',['../classpForms_1_1insertValveForm.html',1,'pForms']]] +]; diff --git a/html/search/classes_9.js b/html/search/classes_9.js new file mode 100644 index 0000000..bb82ddc --- /dev/null +++ b/html/search/classes_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['joinform_0',['joinForm',['../classpForms_1_1joinForm.html',1,'pForms']]], + ['joinobserver_1',['joinObserver',['../classpObservers_1_1joinObserver.html',1,'pObservers']]], + ['joinpype_2',['joinPype',['../classCPipe_1_1joinPype.html',1,'CPipe']]] +]; diff --git a/html/search/classes_a.js b/html/search/classes_a.js new file mode 100644 index 0000000..ce38502 --- /dev/null +++ b/html/search/classes_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['label3d_0',['label3D',['../classuCmd_1_1label3D.html',1,'uCmd']]], + ['laydown_1',['laydown',['../classCPipe_1_1laydown.html',1,'CPipe']]], + ['levelbeam_2',['levelBeam',['../classCFrame_1_1levelBeam.html',1,'CFrame']]], + ['levelbeamobserver_3',['levelBeamObserver',['../classfObservers_1_1levelBeamObserver.html',1,'fObservers']]] +]; diff --git a/html/search/classes_b.js b/html/search/classes_b.js new file mode 100644 index 0000000..798b749 --- /dev/null +++ b/html/search/classes_b.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['makeheader_0',['makeHeader',['../classCPipe_1_1makeHeader.html',1,'CPipe']]], + ['mateedges_1',['mateEdges',['../classCPipe_1_1mateEdges.html',1,'CPipe']]], + ['movehandle_2',['moveHandle',['../classCUtils_1_1moveHandle.html',1,'CUtils']]], + ['moveworkplane_3',['moveWorkPlane',['../classCUtils_1_1moveWorkPlane.html',1,'CUtils']]] +]; diff --git a/html/search/classes_c.js b/html/search/classes_c.js new file mode 100644 index 0000000..2ce3fc5 --- /dev/null +++ b/html/search/classes_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['offsetworkplane_0',['offsetWorkPlane',['../classCUtils_1_1offsetWorkPlane.html',1,'CUtils']]] +]; diff --git a/html/search/classes_d.js b/html/search/classes_d.js new file mode 100644 index 0000000..35a4cd3 --- /dev/null +++ b/html/search/classes_d.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['piemenu_0',['PieMenu',['../classdodoPM_1_1PieMenu.html',1,'dodoPM']]], + ['pipe_1',['Pipe',['../classpFeatures_1_1Pipe.html',1,'pFeatures']]], + ['pipeqm_2',['pipeQM',['../classCPipe_1_1pipeQM.html',1,'CPipe']]], + ['pivotbeam_3',['pivotBeam',['../classCFrame_1_1pivotBeam.html',1,'CFrame']]], + ['point2point_4',['point2point',['../classCPipe_1_1point2point.html',1,'CPipe']]], + ['point2pointpipe_5',['point2pointPipe',['../classpForms_1_1point2pointPipe.html',1,'pForms']]], + ['pqm_6',['pQM',['../classdodoPM_1_1pQM.html',1,'dodoPM']]], + ['profedit_7',['profEdit',['../classfForms_1_1profEdit.html',1,'fForms']]], + ['protopypeform_8',['protoPypeForm',['../classdodoDialogs_1_1protoPypeForm.html',1,'dodoDialogs']]], + ['prototypedialog_9',['protoTypeDialog',['../classdodoDialogs_1_1protoTypeDialog.html',1,'dodoDialogs']]], + ['pypebranch2_10',['PypeBranch2',['../classpFeatures_1_1PypeBranch2.html',1,'pFeatures']]], + ['pypeline2_11',['PypeLine2',['../classpFeatures_1_1PypeLine2.html',1,'pFeatures']]], + ['pypetype_12',['pypeType',['../classpFeatures_1_1pypeType.html',1,'pFeatures']]] +]; diff --git a/html/search/classes_e.js b/html/search/classes_e.js new file mode 100644 index 0000000..d5a2486 --- /dev/null +++ b/html/search/classes_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['qkmenu_0',['QkMenu',['../classdodoPM_1_1QkMenu.html',1,'dodoPM']]], + ['queryform_1',['QueryForm',['../classuForms_1_1QueryForm.html',1,'uForms']]], + ['querymodel_2',['queryModel',['../classCUtils_1_1queryModel.html',1,'CUtils']]], + ['quetzalworkbench_3',['QuetzalWorkbench',['../classInitGui_1_1QuetzalWorkbench.html',1,'InitGui']]] +]; diff --git a/html/search/classes_f.js b/html/search/classes_f.js new file mode 100644 index 0000000..dadf440 --- /dev/null +++ b/html/search/classes_f.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['raiseup_0',['raiseup',['../classCPipe_1_1raiseup.html',1,'CPipe']]], + ['redrawdialog_1',['redrawDialog',['../classpForms_1_1redrawDialog.html',1,'pForms']]], + ['reduct_2',['Reduct',['../classpFeatures_1_1Reduct.html',1,'pFeatures']]], + ['resultspreadsheet_3',['ResultSpreadsheet',['../classcut__list_1_1resultSpreadsheet_1_1ResultSpreadsheet.html',1,'cut_list::resultSpreadsheet']]], + ['reversebeam_4',['reverseBeam',['../classCFrame_1_1reverseBeam.html',1,'CFrame']]], + ['rotatearoundform_5',['rotateAroundForm',['../classfForms_1_1rotateAroundForm.html',1,'fForms']]], + ['rotateworkplane_6',['rotateWorkPlane',['../classCUtils_1_1rotateWorkPlane.html',1,'CUtils']]], + ['rotjoin_7',['rotJoin',['../classCFrame_1_1rotJoin.html',1,'CFrame']]], + ['rotjoinobserver_8',['rotjoinObserver',['../classfObservers_1_1rotjoinObserver.html',1,'fObservers']]], + ['rotwpform_9',['rotWPForm',['../classuForms_1_1rotWPForm.html',1,'uForms']]] +]; diff --git a/html/search/close.svg b/html/search/close.svg new file mode 100644 index 0000000..337d6cc --- /dev/null +++ b/html/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/html/search/functions_0.js b/html/search/functions_0.js new file mode 100644 index 0000000..ebf085a --- /dev/null +++ b/html/search/functions_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_0',['__init__',['../classdodoDialogs_1_1protoPypeForm.html#a076b9bf38ab03cc15a22d7b88e657af6',1,'dodoDialogs.protoPypeForm.__init__()'],['../classfFeatures_1_1insertSectForm.html#a867d6d210c5077006ba5241e54506a71',1,'fFeatures.insertSectForm.__init__()'],['../classpForms_1_1insertPipeForm.html#ab7d0f7959e7f3972d0c419afb2468679',1,'pForms.insertPipeForm.__init__()'],['../classpForms_1_1insertElbowForm.html#a030f53cddc4e20fd1568f6e21c8cb5b8',1,'pForms.insertElbowForm.__init__()'],['../classpForms_1_1insertFlangeForm.html#a0b0dd17b1b030910270d142ed920ec82',1,'pForms.insertFlangeForm.__init__()'],['../classpForms_1_1insertReductForm.html#a2bb541c78b8e8758c8ad70d5889f8d2d',1,'pForms.insertReductForm.__init__()'],['../classpForms_1_1insertUboltForm.html#ade92944e2f7bb003d7213511d77cbaa6',1,'pForms.insertUboltForm.__init__()'],['../classpForms_1_1insertCapForm.html#a2decc5ab03afea3d70f921457ba5480b',1,'pForms.insertCapForm.__init__()'],['../classpForms_1_1insertPypeLineForm.html#a87dd2d1902eb1801e100d5b3c1050e56',1,'pForms.insertPypeLineForm.__init__()'],['../classpForms_1_1insertBranchForm.html#ab4cc7e656f78b13d6023a41c3deede68',1,'pForms.insertBranchForm.__init__()'],['../classpForms_1_1insertValveForm.html#a72099d016ad8ee89f31acf6bf75e56d8',1,'pForms.insertValveForm.__init__()']]], + ['_5fcheck_5fattr_1',['_check_attr',['../classpCmd_1_1ViewProvider.html#abc101512eab14f2182508a4d34b0442c',1,'pCmd::ViewProvider']]] +]; diff --git a/html/search/functions_1.js b/html/search/functions_1.js new file mode 100644 index 0000000..c525366 --- /dev/null +++ b/html/search/functions_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['accept_0',['accept',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html#aa4929512de2dead801c0b72fd199627c',1,'cut_list::cut_list_ui::cutListUI']]], + ['addcut_1',['addCut',['../classcut__list_1_1cut__list__creation_1_1Beam.html#aaf0feb03e13eeb9ff5490455ef720016',1,'cut_list::cut_list_creation::Beam']]], + ['applytranslations_2',['applyTranslations',['../namespaceupdate__crowdin.html#aebdda0315d496cb63f53d9db40a10a28',1,'update_crowdin']]] +]; diff --git a/html/search/functions_2.js b/html/search/functions_2.js new file mode 100644 index 0000000..3702a5f --- /dev/null +++ b/html/search/functions_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['execute_0',['execute',['../classfFeatures_1_1__ProfileAngle.html#ab126427b12fc9f5d1bad3f2a458e0cd7',1,'fFeatures._ProfileAngle.execute()'],['../classpFeatures_1_1Flange.html#a87d165068c035993e5539e41ff8bdc47',1,'pFeatures.Flange.execute()']]] +]; diff --git a/html/search/functions_3.js b/html/search/functions_3.js new file mode 100644 index 0000000..c20b742 --- /dev/null +++ b/html/search/functions_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fillsizes_0',['fillSizes',['../classfFeatures_1_1frameBranchForm.html#a8886ed18e0e5279df3470229c8aacb4a',1,'fFeatures::frameBranchForm']]] +]; diff --git a/html/search/functions_4.js b/html/search/functions_4.js new file mode 100644 index 0000000..d94b036 --- /dev/null +++ b/html/search/functions_4.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['generatebisectplanes_0',['generateBisectPlanes',['../classfFeatures_1_1frameBranchForm.html#a4b993353571945d910714781bb548567',1,'fFeatures::frameBranchForm']]], + ['getbeamsfromstructurenames_1',['getBeamsFromStructureNames',['../classfFeatures_1_1frameBranchForm.html#ab8498b427c902caf9ef2a3125331b02e',1,'fFeatures::frameBranchForm']]], + ['getcutsasdict_2',['getCutsAsDict',['../classcut__list_1_1cut__list__creation_1_1Beam.html#a258e2eeadf074fefdc931b2077d45e75',1,'cut_list::cut_list_creation::Beam']]], + ['geticon_3',['getIcon',['../classpCmd_1_1ViewProvider.html#a7e7c444066da487cb54fd252b97bd0b3',1,'pCmd::ViewProvider']]], + ['getkey_4',['getKey',['../classcut__list_1_1cut__list__creation_1_1Cut.html#a74759e701e0da7a3c6552c4934fcbdb3',1,'cut_list::cut_list_creation::Cut']]], + ['getmiterplanesfaces_5',['getMiterPlanesFaces',['../classfFeatures_1_1frameBranchForm.html#aaa31162488405a34db7bfa21e5de15d2',1,'fFeatures::frameBranchForm']]], + ['getpropsfromlistsizes_6',['getPropsfromlistSizes',['../classfFeatures_1_1frameBranchForm.html#a40d75694e302ef2e2479546b62d0c316',1,'fFeatures::frameBranchForm']]], + ['getrow_7',['getRow',['../classcut__list_1_1cut__list__creation_1_1Cut.html#a77dffc3a91061a04aed0f020f399d226',1,'cut_list::cut_list_creation::Cut']]] +]; diff --git a/html/search/functions_5.js b/html/search/functions_5.js new file mode 100644 index 0000000..5794713 --- /dev/null +++ b/html/search/functions_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['initialize_0',['Initialize',['../classInitGui_1_1QuetzalWorkbench.html#a8f73e32fe1e944170697d27bbc4a1969',1,'InitGui::QuetzalWorkbench']]], + ['isactive_1',['IsActive',['../classcut__list_1_1cut__list__commands_1_1cutListCommand.html#a072094370157b4e4090756ce867fa8e3',1,'cut_list::cut_list_commands::cutListCommand']]] +]; diff --git a/html/search/functions_6.js b/html/search/functions_6.js new file mode 100644 index 0000000..7c1e9c7 --- /dev/null +++ b/html/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['load_5ftoken_0',['load_token',['../namespaceupdate__crowdin.html#afcfc37b9acdc2c5d63e9348414aa043b',1,'update_crowdin']]] +]; diff --git a/html/search/functions_7.js b/html/search/functions_7.js new file mode 100644 index 0000000..9289fea --- /dev/null +++ b/html/search/functions_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nearestport_0',['nearestPort',['../classpFeatures_1_1pypeType.html#ad8a792048942d2777c69701eef42ccd7',1,'pFeatures::pypeType']]] +]; diff --git a/html/search/functions_8.js b/html/search/functions_8.js new file mode 100644 index 0000000..5117c2d --- /dev/null +++ b/html/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['selectprofilefromselection_0',['selectProfilefromSelection',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html#a5d76303ae8b470dd3cd1b48be60e36f7',1,'cut_list::cut_list_ui::cutListUI']]] +]; diff --git a/html/search/functions_9.js b/html/search/functions_9.js new file mode 100644 index 0000000..1dec2bb --- /dev/null +++ b/html/search/functions_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['updateprofilelist_0',['UpdateProfileList',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html#a107ff2a17605580a0c1acb6a0e4b86f6',1,'cut_list::cut_list_ui::cutListUI']]], + ['usenestingtoggle_1',['useNestingToggle',['../classcut__list_1_1cut__list__ui_1_1cutListUI.html#ad415dca1e3080eac8e4d4ff0e6db4fb9',1,'cut_list::cut_list_ui::cutListUI']]] +]; diff --git a/html/search/mag.svg b/html/search/mag.svg new file mode 100644 index 0000000..ffb6cf0 --- /dev/null +++ b/html/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/html/search/mag_d.svg b/html/search/mag_d.svg new file mode 100644 index 0000000..4122773 --- /dev/null +++ b/html/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/html/search/mag_sel.svg b/html/search/mag_sel.svg new file mode 100644 index 0000000..553dba8 --- /dev/null +++ b/html/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/html/search/mag_seld.svg b/html/search/mag_seld.svg new file mode 100644 index 0000000..c906f84 --- /dev/null +++ b/html/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/html/search/namespaces_0.js b/html/search/namespaces_0.js new file mode 100644 index 0000000..c7c296e --- /dev/null +++ b/html/search/namespaces_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['update_5fcrowdin_0',['update_crowdin',['../namespaceupdate__crowdin.html',1,'']]] +]; diff --git a/html/search/pages_0.js b/html/search/pages_0.js new file mode 100644 index 0000000..e2f73ca --- /dev/null +++ b/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['about_20translating_20quetzal_20workbench_0',['About translating Quetzal Workbench',['../md_translationz_2README.html',1,'']]] +]; diff --git a/html/search/pages_1.js b/html/search/pages_1.js new file mode 100644 index 0000000..bbb1586 --- /dev/null +++ b/html/search/pages_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['changelog_0',['Changelog',['../md_CHANGELOG.html',1,'']]], + ['command_20for_20dodo_20workbench_1',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]], + ['contributing_2',['Contributing',['../md_CONTRIBUTING.html',1,'']]], + ['creation_20command_20for_20dodo_20workbench_3',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]], + ['cut_20list_20creation_20command_20for_20dodo_20workbench_4',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]] +]; diff --git a/html/search/pages_2.js b/html/search/pages_2.js new file mode 100644 index 0000000..5c4dd94 --- /dev/null +++ b/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['dodo_20workbench_0',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]] +]; diff --git a/html/search/pages_3.js b/html/search/pages_3.js new file mode 100644 index 0000000..d134d35 --- /dev/null +++ b/html/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['for_20dodo_20workbench_0',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]] +]; diff --git a/html/search/pages_4.js b/html/search/pages_4.js new file mode 100644 index 0000000..d888bb0 --- /dev/null +++ b/html/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['list_20creation_20command_20for_20dodo_20workbench_0',['Cut List Creation Command for Dodo Workbench',['../md_cut__list_2README.html',1,'']]] +]; diff --git a/html/search/pages_5.js b/html/search/pages_5.js new file mode 100644 index 0000000..1ab97cf --- /dev/null +++ b/html/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['quetzal_20workbench_0',['quetzal workbench',['../md_translationz_2README.html',1,'About translating Quetzal Workbench'],['../md_README.html',1,'Quetzal Workbench']]] +]; diff --git a/html/search/pages_6.js b/html/search/pages_6.js new file mode 100644 index 0000000..278b398 --- /dev/null +++ b/html/search/pages_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['translating_20quetzal_20workbench_0',['About translating Quetzal Workbench',['../md_translationz_2README.html',1,'']]] +]; diff --git a/html/search/pages_7.js b/html/search/pages_7.js new file mode 100644 index 0000000..3833c9f --- /dev/null +++ b/html/search/pages_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['workbench_0',['workbench',['../md_translationz_2README.html',1,'About translating Quetzal Workbench'],['../md_cut__list_2README.html',1,'Cut List Creation Command for Dodo Workbench'],['../md_README.html',1,'Quetzal Workbench']]] +]; diff --git a/html/search/search.css b/html/search/search.css new file mode 100644 index 0000000..19f76f9 --- /dev/null +++ b/html/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/html/search/search.js b/html/search/search.js new file mode 100644 index 0000000..6fd40c6 --- /dev/null +++ b/html/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/html/splitbard.png b/html/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/html/sync_off.png b/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/html/sync_on.png b/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/html/tab_a.png b/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/html/tab_ad.png b/html/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/html/tab_s.png b/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/html/tab_sd.png b/html/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/html/tabs.css b/html/tabs.css new file mode 100644 index 0000000..df7944b --- /dev/null +++ b/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/package.xml b/package.xml index 9357c53..c1bc0b6 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.1.0 + 1.2.1 2025-01-15 diff --git a/quetzal_config.py b/quetzal_config.py index 3ca0f20..e6fe1e8 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -4,7 +4,7 @@ import FreeCAD import FreeCADGui -__version__ = "1.1.0" +__version__ = "1.2.1" _dir = os.path.dirname(__file__) ICONPATH = os.path.join(_dir, "iconz") diff --git a/tooltips.py b/tooltips.py new file mode 100644 index 0000000..55bc599 --- /dev/null +++ b/tooltips.py @@ -0,0 +1,79 @@ +insert_tube_tooltip = ( + "Create a tube not referenced to a single wire\n" + "______________________________________________________________________________________________________________________________________ \n" + "Usage \n" + "Preselect the following: \n" + " • Choose one o more wire the 3D view by clicking on it. if no wire is Preselect it will create a last lenght done vertical tube \n" + "\n" + "Apply the function: \n" + "A window will pop up order to select first wall pipe thickness standart follow by DN standart\n" + "then press insert button to create tube.\n" + "Apply button:\n" + "It will modify preselected tubes with new choose option selected on window pop up" + "\n" + "Invert button:\n" + "It will modify preselected tubes with new tube orientation rotating 180 degre tube using head tube side as pivot point\n" + "\n" + ) +frameit_tooltip = ( + "Relocate existing & selected beam at Preselected edge\n" + "_____________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "• Choose a existing beam at current document then select a edge target where beam will be relocated" + "Press [ESC] to cancel relocation function" +) +framebranchmanager_tooltip = ( + "Create a framebranch object with beam nest on tree. this object create parametric frames allowing change base sketch, path or wire and adapt to new dimentions\n" + "______________________________________________________________________________________________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "• Choose a existing sketch/path(s) then choose profile to be applied on pop up windows\n" +) +spinsect_tooltip = ( + "Spin beam object(s) selected around the Z axis of its wire/sketch shape by 45 degrees each click\n" + "______________________________________________________________________________________________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "• Select beam object(s) to spin\n" +) +reversebeam_tooltip = ( + "Spin beam object(s) selected around the X axis of its wire/sketch shape by 180 degrees each click\n" + "______________________________________________________________________________________________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "• Select beam object(s) to spin\n" + "Note: - if one edge of the object is selected, that is used\n" + "as the pivot of rotation." +) +shiftbeam_tooltip = ( + "Dialog to translate and copy objects.\n" + "______________________________________________________________________________________________________________________________________ \n" + "• [x/y/z] textboxes: direct input of amount of translation in each direction" + "• [Multiple] textbox: the multiple coefficient of the translation amount.\n" + "• [Steps] textbox: the denominator of the translation amount. It's used when the amount of translation is to be covered in some steps.\n" + "• [move/copy] radiobuttons: to select if the selected objects shall be copied or only translated.\n" + "• [Displacement] button: takes the amount and direction of translation from the distance of selected entities (points, edges, faces).\n" + "• [Vector] button: defines the amount and direction of translation by the orientation and length of the selected edge.\n" + "• [OK] button: execute the translation\n" + "• [Cancel]: exits\n" +) +levelbeam_tooltip = ( + "Tool to flush the parallel faces of two objects.\n" + "_________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "1.- Select fisrt beam face to take as reference\n" + "2.- Select second beam face to translate and match faces coplanar\n" + "Note: - actually the command takes to the same level, respect the position and orientation \n of the first face selected, the center-of-mass of all faces selected. Thus it translates the objects even if the faces are not parallel.\n" +) +pivotbeam_tooltip = ( + "Tool to pivot & copy around one edge or principal X/Y/Z axis\n" + "_________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "1.- Select fisrt beam to modify rotation angle or press 's' key\n" + "2.- Choose a principal axis with x, y , z button or select a edge then press 'assign axis' button \n" + "3.- Press 'x' key to execute rotation\n" + "Note: - actually the command takes to the same level, respect the position and orientation \n of the first face selected, the center-of-mass of all faces selected. Thus it translates the objects even if the faces are not parallel.\n" +) From bbe493dbcd8b4019c4ac0cc3f4fadf0a0a862ec2 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 16 Feb 2025 23:39:31 -0600 Subject: [PATCH 108/135] fix flange visual deviation during creation --- pFeatures.py | 2 +- package.xml | 2 +- quetzal_config.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pFeatures.py b/pFeatures.py index 5931946..a9b2b0a 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -489,7 +489,7 @@ def execute(self, fp): hole.rotate(FreeCAD.Vector(0, 0, 0), FreeCAD.Vector(0, 0, 1), 360.0 / fp.n) # creates flange thickness flange = base.extrude(FreeCAD.Vector(0, 0, fp.t - fp.trf)) - FreeCADGui.ActiveDocument.Flange.Deviation = 0.10 + fp.ViewObject.Deviation = 0.10 if ( fp.FlangeType == "SW" or fp.FlangeType == "WN" diff --git a/package.xml b/package.xml index c1bc0b6..396d0e9 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.2.1 + 1.2.2 2025-01-15 diff --git a/quetzal_config.py b/quetzal_config.py index e6fe1e8..4ad2bd1 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -4,7 +4,7 @@ import FreeCAD import FreeCADGui -__version__ = "1.2.1" +__version__ = "1.2.2" _dir = os.path.dirname(__file__) ICONPATH = os.path.join(_dir, "iconz") From ea79a50e6c20a6f3dfc85204ca6b7455b9a95be2 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 23 Feb 2025 12:46:38 -0600 Subject: [PATCH 109/135] Add Task panel option & snaptoolbar to Quetzal feat: Added quetzal task panel feat: Added draftsnap toolbar in quetzal workbench fix: Class changed from line to wire used to make lines from draft --- InitGui.py | 22 ++++++++++++++++++++++ pForms.py | 13 +++++++++++-- package.xml | 2 +- quetzal_config.py | 2 +- uCmd.py | 1 + 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/InitGui.py b/InitGui.py index 999e56f..59a9617 100644 --- a/InitGui.py +++ b/InitGui.py @@ -138,6 +138,12 @@ def Initialize(self): ] from dodoPM import toolList + import DraftTools + import draftutils.init_tools as it + + it.init_toolbar(self, + QT_TRANSLATE_NOOP("Workbench", "Draft snap"), + it.get_draft_snap_commands()) self.qm = toolList # ["pipeQM","elbowQM","reductQM"] self.appendToolbar(QT_TRANSLATE_NOOP("Workbench", "Pipe tools"), self.pypeList) Log("Loading Pipe tools: done\n") @@ -153,11 +159,27 @@ def ContextMenu(self, recipient): self.appendContextMenu(QT_TRANSLATE_NOOP("Workbench", "Pipes"), self.pypeList) self.appendContextMenu(QT_TRANSLATE_NOOP("Workbench", "Utils"), self.utilsList) + def setWatchers(self): + class QuetzalCreateWatcher: + def __init__(self): + QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP + self.commands = ["Quetzal_InsertPypeLine", + "Quetzal_Point2Point", + "Quetzal_InsertFlange", + "Quetzal_FrameBranchManager", + "Quetzal_FrameIt" + ] + self.title = QT_TRANSLATE_NOOP("Quetzal","Create objects") + def shouldShow(self): + return (FreeCAD.ActiveDocument is not None) + FreeCADGui.Control.addTaskWatcher([QuetzalCreateWatcher()]) + def Activated(self): # if hasattr(FreeCADGui, "draftToolBar"): # patch # FreeCADGui.draftToolBar.Activated() # patch # if hasattr(FreeCADGui, "Snapper"): # patch # FreeCADGui.Snapper.show() # patchm + self.setWatchers() FreeCAD.__activePypeLine__ = None FreeCAD.__activeFrameLine__ = None Msg("Created variables in FreeCAD module:\n") diff --git a/pForms.py b/pForms.py index 4f1bc48..2a85b6a 100644 --- a/pForms.py +++ b/pForms.py @@ -1454,13 +1454,17 @@ def apply(self): from PySide.QtGui import * -class point2pointPipe(DraftTools.Line): +class point2pointPipe(DraftTools.Wire): """ Draw pipes by sequence point. """ def __init__(self, wireFlag=True): - DraftTools.Line.__init__(self, wireFlag) + # view = FreeCADGui.ActiveDocument.ActiveView + # view.setAxisCross(True) + # view.hasAxisCross() + # DraftTools.Line.__init__(self, wireFlag) + DraftTools.Wire.__init__(self) self.Activated() self.pform = insertPipeForm() self.pform.btn1.setText(translate("point2pointPipe", "Reset")) @@ -1516,9 +1520,13 @@ def action(self, arg): # re-defintition of the method of parent if arg["Key"] == "ESCAPE": self.pform.close() self.finish() + return elif arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = DraftTools.getPoint(self, arg) + DraftTools.redraw3DView() + # FreeCAD.Console.PrintMessage(self.point) + return elif arg["Type"] == "SoMouseButtonEvent": FreeCAD.activeDocument().openTransaction(translate("Transaction", "Point to Point")) # mouse button detection @@ -1587,6 +1595,7 @@ def action(self, arg): # re-defintition of the method of parent self.undolast() self.finish(True, cont=True) FreeCAD.activeDocument().commitTransaction() + return class insertTankForm(dodoDialogs.protoTypeDialog): diff --git a/package.xml b/package.xml index 396d0e9..3ae5fba 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.2.2 + 1.3.3 2025-01-15 diff --git a/quetzal_config.py b/quetzal_config.py index 4ad2bd1..8919aa3 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -4,7 +4,7 @@ import FreeCAD import FreeCADGui -__version__ = "1.2.2" +__version__ = "1.3.3" _dir = os.path.dirname(__file__) ICONPATH = os.path.join(_dir, "iconz") diff --git a/uCmd.py b/uCmd.py index b8a58b7..b854ba3 100644 --- a/uCmd.py +++ b/uCmd.py @@ -69,6 +69,7 @@ def setWP(): # TARGET [working]: deal with App::Parts def rotWP(ax=None, ang=45): import FreeCAD import FreeCADGui + newpl = None if not ax: ax = FreeCAD.Vector(0, 0, 1) From 0179a625e0a576145d7a7374b464fb1600bd42cf Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Thu, 17 Apr 2025 22:30:47 -0600 Subject: [PATCH 110/135] fix: translation conflit on Cpipe.py file --- CPipe.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/CPipe.py b/CPipe.py index e14b8cc..8eefc58 100644 --- a/CPipe.py +++ b/CPipe.py @@ -227,8 +227,9 @@ def IsActive(self): def Activated(self): import pCmd - - FreeCAD.activeDocument().openTransaction(translate("Transaction", "Mate")) + #FIXME:translate function does not works + # result=translate("Transaction", "Mate") + FreeCAD.activeDocument().openTransaction() pCmd.alignTheTube() FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() @@ -277,10 +278,9 @@ def IsActive(self): def Activated(self): import pCmd - - FreeCAD.activeDocument().openTransaction( - translate("Transaction", "Extend pipes to intersection") - ) + #FIXME:translate function does not works + # result=translate("Transaction", "Extend pipes to intersection") + FreeCAD.activeDocument().openTransaction() pCmd.extendTheTubes2intersection() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -307,10 +307,9 @@ def IsActive(self): def Activated(self): import pCmd - - FreeCAD.activeDocument().openTransaction( - translate("Transaction", "Extend pipe to intersection") - ) + #FIXME:translate function does not works + # result=translate("Transaction", "Extend pipe to intersection") + FreeCAD.activeDocument().openTransaction() pCmd.extendTheTubes2intersection(both=False) FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -341,7 +340,9 @@ def Activated(self): from Part import Plane refFace = [f for f in fCmd.faces() if isinstance(f.Surface, Plane)][0] - FreeCAD.activeDocument().openTransaction(translate("Transaction", "Lay-down the pipe")) + #FIXME:translate function does not works + # result=translate("Transaction", "Lay-down the pipe") + FreeCAD.activeDocument().openTransaction() for b in fCmd.beams(): if pCmd.isPipe(b): pCmd.laydownTheTube(b, refFace) @@ -377,7 +378,9 @@ def Activated(self): if len(sxFaces) > 0: refFace = sxFaces[0] support = sx.Object - FreeCAD.activeDocument().openTransaction(translate("Transaction", "Raise-up the support")) + #FIXME:translate function does not works + # result=translate("Transaction", "Raise-up the support") + FreeCAD.activeDocument().openTransaction() for b in fCmd.beams(): if pCmd.isPipe(b): pCmd.laydownTheTube(b, refFace, support) @@ -449,8 +452,9 @@ def IsActive(self): def Activated(self): import pCmd - - FreeCAD.activeDocument().openTransaction(translate("Transaction", "Attach to tube")) + #FIXME:translate function does not works + # result=translate("Transaction", "Attach to tube") + FreeCAD.activeDocument().openTransaction() pCmd.attachToTube() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() From bef2aa73ddcf6d67082759debc937cb691be3a01 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 26 Apr 2025 18:45:49 -0600 Subject: [PATCH 111/135] Added terminal adapter objects & some fixes feat(build): add terminal adapter object & EMT, IMT & RMT grade pipe feat(build): add GUI for terminal adapter object selection feat(build): add terminal adapter tooltips feat(build): add terminal adapter iconz feat(build): add makepolygon function fix(build): rating does not assign on each pipe with Quetzal_InsertPipe or Quetzal_Point2Point fix(build): numerical input does not create pipe with Quetzal_Point2Point function --- CPipe.py | 30 +- InitGui.py | 1 + iconz/Quetzal_TerminalAdapter.svg | 177 +++++++++++ pCmd.py | 50 +++- pFeatures.py | 69 ++++- pForms.py | 280 ++++++++++++++---- package.xml | 2 +- pyrightconfig.json | 19 +- tablez/Elbow_ConduitPVCSCH-40.csv | 6 + tablez/Elbow_ConduitPVCSCH-80.csv | 6 + tablez/Pipe_ConduitEMT-LIGHT.csv | 7 + tablez/Pipe_ConduitIMT-MEDIUM.csv | 6 + tablez/Pipe_ConduitPVCSCH-40.csv | 6 + tablez/Pipe_ConduitPVCSCH-80.csv | 6 + tablez/Pipe_ConduitRMT-HEAVY.csv | 6 + ...TerminalAdapter_ConduitPVC0.5in-SCH-40.csv | 6 + tooltips.py | 9 + 17 files changed, 603 insertions(+), 83 deletions(-) create mode 100644 iconz/Quetzal_TerminalAdapter.svg create mode 100644 tablez/Elbow_ConduitPVCSCH-40.csv create mode 100644 tablez/Elbow_ConduitPVCSCH-80.csv create mode 100644 tablez/Pipe_ConduitEMT-LIGHT.csv create mode 100644 tablez/Pipe_ConduitIMT-MEDIUM.csv create mode 100644 tablez/Pipe_ConduitPVCSCH-40.csv create mode 100644 tablez/Pipe_ConduitPVCSCH-80.csv create mode 100644 tablez/Pipe_ConduitRMT-HEAVY.csv create mode 100644 tablez/TerminalAdapter_ConduitPVC0.5in-SCH-40.csv diff --git a/CPipe.py b/CPipe.py index 8eefc58..fef6f71 100644 --- a/CPipe.py +++ b/CPipe.py @@ -69,8 +69,31 @@ def Activated(self): def GetResources(self): return { "Pixmap": "Quetzal_InsertElbow", - "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a curve"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a curve"), + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a elbow"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", tooltips.elbow_tooltip), + } + + +class insertTerminalAdapter: + def IsActive(self): + if FreeCAD.ActiveDocument is None: + return False + else: + return True + + def Activated(self): + # import pCmd + # pCmd.makeTerminalAdapter() + import pForms + TerminalA=pForms.insertTerminalAdapterForm() + TerminalA.show() + # FreeCAD.activeDocument().recompute() + + def GetResources(self): + return { + "Pixmap": "Quetzal_TerminalAdapter", + "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertTerminalAdapter", "Insert Terminal adapter"), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertTerminalAdapter", "Insert Terminal adapter"), } @@ -263,7 +286,7 @@ def GetResources(self): "Pixmap": "Quetzal_Flat", "MenuText": QT_TRANSLATE_NOOP("Quetzal_Flat", "Fit one elbow"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_Flat", "Place the elbow between two pipes or beams" + "Quetzal_Flat", "Place a existing elbow between two pipes adjusting lenght pipes" ), } @@ -617,6 +640,7 @@ def GetResources(self): addCommand("Quetzal_Point2Point", point2point()) addCommand("Quetzal_InsertAnyShape", insertAnyz()) addCommand("Quetzal_MakeHeader", makeHeader()) +addCommand("Quetzal_InsertTerminalAdapter", insertTerminalAdapter()) ### QkMenus ### diff --git a/InitGui.py b/InitGui.py index 59a9617..f746ca2 100644 --- a/InitGui.py +++ b/InitGui.py @@ -115,6 +115,7 @@ def Initialize(self): self.pypeList = [ "Quetzal_InsertPipe", "Quetzal_InsertElbow", + "Quetzal_InsertTerminalAdapter", "Quetzal_InsertReduct", "Quetzal_InsertCap", "Quetzal_InsertValve", diff --git a/iconz/Quetzal_TerminalAdapter.svg b/iconz/Quetzal_TerminalAdapter.svg new file mode 100644 index 0000000..da49fe9 --- /dev/null +++ b/iconz/Quetzal_TerminalAdapter.svg @@ -0,0 +1,177 @@ + + + + + reduction + + + + + + + + + + + + + + + + + + + + hasecilu + + + + + FreeCAD + command + + + Template file to create icons for FreeCAD commands. + 2024 + + + FreeCAD LGPL2+ + + + FreeCAD/src/ + + + FreeCAD + + + https://wiki.freecad.org/Artwork + reduction + + + + + + + + + + + + + + + + diff --git a/pCmd.py b/pCmd.py index d28c558..462892e 100644 --- a/pCmd.py +++ b/pCmd.py @@ -158,15 +158,16 @@ def simpleSurfBend(path=None, profile=None): curva.Shape = Part.makeSweepSurface(path, profile) -def makePipe(propList=[], pos=None, Z=None): +def makePipe(rating,propList=[], pos=None, Z=None): """add a Pipe object - makePipe(propList,pos,Z); + makePipe(rating,propList,pos,Z); propList is one optional list with 4 elements: DN (string): nominal diameter OD (float): outside diameter thk (float): shell thickness H (float): length of pipe Default is "DN50 (SCH-STD)" + rating pipe pressure capability pos (vector): position of insertion; default = 0,0,0 Z (vector): orientation: default = 0,0,1 Remember: property PRating must be defined afterwards @@ -177,9 +178,9 @@ def makePipe(propList=[], pos=None, Z=None): Z = FreeCAD.Vector(0, 0, 1) a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "Tube") if len(propList) == 4: - pFeatures.Pipe(a, *propList) + pFeatures.Pipe(a,rating, *propList) else: - pFeatures.Pipe(a) + pFeatures.Pipe(a,rating) ViewProvider(a.ViewObject, "Quetzal_InsertPipe") a.Placement.Base = pos rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), Z) @@ -188,7 +189,7 @@ def makePipe(propList=[], pos=None, Z=None): return a -def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): +def doPipes(rating,propList=["DN50", 60.3, 3, 1000], pypeline=None): """ propList = [ DN (string): nominal diameter @@ -207,10 +208,10 @@ def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): for v in so.Vertexes ] if len(vs) == 0: # ...no vertexes selected - plist.append(makePipe(propList)) + plist.append(makePipe(rating,propList)) else: # ... one or more vertexes for v in vs: - plist.append(makePipe(propList, v.Point)) + plist.append(makePipe(rating,propList, v.Point)) else: selex = FreeCADGui.Selection.getSelectionEx() for objex in selex: @@ -219,7 +220,7 @@ def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): for face in fCmd.faces(): x = (face.ParameterRange[0] + face.ParameterRange[1]) / 2 y = (face.ParameterRange[2] + face.ParameterRange[3]) / 2 - plist.append(makePipe(propList, face.valueAt(x, y), face.normalAt(x, y))) + plist.append(makePipe(rating,propList, face.valueAt(x, y), face.normalAt(x, y))) FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() else: @@ -227,7 +228,7 @@ def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): if edge.curvatureAt(0) == 0: # ...straight edges pL = propList pL[3] = edge.Length - plist.append(makePipe(pL, edge.valueAt(0), edge.tangentAt(0))) + plist.append(makePipe(rating,pL, edge.valueAt(0), edge.tangentAt(0))) else: # ...curved edges pos = edge.centerOfCurvatureAt(0) Z = edge.tangentAt(0).cross(edge.normalAt(0)) @@ -235,7 +236,7 @@ def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): p0, p1 = [o.Placement.Rotation.multVec(p) for p in o.Ports] if not fCmd.isParallel(Z, p0): Z = p1 - plist.append(makePipe(propList, pos, Z)) + plist.append(makePipe(rating,propList, pos, Z)) if pypeline: for p in plist: moveToPyLi(p, pypeline) @@ -244,6 +245,21 @@ def doPipes(propList=["DN50", 60.3, 3, 1000], pypeline=None): return plist +def makeTerminalAdapter(rating,propList=[],pos=None,Z=None): + """Add TerminalAdapter object + """ + if pos == None: + pos = FreeCAD.Vector(0, 0, 0) + if Z == None: + Z = FreeCAD.Vector(0, 0, 1) + a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", "TerminalAdapter") + pFeatures.TerminalAdapter(a,rating, *propList) + ViewProvider(a.ViewObject, "Quetzal_TerminalAdapter") + a.Placement.Base = pos + rot = FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), -Z) + a.Placement.Rotation = rot.multiply(a.Placement.Rotation) + + def makeElbow(propList=[], pos=None, Z=None): """Adds an Elbow object makeElbow(propList,pos,Z); @@ -1178,6 +1194,7 @@ def breakTheTubes(point, pipes=[], gap=0): if pipes: for pipe in pipes: if point < float(pipe.Height) and gap < (float(pipe.Height) - point): + rating=pipe.PRating propList = [ pipe.PSize, float(pipe.OD), @@ -1187,7 +1204,7 @@ def breakTheTubes(point, pipes=[], gap=0): pipe.Height = point Z = fCmd.beamAx(pipe) pos = pipe.Placement.Base + Z * (float(pipe.Height) + gap) - pipe2nd = makePipe(propList, pos, Z) + pipe2nd = makePipe(rating,propList, pos, Z) pipes2nd.append(pipe2nd) # FreeCAD.activeDocument().recompute() return pipes2nd @@ -1517,3 +1534,14 @@ def flatten(p1=None, p2=None, c=None): FreeCAD.ActiveDocument.commitTransaction() except: FreeCAD.Console.PrintError("Intersection point not found\n") + + +def makeRegularPolygon(n,r): + """ + make a Wire with polygon shape + n : number of sides. + r : circunscrit radius + """ + from math import cos, sin, pi + vecs = [FreeCAD.Vector(cos(2*pi*i/n)*r, sin(2*pi*i/n)*r) for i in range(n+1)] + return Part.makePolygon(vecs) diff --git a/pFeatures.py b/pFeatures.py index a9b2b0a..bf831a9 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -116,13 +116,13 @@ class Pipe(pypeType): thk (float): shell thickness H (float): length of pipe""" - def __init__(self, obj, DN="DN50", OD=60.3, thk=3, H=100): + def __init__(self, obj,rating, DN="DN50", OD=60.3, thk=3, H=100): # initialize the parent class super(Pipe, self).__init__(obj) # define common properties obj.PType = "Pipe" obj.Proxy = self - obj.PRating = "SCH-STD" + obj.PRating = rating obj.PSize = DN # define specific properties obj.addProperty( @@ -197,9 +197,70 @@ def execute(self, fp): super(Pipe, self).execute(fp) # perform common operations +class TerminalAdapter(pypeType): + """Class for objet Ptype="TerminalAdapter" + obj: the "App::FeaturePython" object + PSize (string): nominal diameter + OD (float): outside diameter + L (float): Overall length + SW (float): Support width + """ + def __init__(self,obj,rating,DN="PCV-1/2",OD=21.3,L=33.2,SW=18.7, OD2=21.33): + super(TerminalAdapter,self).__init__(obj) + obj.Proxy = self + obj.PType = "TerminalAdapter" + obj.PRating =rating + obj.PSize = DN + obj.addProperty( + "App::PropertyLength", + "OD", + "TerminalAdapter", + QT_TRANSLATE_NOOP("App::Property", "Outside diameter"), + ).OD = OD + obj.addProperty( + "App::PropertyLength", + "L", + "TerminalAdapter", + QT_TRANSLATE_NOOP("App::Property", "Overall lenght"), + ).L = L + obj.addProperty( + "App::PropertyLength", + "SW", + "TerminalAdapter", + QT_TRANSLATE_NOOP("App::Property", "Support width"), + ).SW = SW + obj.addProperty( + "App::PropertyLength", + "OD2", + "TerminalAdapter", + QT_TRANSLATE_NOOP("App::Property", "Outside thread side"), + ).OD2 = OD2 + self.execute(obj) + def onChanged(self, fp,prop): + pass + def execute(self, fp): + from math import tan + polygonthickness = fp.SW/5 + threadthickness = fp.L-fp.SW + cyl1=Part.makeCylinder(fp.OD/2,fp.SW-polygonthickness,FreeCAD.Vector(0,0,-polygonthickness),FreeCAD.Vector(0,0,-1)) + pwire=pCmd.makeRegularPolygon(6,(fp.OD*1.2)/2) + polygonf=Part.Face(pwire) + extrpoly=polygonf.extrude(FreeCAD.Vector(0,0,-polygonthickness)) + result=cyl1.fuse(extrpoly) + cone2=Part.makeCone(fp.OD2/2,(fp.OD2/2-(tan(0.0312396483)*threadthickness)),threadthickness,FreeCAD.Vector(0,0,-polygonthickness),FreeCAD.Vector(0,0,1),360) + result2=cone2.fuse(result) + filletres=result2.makeFillet(2.5,[result2.Edges[16],result2.Edges[12],result2.Edges[9],result2.Edges[10],result2.Edges[14],result2.Edges[18]]) + cyl2=Part.makeCylinder((fp.OD/3),fp.SW,FreeCAD.Vector(0,0,-polygonthickness),FreeCAD.Vector(0,0,-1)) + cutres=filletres.cut(cyl2) + cone3=Part.makeCone(fp.OD2/2*0.8,(fp.OD2/2-(tan(0.0312396483)*threadthickness))*0.8,threadthickness,FreeCAD.Vector(0,0,-polygonthickness),FreeCAD.Vector(0,0,1),360) + cutres2=cutres.cut(cone3) + fp.Shape = cutres2 + super(TerminalAdapter, self).execute(fp) # perform common operations + + class Elbow(pypeType): """Class for object PType="Elbow" - Elbow(obj,[PSize="DN50",OD=60.3,thk=3,BA=90,BR=45.225]) + Elbow(obj,[PSize="DN50",OD=60.3,thk=3,BA=90,BR=45.225]) obj: the "App::FeaturePython" object PSize (string): nominal diameter OD (float): outside diameter @@ -547,7 +608,7 @@ def execute(self, fp): #!TODO:this method generate a PartDesign object with sketch nest, pending feature compatibility # def execute(self,fp): - # obj=FreeCAD.activeDocument().addObject('PartDesign::Body','Flange') + # obj=FreeCAD.activeDocument().addObject('u','Flange') # sketch=obj.newObject('Sketcher::SketchObject','Sketch') # sketch.AttachmentSupport=(FreeCAD.activeDocument().getObject('YZ_Plane'),['']) # sketch.MapMode='FlatFace' diff --git a/pForms.py b/pForms.py index 2a85b6a..e9e9e18 100644 --- a/pForms.py +++ b/pForms.py @@ -152,7 +152,8 @@ def reverse(self): # revert orientation of selected or last inserted pipe def insert(self): # insert the pipe self.lastPipe = None - d = self.pipeDictList[self.sizeList.currentRow()] + pipe_size_selected = self.pipeDictList[self.sizeList.currentRow()] + rating = self.ratingList.currentItem().text() if self.edit1.text(): self.H = float(self.edit1.text()) self.sli.setValue(100) @@ -178,16 +179,16 @@ def insert(self): # insert the pipe break else: propList = [ - d["PSize"], - float(pq(d["OD"])), - float(pq(d["thk"])), + pipe_size_selected["PSize"], + float(pq(pipe_size_selected["OD"])), + float(pq(pipe_size_selected["thk"])), self.H, ] # props of the dialog break else: - propList = [d["PSize"], float(pq(d["OD"])), float(pq(d["thk"])), self.H] + propList = [pipe_size_selected["PSize"], float(pq(pipe_size_selected["OD"])), float(pq(pipe_size_selected["thk"])), self.H] # INSERT PIPES - self.lastPipe = pCmd.doPipes(propList, FreeCAD.__activePypeLine__)[-1] + self.lastPipe = pCmd.doPipes(rating,propList, FreeCAD.__activePypeLine__)[-1] self.H = float(self.lastPipe.Height) self.edit1.setText(str(float(self.H))) # TODO: SET PRATING @@ -381,6 +382,156 @@ def reverse(self): ) +class insertTerminalAdapterForm(dodoDialogs.protoPypeForm): + """ + Dialog to insert adapter. + For position and orientation you can select + - two pipes parallel (possibly co-linear) + - one pipe at one of its ends + - one pipe + - one circular edge + - one straight edge + - one vertex + - nothing (created at origin) + In case one pipe is selected, its properties are applied to the reduction. + Available one button to reverse the orientation of the last or selected + reductions. + """ + + def __init__(self): + super(insertTerminalAdapterForm, self).__init__( + translate("insertTerminalAdapter", "Insert terminal adapter"), + "TerminalAdapter", + "ConduitPVCSCH-40", + "reduct.svg", + x, + y, + ) + self.sizeList.setCurrentRow(0) + self.ratingList.setCurrentRow(0) + self.ratingList.itemClicked.connect(self.changeRating2) + self.ratingList.setMaximumHeight(50) + self.btn2 = QPushButton(translate("insertReductForm", "Reverse")) + self.secondCol.layout().addWidget(self.btn2) + self.btn3 = QPushButton(translate("insertReductForm", "Apply")) + self.secondCol.layout().addWidget(self.btn3) + self.btn1.clicked.connect(self.insert) + self.btn2.clicked.connect(self.reverse) + self.btn3.clicked.connect(self.applyProp) + self.btn1.setDefault(True) + self.btn1.setFocus() + self.show() + self.lastReduct = None + + def applyProp(self): + r = self.pipeDictList[self.sizeList.currentRow()] + DN = r["PSize"] + OD1 = float(pq(r["OD"])) + OD2 = float(pq(self.OD2list.currentItem().text())) + thk1 = float(pq(r["thk"])) + try: + thk2 = float(pq(r["thk2"].split(">")[self.OD2list.currentRow()])) + except: + thk2 = thk1 + H = pq(r["H"]) + reductions = [ + red + for red in FreeCADGui.Selection.getSelection() + if hasattr(red, "PType") and red.PType == "Reduct" + ] + if len(reductions): + for reduct in reductions: + reduct.PSize = DN + reduct.PRating = self.PRating + reduct.OD = OD1 + reduct.OD2 = OD2 + reduct.thk = thk1 + reduct.thk2 = thk2 + reduct.Height = H + elif self.lastReduct: + self.lastReduct.PSize = DN + self.lastReduct.PRating = self.PRating + self.lastReduct.OD = OD1 + self.lastReduct.OD2 = OD2 + self.lastReduct.thk = thk1 + self.lastReduct.thk2 = thk2 + self.lastReduct.Height = H + FreeCAD.activeDocument().recompute() + + def reverse(self): + selRed = [ + r + for r in FreeCADGui.Selection.getSelection() + if hasattr(r, "PType") and r.PType == "TerminalAdapter" + ] + if len(selRed): + for r in selRed: + pCmd.rotateTheTubeAx(r, FreeCAD.Vector(1, 0, 0), 180) + elif self.lastReduct: + pCmd.rotateTheTubeAx(self.lastReduct, FreeCAD.Vector(1, 0, 0), 180) + + def insert(self): + size = self.pipeDictList[self.sizeList.currentRow()] + rating = self.ratingList.currentItem().text() + # FreeCAD.Console.PrintMessage(rating) + propList=[] + pos = Z = None + selex = FreeCADGui.Selection.getSelectionEx() + pipes = [p.Object for p in selex if hasattr(p.Object, "PType") and p.Object.PType == "Pipe"] + if len(pipes) > 0: # if 1 pipe is selected... + Psize_data = pipes[0].PSize + # OD1 = float(pipes[0].OD) + curves = [e for e in fCmd.edges() if e.curvatureAt(0) > 0] + if len(curves): # ...and 1 curve is selected... + pos = curves[0].centerOfCurvatureAt(0) + else: # ...or no curve is selected... + pos = pipes[0].Placement.Base + Z = pos - pipes[0].Shape.Solids[0].CenterOfMass + # FreeCAD.Console.PrintMessage(Psize_data) + # FreeCAD.Console.PrintMessage(self.sizeList.findItems(Psize_data,Qt.MatchExactly)) + for sub in self.pipeDictList: + if sub["PSize"] == Psize_data: + size2 = sub + propList = [ + Psize_data, + float(pq(size2["OD"])), + float(pq(size2["L"])), + float(pq(size2["SW"])), + float(pq(size2["OD2"])), + ] + else: # if no pipe is selected... + if not propList: + propList = [ + size["PSize"], + float(pq(size["OD"])), + float(pq(size["L"])), + float(pq(size["SW"])), + float(pq(size["OD2"])), + ] + # FreeCAD.Console.PrintMessage(propList) + if fCmd.edges(): # ...but 1 curve is selected... + edge = fCmd.edges()[0] + if edge.curvatureAt(0) > 0: + pos = edge.centerOfCurvatureAt(0) + Z = edge.tangentAt(0).cross(edge.normalAt(0)) + else: + pos = edge.valueAt(0) + Z = edge.tangentAt(0) + elif selex and selex[0].SubObjects[0].ShapeType == "Vertex": # ...or 1 vertex.. + pos = selex[0].SubObjects[0].Point + FreeCAD.activeDocument().openTransaction(translate("Transaction", "Insert reduction")) + self.lastReduct = pCmd.makeTerminalAdapter(rating,propList, pos, Z) + FreeCAD.activeDocument().commitTransaction() + FreeCAD.activeDocument().recompute() + if self.combo.currentText() != "": + pCmd.moveToPyLi(self.lastReduct, self.combo.currentText()) + + def changeRating2(self, item): + self.PRating = item.text() + self.fillSizes() + self.sizeList.setCurrentRow(0) + + class insertFlangeForm(dodoDialogs.protoPypeForm): """ Dialog to insert flanges. @@ -1308,12 +1459,12 @@ def breakPipe(self): pipes=[p], gap=float(self.edit2.text()), ) - if p2nd and self.combo.currentText() != "": + if p2nd and self.combo.currentText() != translate("breakForm",""): for p in p2nd: pCmd.moveToPyLi(p, self.combo.currentText()) else: p2nd = pCmd.breakTheTubes(float(self.edit1.text()), gap=float(self.edit2.text())) - if p2nd and self.combo.currentText() != "": + if p2nd and self.combo.currentText() != translate("breakForm",""): for p in p2nd: pCmd.moveToPyLi(p, self.combo.currentText()) FreeCAD.activeDocument().commitTransaction() @@ -1513,8 +1664,72 @@ def rset(self): self.start = None self.lastPipe = None + def numericInput(self, numx, numy, numz): + """Validate the entry fields in the user interface. + + This function is called by the toolbar or taskpanel interface + when valid x, y, and z have been entered in the input fields. + """ + self.point = FreeCAD.Vector(numx, numy, numz) + self.node.append(self.point) + self.drawSegment(self.point) + self.sequencepiping() + if self.mode == "line" and len(self.node) == 2: + self.finish(cont=None, closed=False) + self.ui.setNextFocus() + + def sequencepiping(self): + if not self.start: + self.start = self.point + else: + if self.lastPipe: + prev = self.lastPipe + else: + prev = None + d = self.pform.pipeDictList[self.pform.sizeList.currentRow()] + rating = self.pform.ratingList.currentItem().text() + v = self.point - self.start + propList = [ + d["PSize"], + float(pq(d["OD"])), + float(pq(d["thk"])), + float(v.Length), + ] + self.lastPipe = pCmd.makePipe(rating,propList, self.start, v) + if self.pform.combo.currentText() != "": + pCmd.moveToPyLi(self.lastPipe, self.pform.combo.currentText()) + self.start = self.point + FreeCAD.ActiveDocument.recompute() + if prev: + c = pCmd.makeElbowBetweenThings( + prev, + self.lastPipe, + [ + d["PSize"], + float(pq(d["OD"])), + float(pq(d["thk"])), + 90, + float(pq(d["OD"]) * 0.75), + ], + ) + if c and self.pform.combo.currentText() != "": + pCmd.moveToPyLi(c, self.pform.combo.currentText()) + FreeCAD.ActiveDocument.recompute() + if self.pform.cb1.isChecked(): + rot = FreeCAD.DraftWorkingPlane.getPlacement().Rotation + normal = rot.multVec(FreeCAD.Vector(0, 0, 1)) + FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.point, normal) + FreeCADGui.Snapper.setGrid() + # if not self.isWire and len(self.node) == 2: + # self.finish(False, cont=True) + if len(self.node) > 2: + if (self.point - self.node[0]).Length < Draft.tolerance(): + self.undolast() + self.finish(True, cont=True) + def action(self, arg): # re-defintition of the method of parent "scene event handler" + # FreeCAD.Console.PrintMessage("Tecla presionada: "+str(arg["Key"])) if arg["Type"] == "SoKeyboardEvent" and arg["State"] == "DOWN": # key detection if arg["Key"] == "ESCAPE": @@ -1524,7 +1739,7 @@ def action(self, arg): # re-defintition of the method of parent elif arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = DraftTools.getPoint(self, arg) - DraftTools.redraw3DView() + # DraftTools.redraw3DView() # FreeCAD.Console.PrintMessage(self.point) return elif arg["Type"] == "SoMouseButtonEvent": @@ -1541,6 +1756,7 @@ def action(self, arg): # re-defintition of the method of parent self.ui.redraw() self.pos = arg["Position"] self.nodes.append(self.point) + self.sequencepiping() # try: # print(arg) # print(self.point) @@ -1548,52 +1764,6 @@ def action(self, arg): # re-defintition of the method of parent # print(info) # except: # pass - if not self.start: - self.start = self.point - else: - if self.lastPipe: - prev = self.lastPipe - else: - prev = None - d = self.pform.pipeDictList[self.pform.sizeList.currentRow()] - v = self.point - self.start - propList = [ - d["PSize"], - float(pq(d["OD"])), - float(pq(d["thk"])), - float(v.Length), - ] - self.lastPipe = pCmd.makePipe(propList, self.start, v) - if self.pform.combo.currentText() != "": - pCmd.moveToPyLi(self.lastPipe, self.pform.combo.currentText()) - self.start = self.point - FreeCAD.ActiveDocument.recompute() - if prev: - c = pCmd.makeElbowBetweenThings( - prev, - self.lastPipe, - [ - d["PSize"], - float(pq(d["OD"])), - float(pq(d["thk"])), - 90, - float(pq(d["OD"]) * 0.75), - ], - ) - if c and self.pform.combo.currentText() != "": - pCmd.moveToPyLi(c, self.pform.combo.currentText()) - FreeCAD.ActiveDocument.recompute() - if self.pform.cb1.isChecked(): - rot = FreeCAD.DraftWorkingPlane.getPlacement().Rotation - normal = rot.multVec(FreeCAD.Vector(0, 0, 1)) - FreeCAD.DraftWorkingPlane.alignToPointAndAxis(self.point, normal) - FreeCADGui.Snapper.setGrid() - if not self.isWire and len(self.node) == 2: - self.finish(False, cont=True) - if len(self.node) > 2: - if (self.point - self.node[0]).Length < Draft.tolerance(): - self.undolast() - self.finish(True, cont=True) FreeCAD.activeDocument().commitTransaction() return diff --git a/package.xml b/package.xml index 3ae5fba..24b0eb8 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.3.3 + 1.4.4 2025-01-15 diff --git a/pyrightconfig.json b/pyrightconfig.json index 69d4389..b4a90fb 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -4,6 +4,7 @@ "dialogz", "shapez", "tablez", + "cut_list" ], "exclude": [ @@ -14,17 +15,10 @@ "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/FreeCAD-stubs", "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/FreeCADGui-stubs", - - "defineConstant": { - "DEBUG": true - }, - "reportMissingImports": "error", "reportMissingTypeStubs": false, - - "pythonVersion": "3.10", + "pythonVersion": "3.12", "pythonPlatform": "Linux", - "executionEnvironments": [ { "root": ".", @@ -34,8 +28,15 @@ "/usr/local/Mod/Draft", "/usr/local/Mod/BIM", "/usr/local/lib", + "/usr/lib", "/usr/local/Ext/PySide", - ] + "/usr/share/freecad-daily/Mod/Draft", + "/usr/share/freecad-daily/Mod/Draft/draftfunctions", + "/usr/share/freecad-daily/Mod/Draft/draftguitools", + "/usr/share/freecad-daily/Mod/Draft/draftutils", + "/usr/share/freecad-daily/Ext/PySide", + "/usr/lib/python3/dist-packages" + ], }, ] } diff --git a/tablez/Elbow_ConduitPVCSCH-40.csv b/tablez/Elbow_ConduitPVCSCH-40.csv new file mode 100644 index 0000000..b7c8196 --- /dev/null +++ b/tablez/Elbow_ConduitPVCSCH-40.csv @@ -0,0 +1,6 @@ +PSize;OD;thk;BendAngle;BendRadius +PVC-16;16.13;1.21;90;114 +PVC-20;21.34;1.36;90;127 +PVC-25;26.67;1.65;90;152 +PVC-40;41.28;2.10;90;178 +PVC-45;52.40;2.30;90;203 diff --git a/tablez/Elbow_ConduitPVCSCH-80.csv b/tablez/Elbow_ConduitPVCSCH-80.csv new file mode 100644 index 0000000..a940fe7 --- /dev/null +++ b/tablez/Elbow_ConduitPVCSCH-80.csv @@ -0,0 +1,6 @@ +PSize;OD;thk;BendAngle;BendRadius +PVC-16;16.13;2.16;90;114 +PVC-20;21.34;2.62;90;127 +PVC-25;26.67;2.89;90;152 +PVC-40;41.28;3.79;90;178 +PVC-45;52.40;4.75;90;203 diff --git a/tablez/Pipe_ConduitEMT-LIGHT.csv b/tablez/Pipe_ConduitEMT-LIGHT.csv new file mode 100644 index 0000000..be4b66b --- /dev/null +++ b/tablez/Pipe_ConduitEMT-LIGHT.csv @@ -0,0 +1,7 @@ +PSize;OD;thk +EMT-1/2;16.13;0.7 +EMT-3/4;21.34;0.75 +EMT-1;26.67;1.0 +EMT-1-1/4;41.28;1.2 + + diff --git a/tablez/Pipe_ConduitIMT-MEDIUM.csv b/tablez/Pipe_ConduitIMT-MEDIUM.csv new file mode 100644 index 0000000..468cc1a --- /dev/null +++ b/tablez/Pipe_ConduitIMT-MEDIUM.csv @@ -0,0 +1,6 @@ +PSize;OD;thk +IMT-1/2;16.13;0.99 +IMT-3/4;21.34;1.14 +IMT-1;26.67;1.19 + + diff --git a/tablez/Pipe_ConduitPVCSCH-40.csv b/tablez/Pipe_ConduitPVCSCH-40.csv new file mode 100644 index 0000000..7eccd26 --- /dev/null +++ b/tablez/Pipe_ConduitPVCSCH-40.csv @@ -0,0 +1,6 @@ +PSize;OD;thk +PVC-1/2;16.13;1.21 +PVC-3/4;21.34;1.36 +PVC-1;26.67;1.65 +PVC-1-1/4;41.28;2.10 +PVC-1-1/2;52.40;2.30 diff --git a/tablez/Pipe_ConduitPVCSCH-80.csv b/tablez/Pipe_ConduitPVCSCH-80.csv new file mode 100644 index 0000000..264a128 --- /dev/null +++ b/tablez/Pipe_ConduitPVCSCH-80.csv @@ -0,0 +1,6 @@ +PSize;OD;thk +PVC-1/2;16.13;2.16 +PVC-3/4;21.34;2.62 +PVC-1;26.67;2.89 +PVC-1-1/4;41.28;3.79 +PVC-1-1/2;52.40;4.75 diff --git a/tablez/Pipe_ConduitRMT-HEAVY.csv b/tablez/Pipe_ConduitRMT-HEAVY.csv new file mode 100644 index 0000000..0a91b44 --- /dev/null +++ b/tablez/Pipe_ConduitRMT-HEAVY.csv @@ -0,0 +1,6 @@ +PSize;OD;thk +RMT-1/2;16.13;1.21 +RMT-3/4;21.34;1.36 +RMT-1;26.67;1.65 + + diff --git a/tablez/TerminalAdapter_ConduitPVC0.5in-SCH-40.csv b/tablez/TerminalAdapter_ConduitPVC0.5in-SCH-40.csv new file mode 100644 index 0000000..10b91d5 --- /dev/null +++ b/tablez/TerminalAdapter_ConduitPVC0.5in-SCH-40.csv @@ -0,0 +1,6 @@ +PSize;OD;L;SW;OD2 +PVC-1/2;27.30;33.2;18.7;21.33 +PVC-3/4;32.51;36.57;22.2;21.33 +PVC-1;41.27;55.57;38.1;21.33 +PVC-1-1/4;50.8;53.97;33.3;21.33 +PVC-1-1/2;50.8;52.4;33.3;21.33 diff --git a/tooltips.py b/tooltips.py index 55bc599..205f31f 100644 --- a/tooltips.py +++ b/tooltips.py @@ -77,3 +77,12 @@ "3.- Press 'x' key to execute rotation\n" "Note: - actually the command takes to the same level, respect the position and orientation \n of the first face selected, the center-of-mass of all faces selected. Thus it translates the objects even if the faces are not parallel.\n" ) +elbow_tooltip = ( + "Tool to insert a elbow based on gui option selections\n" + "_________________________________________________ \n" + "Usage \n" + "1.- Select edge or edges where you want to attach the elbow; should select circular end edges\n" + "2.- Choose elbow type according your needs on the GUI\n" + "3.- Press 'insert' button\n" + "Note: - There is dial available in case inserted elbow does not have right orientation\n" +) From 6a1abe613042bdfd158a028a8be17e022ba15cc8 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 3 May 2025 17:10:44 -0600 Subject: [PATCH 112/135] Add taskwatcher for wire & pipes feat: taskwatcher for pipe & wire & empty folder fix: transaction translation fix from fCmd on CPipe fix: Prating does not assigned --- CPipe.py | 36 ++++++++++++---------------- InitGui.py | 58 ++++++++++++++++++++++++++++++++++++---------- pCmd.py | 2 +- pFeatures.py | 19 +++++++-------- pForms.py | 4 ++-- package.xml | 2 +- pyrightconfig.json | 44 ++++++++++++----------------------- quetzal_config.py | 2 +- 8 files changed, 90 insertions(+), 77 deletions(-) diff --git a/CPipe.py b/CPipe.py index fef6f71..45bf273 100644 --- a/CPipe.py +++ b/CPipe.py @@ -13,7 +13,7 @@ from quetzal_config import addCommand QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP -translate = FreeCAD.Qt.translate +# translate = FreeCAD.Qt.translate def updatesPL(dialogqm): if FreeCAD.activeDocument(): @@ -250,9 +250,8 @@ def IsActive(self): def Activated(self): import pCmd - #FIXME:translate function does not works - # result=translate("Transaction", "Mate") - FreeCAD.activeDocument().openTransaction() + result=pCmd.translate("Transaction", "Mate") + FreeCAD.activeDocument().openTransaction(result) pCmd.alignTheTube() FreeCAD.activeDocument().commitTransaction() FreeCAD.activeDocument().recompute() @@ -301,9 +300,8 @@ def IsActive(self): def Activated(self): import pCmd - #FIXME:translate function does not works - # result=translate("Transaction", "Extend pipes to intersection") - FreeCAD.activeDocument().openTransaction() + result=pCmd.translate("Transaction", "Extend pipes to intersection") + FreeCAD.activeDocument().openTransaction(result) pCmd.extendTheTubes2intersection() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -330,9 +328,8 @@ def IsActive(self): def Activated(self): import pCmd - #FIXME:translate function does not works - # result=translate("Transaction", "Extend pipe to intersection") - FreeCAD.activeDocument().openTransaction() + result=pCmd.translate("Transaction", "Extend pipe to intersection") + FreeCAD.activeDocument().openTransaction(result) pCmd.extendTheTubes2intersection(both=False) FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -363,9 +360,8 @@ def Activated(self): from Part import Plane refFace = [f for f in fCmd.faces() if isinstance(f.Surface, Plane)][0] - #FIXME:translate function does not works - # result=translate("Transaction", "Lay-down the pipe") - FreeCAD.activeDocument().openTransaction() + result=pCmd.translate("Transaction", "Lay-down the pipe") + FreeCAD.activeDocument().openTransaction(result) for b in fCmd.beams(): if pCmd.isPipe(b): pCmd.laydownTheTube(b, refFace) @@ -401,9 +397,8 @@ def Activated(self): if len(sxFaces) > 0: refFace = sxFaces[0] support = sx.Object - #FIXME:translate function does not works - # result=translate("Transaction", "Raise-up the support") - FreeCAD.activeDocument().openTransaction() + result=pCmd.translate("Transaction", "Raise-up the support") + FreeCAD.activeDocument().openTransaction(result) for b in fCmd.beams(): if pCmd.isPipe(b): pCmd.laydownTheTube(b, refFace, support) @@ -475,9 +470,8 @@ def IsActive(self): def Activated(self): import pCmd - #FIXME:translate function does not works - # result=translate("Transaction", "Attach to tube") - FreeCAD.activeDocument().openTransaction() + result=pCmd.translate("Transaction", "Attach to tube") + FreeCAD.activeDocument().openTransaction(result) pCmd.attachToTube() FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() @@ -597,8 +591,8 @@ def IsActive(self): def Activated(self): import pCmd - # FreeCAD.activeDocument().openTransaction(translate("Transaction", "Connect to header")) - FreeCAD.activeDocument().openTransaction() + result=pCmd.translate("Transaction", "Connect to header") + FreeCAD.activeDocument().openTransaction(result) FreeCAD.activeDocument().recompute() FreeCAD.activeDocument().commitTransaction() pCmd.header() diff --git a/InitGui.py b/InitGui.py index f746ca2..a91945c 100644 --- a/InitGui.py +++ b/InitGui.py @@ -27,7 +27,7 @@ import FreeCAD import FreeCADGui -from FreeCADGui import Workbench +from FreeCADGui import ActiveDocument, Workbench Log = FreeCAD.Console.PrintLog @@ -161,19 +161,53 @@ def ContextMenu(self, recipient): self.appendContextMenu(QT_TRANSLATE_NOOP("Workbench", "Utils"), self.utilsList) def setWatchers(self): - class QuetzalCreateWatcher: - def __init__(self): + class QuetzalWatcher: + def __init__(self,commands,title): QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP - self.commands = ["Quetzal_InsertPypeLine", - "Quetzal_Point2Point", - "Quetzal_InsertFlange", - "Quetzal_FrameBranchManager", - "Quetzal_FrameIt" - ] - self.title = QT_TRANSLATE_NOOP("Quetzal","Create objects") + self.commands = commands + self.title = QT_TRANSLATE_NOOP("Quetzal",title) + def shouldShow(self): - return (FreeCAD.ActiveDocument is not None) - FreeCADGui.Control.addTaskWatcher([QuetzalCreateWatcher()]) + result:bool + if self.title == "No Objects": + if FreeCAD.ActiveDocument is not None and FreeCAD.ActiveDocument.ActiveObject is None: + result=True + else: + result=False + elif self.title == "Wire Objects": + if FreeCAD.ActiveDocument is not None and FreeCAD.ActiveDocument.ActiveObject is not None: + try: + obj = FreeCADGui.Selection.getSelection()[0] + isWire = hasattr(obj, "Shape") and obj.Shape.Edges # type(obj.Shape)==Part.Wire + if isWire: + result=True + else: + result=False + except Exception as e: + result=False + else: + result=False + elif self.title == "Tube Objects": + if FreeCAD.ActiveDocument is not None and FreeCAD.ActiveDocument.ActiveObject is not None: + try: + from pCmd import isPipe + obj = FreeCADGui.Selection.getSelection()[0] + if isPipe(obj): + result=True + else: + result=False + except Exception as e: + result=False + else: + result=False + return result + self.NoObjects=["Quetzal_HackedLine","Quetzal_Point2Point"] + self.WireObjects=["Quetzal_FrameBranchManager","Quetzal_InsertPipe","Quetzal_InsertPypeLine","Quetzal_InsertBranch"] + self.TubeObjects=["Quetzal_InsertFlange","Quetzal_InsertTerminalAdapter","Quetzal_InsertElbow"] + FreeCADGui.Control.addTaskWatcher([ + QuetzalWatcher(self.NoObjects,"No Objects"), + QuetzalWatcher(self.WireObjects,"Wire Objects"), + QuetzalWatcher(self.TubeObjects,"Tube Objects")]) def Activated(self): # if hasattr(FreeCADGui, "draftToolBar"): # patch diff --git a/pCmd.py b/pCmd.py index 462892e..14d40e7 100644 --- a/pCmd.py +++ b/pCmd.py @@ -842,7 +842,7 @@ def makeBranch( base = makeW() if base: a = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", lab) - pFeatures.PypeBranch2(a, base, DN, PRating, OD, thk, BR) + pFeatures.PypeBranch2(a,PRating, base, DN, OD, thk, BR) pFeatures.ViewProviderPypeBranch(a.ViewObject) return a else: diff --git a/pFeatures.py b/pFeatures.py index bf831a9..dbbe2bb 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -879,14 +879,14 @@ class PypeLine2(pypeType): with possibility to group them automatically and extract the part-list. """ - def __init__(self, obj, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None, lab=None): + def __init__(self, obj,rating, DN="DN50", OD=60.3, thk=3, BR=None, lab=None): # initialize the parent class super(PypeLine2, self).__init__(obj) # define common properties obj.Proxy = self obj.PType = "PypeLine" obj.PSize = DN - obj.PRating = PRating + obj.PRating = rating if lab: obj.Label = lab # define specific properties @@ -929,7 +929,6 @@ def onChanged(self, fp, prop): FreeCAD.Console.PrintWarning(fp.Label + " Base has changed to " + fp.Base.Label + "\n") if prop == "OD": fp.BendRadius = 0.75 * fp.OD - fp.Proxy.update(fp) def purge(self, fp): group = FreeCAD.activeDocument().getObjectsByLabel(fp.Group)[0] @@ -949,7 +948,7 @@ def update(self, fp, edges=None): pipes = list() for e in edges: # ---Create the tube--- - p = pCmd.makePipe( + p = pCmd.makePipe(fp.PRating, [fp.PSize, fp.OD, fp.thk, e.Length], pos=e.valueAt(0), Z=e.tangentAt(0) ) p.PRating = fp.PRating @@ -1257,14 +1256,14 @@ class PypeBranch2(pypeType): # use AttachExtensionPython type(base)=DWire or SketchObject """ - def __init__(self, obj, base, DN="DN50", PRating="SCH-STD", OD=60.3, thk=3, BR=None): + def __init__(self, obj,rating, base, DN="DN50", OD=60.3, thk=3, BR=None): # initialize the parent class super(PypeBranch2, self).__init__(obj) # define common properties obj.Proxy = self obj.PType = "PypeBranch" obj.PSize = DN - obj.PRating = PRating + obj.PRating = rating # define specific properties if FREECADVERSION > 0.19: obj.addExtension("App::GroupExtensionPython") @@ -1365,7 +1364,7 @@ def redraw(self, fp): alfa = e.tangentAt(0).getAngle(fp.Base.Shape.Edges[i + 1].tangentAt(0)) / 2 L -= R * tan(alfa) eSupport = "Edge" + str(i + 1) - t = pCmd.makePipe([fp.PSize, float(fp.OD), float(fp.thk), L]) + t = pCmd.makePipe(fp.PRating,[fp.PSize, float(fp.OD), float(fp.thk), L]) t.PRating = fp.PRating t.PSize = fp.PSize t.AttachmentSupport = [(fp.Base, eSupport)] @@ -1392,9 +1391,9 @@ def redraw(self, fp): fp.Curves = curves objs = [FreeCAD.ActiveDocument.getObject(name) for name in fp.Tubes + fp.Curves] # FreeCAD.Console.PrintMessage(objs) - fp.addObjects(objs) - for obj in objs: - obj.Proxy.execute(obj) + # fp.addObjects(objs) + # for obj in objs: + # obj.Proxy.execute(obj) def purge(self, fp): if hasattr(fp, "Tubes"): diff --git a/pForms.py b/pForms.py index e9e9e18..d82c93c 100644 --- a/pForms.py +++ b/pForms.py @@ -241,7 +241,7 @@ def __init__(self): translate("insertElbowForm", "Insert elbows"), "Elbow", "SCH-STD", - "elbow.svg", + "eilbow.svg", x, y, ) @@ -402,7 +402,7 @@ def __init__(self): super(insertTerminalAdapterForm, self).__init__( translate("insertTerminalAdapter", "Insert terminal adapter"), "TerminalAdapter", - "ConduitPVCSCH-40", + "ConduitPVC0.5in-SCH-40", "reduct.svg", x, y, diff --git a/package.xml b/package.xml index 24b0eb8..6095ac9 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.4.4 + 1.5.5 2025-01-15 diff --git a/pyrightconfig.json b/pyrightconfig.json index b4a90fb..0f6019c 100644 --- a/pyrightconfig.json +++ b/pyrightconfig.json @@ -6,37 +6,23 @@ "tablez", "cut_list" ], - - "exclude": [ - ], - - "ignore": [ - ], - "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/FreeCAD-stubs", "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/FreeCADGui-stubs", - "reportMissingImports": "error", - "reportMissingTypeStubs": false, - "pythonVersion": "3.12", + "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/Part-stubs", + "stubPath": "/home/edgar/.platformio/penv/lib/python3.12/site-packages/Sketcher-stubs", "pythonPlatform": "Linux", - "executionEnvironments": [ - { - "root": ".", - "extraPaths": [ - "/home/edgar/.platformio/penv/lib/python3.12/site-packages", - "/usr/local/Mod/Part", - "/usr/local/Mod/Draft", - "/usr/local/Mod/BIM", - "/usr/local/lib", - "/usr/lib", - "/usr/local/Ext/PySide", - "/usr/share/freecad-daily/Mod/Draft", - "/usr/share/freecad-daily/Mod/Draft/draftfunctions", - "/usr/share/freecad-daily/Mod/Draft/draftguitools", - "/usr/share/freecad-daily/Mod/Draft/draftutils", - "/usr/share/freecad-daily/Ext/PySide", - "/usr/lib/python3/dist-packages" - ], - }, + "extraPaths": [ + "/home/edgar/.platformio/penv/lib/python3.12/site-packages", + "/usr/local/Mod/Part", + "/usr/local/Mod/Draft", + "/usr/local/Mod/BIM", + "/usr/local/lib", + "/usr/lib", + "/usr/share/freecad-daily/Mod/Draft", + "/usr/share/freecad-daily/Mod/Draft/draftfunctions", + "/usr/share/freecad-daily/Mod/Draft/draftguitools", + "/usr/share/freecad-daily/Mod/Draft/draftutils", + "/usr/share/freecad-daily/Ext", + "/usr/lib/python3/dist-packages" ] } diff --git a/quetzal_config.py b/quetzal_config.py index 8919aa3..c231617 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -4,7 +4,7 @@ import FreeCAD import FreeCADGui -__version__ = "1.3.3" +__version__ = "1.5.5" _dir = os.path.dirname(__file__) ICONPATH = os.path.join(_dir, "iconz") From b9d508585874ad9d8403ded37ddf062c6f8423db Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 3 May 2025 20:45:19 -0600 Subject: [PATCH 113/135] Fix deprecation warning from addextension fix: Version statement with wrong number --- fFeatures.py | 2 +- package.xml | 2 +- quetzal_config.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fFeatures.py b/fFeatures.py index 7f9d7b3..54d1197 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -1265,7 +1265,7 @@ def redraw(self, obj): "FrameBranch", QT_TRANSLATE_NOOP("App::Property", "The rotation of the section"), ) - if int(FreeCAD.Version()[1]) > 19: # 20220704 + if FREECADVERSION > 0.19: # 20220704 beam.addExtension("Part::AttachExtensionPython") else: beam.addExtension("Part::AttachExtensionPython", beam) diff --git a/package.xml b/package.xml index 6095ac9..b2a2079 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.5.5 + 1.5.6 2025-01-15 diff --git a/quetzal_config.py b/quetzal_config.py index c231617..13a488c 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -4,7 +4,7 @@ import FreeCAD import FreeCADGui -__version__ = "1.5.5" +__version__ = "1.5.6" _dir = os.path.dirname(__file__) ICONPATH = os.path.join(_dir, "iconz") From f1b110bafff1f3c898f1b3b10edd30d540c0a30b Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 3 May 2025 22:40:20 -0600 Subject: [PATCH 114/135] Update README.md Added piping example --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 86b2c3c..0d2e312 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ Quetzal is the fork of Dodo workbench for [FreeCAD](https://freecad.org). Extending Dodo workbench support & adding translation support. ![screenshot1](https://github.com/user-attachments/assets/70e96920-34db-40d9-a8d6-102e690a13ee "Metal frame created with Quetzal") +![imagen](https://github.com/user-attachments/assets/78974156-9582-4676-acd1-b3689fcd74be) + ## Installation From 60c220fb0291e42327729dc9db5f7bcb8d6115e1 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 3 May 2025 22:41:31 -0600 Subject: [PATCH 115/135] Update README.md Add just Freecad windows piping example --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d2e312..bc9dd5c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ Quetzal is the fork of Dodo workbench for [FreeCAD](https://freecad.org). Extending Dodo workbench support & adding translation support. ![screenshot1](https://github.com/user-attachments/assets/70e96920-34db-40d9-a8d6-102e690a13ee "Metal frame created with Quetzal") -![imagen](https://github.com/user-attachments/assets/78974156-9582-4676-acd1-b3689fcd74be) +![Piping example](https://github.com/user-attachments/assets/0631e4df-e733-403d-8949-fb6a21e2742d) + ## Installation From fdbf314cd718a94d6feeae13198a9032a3aab7d2 Mon Sep 17 00:00:00 2001 From: Syres916 <46537884+Syres916@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:58:41 +0100 Subject: [PATCH 116/135] Prepare for QCheckBox stateChanged -> checkStateChanged --- cut_list/cut_list_ui.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cut_list/cut_list_ui.py b/cut_list/cut_list_ui.py index 1a08b74..a3ed5f4 100644 --- a/cut_list/cut_list_ui.py +++ b/cut_list/cut_list_ui.py @@ -26,7 +26,11 @@ def __init__(self): self.form.cut_width.setProperty("minimum", 0.0) # Set Default Options - self.form.use_nesting.stateChanged.connect(self.useNestingToggle) + if hasattr(self.form.use_nesting, "checkStateChanged"): + self.form.use_nesting.checkStateChanged.connect(self.useNestingToggle) + else: + self.form.use_nesting.stateChanged.connect(self.useNestingToggle) + self.form.use_nesting.setChecked(False) self.form.use_nesting.setChecked(False) From 7581cac70ff3c2f89e00c4df7a69ca5fca2f731d Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Fri, 20 Jun 2025 21:54:37 -0600 Subject: [PATCH 117/135] Add hints refactor: restructure python hints --- fCmd.py | 73 ++++++++++++++++++++---------------------- fFeatures.py | 90 +++++++++++++++++++++------------------------------- 2 files changed, 70 insertions(+), 93 deletions(-) diff --git a/fCmd.py b/fCmd.py index 65bbb23..9f5186f 100644 --- a/fCmd.py +++ b/fCmd.py @@ -5,16 +5,19 @@ __url__ = "github.com/oddtopus/dodo" __license__ = "LGPL 3" +from typing_extensions import Any import FreeCAD import FreeCADGui import DraftGeomUtils as dgu from DraftVecUtils import rounded +from Part import Edge, Face, Vertex +import Part ############## AUXILIARY FUNCTIONS ############### -def edges(selex=[], except1st=False): - """returns the list of edges in the selection set""" +def edges(selex:list[Any]=[], except1st:bool=False)->list[Any]: + """returns the list of edges in the selection set from current 3D view""" if len(selex) == 0: selex = FreeCADGui.Selection.getSelectionEx() try: @@ -25,23 +28,17 @@ def edges(selex=[], except1st=False): # FreeCAD.Console.PrintMessage('\nFound '+str(len(eds))+' edge(s).\n') except: FreeCAD.Console.PrintError("\nNo valid selection.\n") + return [] return eds - -def beams(sel=[]): - """ - Returns the selected "beams", i.e. FeaturePythons which have a Profile and an Height properties. +def beams(sel:list[Any]=[])->list[Any]: + """Returns the selected "beams", i.e. FeaturePythons which have a Profile and an Height properties. """ if len(sel) == 0: sel = FreeCADGui.Selection.getSelection() - return [ - i - for i in sel - if i.TypeId == "Part::FeaturePython" and hasattr(i, "Height") and hasattr(i, "Profile") - ] + return [i for i in sel if i.TypeId == "Part::FeaturePython" and hasattr(i, "Height") and hasattr(i, "Profile")] - -def faces(selex=[]): +def faces(selex:list[Any]=[])->list[Face]: """returns the list of faces in the selection set""" if len(selex) == 0: selex = FreeCADGui.Selection.getSelectionEx() @@ -50,17 +47,16 @@ def faces(selex=[]): # FreeCAD.Console.PrintMessage('\nFound '+str(len(fcs))+' face(s).\n') except: FreeCAD.Console.PrintError("\nNo valid selection.\n") + fcs = [] return fcs - -def points(selex=[]): +def points(selex:list[Any]=[])->list[Vertex]: """returns a list of selected vertexes""" if len(selex) == 0: selex = FreeCADGui.Selection.getSelectionEx() return [p for sx in selex for so in sx.SubObjects for p in so.Vertexes] - -def intersectionLines2(p1=None, v1=None, p2=None, v2=None): # TODO! +def intersectionLines2(p1:Vertex, v1:FreeCAD.Vector, p2:Vertex, v2:FreeCAD.Vector): # TODO! """ intersectionLines2(p1,v1,p2,v2) Returns the intersection between one line and the plane that includes the @@ -82,8 +78,7 @@ def intersectionLines2(p1=None, v1=None, p2=None, v2=None): # TODO! # P1=FreeCAD.Vector(p1.x,p1.y,p1.z) return p1.projectToPlane(p2, norm) - -def intersectionCLines(thing1=None, thing2=None): +def intersectionCLines(thing1:Any=None, thing2:Any=None)->FreeCAD.Vector: """ intersectionCLines(thing1=None, thing2=None) Returns the intersection (vector) of the center lines of thing1 and thing2. @@ -111,9 +106,7 @@ def intersectionCLines(thing1=None, thing2=None): return None -def intersectionLines( - p1=None, v1=None, p2=None, v2=None -): # OBSOLETE: replaced with intersectionCLines +def intersectionLines(p1=None, v1=None, p2=None, v2=None):# OBSOLETE: replaced with intersectionCLines """ intersectionLines(p1,v1,p2,v2) If exist, returns the intersection (vector) between two lines @@ -159,8 +152,7 @@ def intersectionLines( FreeCAD.Console.PrintError("Lines are parallel.\n") return None - -def intersectionPlane(base=None, v=None, face=None): +def intersectionPlane(base:FreeCAD.Vector=None, v:FreeCAD.Vector=None, face:Face=None)->FreeCAD.Vector: """ intersectionPlane(base,v,face) Returns the point (vector) at the intersection of a line and a plane. @@ -191,9 +183,10 @@ def intersectionPlane(base=None, v=None, face=None): P = base + v * k return rounded(P) - -def isOrtho(e1=None, e2=None): - '"True" if two Edges or Vectors or the normal of Faces are orthogonal (with a margin)' +def isOrtho(e1:Any=None, e2:Any=None)->bool: + """ + True" if two Edges or Vectors or the normal of Faces are orthogonal (with a margin) + """ v = [] if e1 == None or e2 == None: if len(faces()) > 1: @@ -210,9 +203,10 @@ def isOrtho(e1=None, e2=None): v.append(e) return round(v[0].dot(v[1]), 2) == 0 - -def isParallel(e1=None, e2=None): - '"True" if two Edges or Vectors or the normal of Faces are parallel (with a margin)' +def isParallel(e1:Any=None, e2:Any=None)->bool: + """ + True" if two Edges or Vectors or the normal of Faces are parallel (with a margin) + """ v = [] if e1 == None or e2 == None: if len(faces()) > 1: @@ -230,7 +224,8 @@ def isParallel(e1=None, e2=None): return round(v[0].cross(v[1]).Length, 2) == 0 # v[0].cross(v[1]).Length==0 -def beamAx(beam, vShapeRef=None): + +def beamAx(beam:Any, vShapeRef=None)->Any: """ beamAx(beam, vShapeRef=None) Returns the new orientation of a vector referred to Shape's coordinates @@ -243,6 +238,7 @@ def beamAx(beam, vShapeRef=None): return beam.Placement.Rotation.multVec(vShapeRef).normalize() + def getDistance(shapes=None): "measure the length of an edge or the distance of two shapes" if not shapes: @@ -260,7 +256,7 @@ def getDistance(shapes=None): return None -def bisect(w1=None, w2=None): +def bisect(w1:FreeCAD.Vector=None, w2:FreeCAD.Vector=None)->FreeCAD.Vector: """ bisect(w1=None,w2=None) Returns the bisect vector between vectors w1 and w2. @@ -278,7 +274,7 @@ def bisect(w1=None, w2=None): return b.normalize() -def ortho(w1=None, w2=None): +def ortho(w1:FreeCAD.Vector=None, w2:FreeCAD.Vector=None)->FreeCAD.Vector: """ ortho(w1=None,w2=None) Returns the orthogonal vector to vectors w1 and w2. @@ -290,7 +286,7 @@ def ortho(w1=None, w2=None): return w1.cross(w2).normalize() -def vec2edge(point, direct): +def vec2edge(point, direct)->Edge: """ vec2edge(point,direct) Returns an edge placed at point with the orientation and length of direct. @@ -317,9 +313,10 @@ def edgeName(obj=None, edge=None): return None -def isPartOfPart(obj): +def isPartOfPart(obj:FreeCAD.DocumentObject)->Part: + """ + returns the part to which obj belongs """ - returns the part to which obj belongs""" for c in obj.InList: if "App.Part" in str(type(c)): return c @@ -421,9 +418,7 @@ def stretchTheBeam(beam, L): beam.Height = L -def extendTheBeam( - beam, target -): # TARGET [working]: make it work when target and beam belong to different App::Parts +def extendTheBeam(beam, target): # TARGET [working]: make it work when target and beam belong to different App::Parts """arg1=beam, arg2=target: extend the beam to a plane, normal to its axis, defined by target. If target is a Vertex or a Vector, the plane is the one that includes the point defined by target. If target is a Face, the plane is the one that includes the intersection between the axis of beam and the plane of the face. diff --git a/fFeatures.py b/fFeatures.py index 54d1197..ff79a44 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -9,6 +9,7 @@ from math import degrees, sqrt, cos, radians, sin, tan from os import listdir from os.path import abspath, dirname, join +from sys import float_info import ArchProfile import FreeCAD @@ -1336,9 +1337,7 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings from FreeCAD import Vector -def doProfile( - typeS="RH", label="Square", dims=[50, 100, 5] -): # rearrange args in a better mnemonic way +def doProfile(typeS="RH", label="Square", dims=[50, 100, 5])->FreeCAD.DocumentObject: "doProfile(typeS, label, dims)" if typeS in ["RH", "R", "H", "U", "L", "T", "Z", "omega", "circle"]: profile = [0, "SECTION", label, typeS] + dims # for py2.6 versions @@ -1372,7 +1371,10 @@ def doProfile( FreeCAD.Console.PrintError("Not such section!\n") -def drawAndCenter(points): +def drawAndCenter(points:list[Vector])->Part.Face: + """ + Create a Face from a given list of vectors + """ p = Part.makePolygon(points) s = Part.Face(p) v = s.CenterOfMass @@ -1384,7 +1386,7 @@ def drawAndCenter(points): ############ pointsXXX() functions ################# -def pointsH(H, W, D, t1, t2, t3): +def pointsH(H:float, W:float, D:float, t1:float, t2:float, t3:float)->list[Vector]: p1 = Vector(0, 0, 0) p2 = Vector(W, 0, 0) p3 = Vector(W, t2, 0) @@ -1399,8 +1401,7 @@ def pointsH(H, W, D, t1, t2, t3): p12 = Vector(0, t2, 0) return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p1] - -def pointsL(H, W, t1, t2): +def pointL(H:float, W:float, t1:float, t2:float)->list[Vector]: p1 = Vector(-W / 2, -H / 2, 0) p2 = Vector(W / 2, -H / 2, 0) p3 = Vector(W / 2, H / 2, 0) @@ -1409,8 +1410,7 @@ def pointsL(H, W, t1, t2): p6 = Vector(-W / 2, t2 - H / 2, 0) return [p1, p2, p3, p4, p5, p6, p1] - -def pointsLWithRound(A, B, t, r1, r2): +def pointsLWithRound(A:float, B:float, t:float, r1:float, r2:float)->list[Vector]: x1 = r2 * (1 - 1 / sqrt(2)) x2 = r2 - x1 y1 = r1 * (1 - 1 / sqrt(2)) @@ -1431,8 +1431,7 @@ def pointsLWithRound(A, B, t, r1, r2): p12 = Vector(B, 0, 0) return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p1] - -def pointsChannelWithRound(H, B, t1, t2, r1, r2, Cy, s0): +def pointsChannelWithRound(H:float, B:float, t1:float, t2:float, r1:float, r2:float, Cy:float, s0:float)->list[Vector]: s5 = radians(s0) s45 = radians(45) y1 = r2 * cos(s45) @@ -1473,8 +1472,7 @@ def pointsChannelWithRound(H, B, t1, t2, r1, r2, Cy, s0): p16 = Vector(B, 0, 0) return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p1] - -def pointsOmega(H, W, D, t1, t2, t3): +def pointsOmega(H:float, W:float, D:float, t1:float, t2:float, t3:float)->list[Vector]: p1 = Vector(0, 0, 0) p2 = Vector(W, 0, 0) p3 = Vector(W, H - t3, 0) @@ -1489,8 +1487,7 @@ def pointsOmega(H, W, D, t1, t2, t3): p12 = Vector(0, H - t3, 0) return [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p1] - -def pointsT(H, W, t1, t2): +def pointsT(H:float, W:float, t1:float, t2:float)->list[Vector]: p1 = Vector(-W / 2, -H / 2, 0) p2 = Vector(W / 2, -H / 2, 0) p3 = Vector(W / 2, (-H / 2) + t2, 0) @@ -1501,8 +1498,7 @@ def pointsT(H, W, t1, t2): p8 = Vector(-W / 2, (-H / 2) + t2, 0) return [p1, p2, p3, p4, p5, p6, p7, p8, p1] - -def pointsU(H, W, D, t1, t2, t3): +def pointsU(H:float, W:float, D:float, t1:float, t2:float, t3:float)->list[Vector]: p1 = Vector(0, 0, 0) p2 = Vector(W, 0, 0) p3 = Vector(W, H, 0) @@ -1513,8 +1509,7 @@ def pointsU(H, W, D, t1, t2, t3): p8 = Vector(0, t2, 0) return [p1, p2, p3, p4, p5, p6, p7, p8, p1] - -def pointsZ(H, W, t1, t2): +def pointsZ(H:float, W:float, t1:float, t2:float)->list[Vector]: p1 = Vector(-t1 / 2, -W / 2, 0) p2 = Vector(-t1 / 2, (W / 2) - t2, 0) p3 = Vector(t1 / 2 - H, (W / 2) - t2, 0) @@ -1525,7 +1520,6 @@ def pointsZ(H, W, t1, t2): p8 = Vector(H - t1 / 2, -W / 2, 0) return [p1, p8, p7, p6, p5, p4, p3, p2, p1] - ########### _ ProfileXXX() classes ############### # class _Profile(Draft._DraftObject): @@ -1540,7 +1534,7 @@ def pointsZ(H, W, t1, t2): class _ProfileRH(_Profile): """A parametric Rectangular hollow beam profile. Profile data: [width, height, thickness]""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: obj.Label = translate("Objects", "Rectangular hollow", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", @@ -1574,7 +1568,7 @@ def __init__(self, obj, profile): ).t2 = profile[7] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: W, H, t1, t2 = obj.W.Value, obj.H.Value, obj.t1.Value, obj.t2.Value p1 = Vector(-W / 2, -H / 2, 0) p2 = Vector(W / 2, -H / 2, 0) @@ -1588,11 +1582,10 @@ def execute(self, obj): q = Part.makePolygon([q1, q2, q3, q4, q1]) obj.Shape = Part.Face(p).cut(Part.Face(q)) - class _ProfileR(_Profile): """A parametric Rectangular solid beam profile. Profile data: [width, height]""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: obj.Label = translate("Objects", "Rectangular solid", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", @@ -1614,7 +1607,7 @@ def __init__(self, obj, profile): ).H = profile[5] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: W, H = obj.W.Value, obj.H.Value p1 = Vector(-W / 2, -H / 2, 0) p2 = Vector(W / 2, -H / 2, 0) @@ -1623,14 +1616,13 @@ def execute(self, obj): p = Part.makePolygon([p1, p2, p3, p4, p1]) obj.Shape = Part.Face(p) - class _ProfileCircle(_Profile): """A parametric circular beam profile. Profile data: D: diameter t1: thickness (optional; "0" for solid section)""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: obj.Label = translate("Objects", "Circle-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", @@ -1652,7 +1644,7 @@ def __init__(self, obj, profile): ).t1 = profile[5] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: D, t1 = obj.D.Value, obj.t1.Value if not t1: obj.Shape = Part.makeFace([Part.makeCircle(D / 2)], "Part::FaceMakerSimple") @@ -1661,11 +1653,10 @@ def execute(self, obj): c2 = Part.makeFace([Part.makeCircle(D / 2 - t1)], "Part::FaceMakerSimple") obj.Shape = c1.cut(c2) - class _ProfileL(_Profile): """A parametric L beam profile. Profile data: [width, height, web thickness]""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: obj.addProperty( "App::PropertyString", "FType", @@ -1698,18 +1689,17 @@ def __init__(self, obj, profile): ).t2 = profile[7] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: W, H, t1, t2 = obj.W.Value, obj.H.Value, obj.t1.Value, obj.t2.Value obj.Shape = drawAndCenter(pointsL(H, W, t1, t2)) - class _ProfileAngle(_Profile): """ # Create a angle profile considering round edges obj: _Profile object profile: list of profile parameters """ - def __init__(self, obj:_Profile, profile:list): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: ## Profile name self.label = obj.Name # FIXME: : 'FeaturePython' object has no attribute 'size' @@ -1765,9 +1755,8 @@ def __init__(self, obj:_Profile, profile:list): QT_TRANSLATE_NOOP("App::Property", "Radius of corner r2"), ).r2 = float(self.sa[4]) _Profile.__init__(self, obj, profile) - return - def execute(self, obj:_Profile): + def execute(self, obj:FreeCAD.DocumentObject)->None: """ Modify provided object based on profile list parameters """ @@ -1784,9 +1773,8 @@ def execute(self, obj:_Profile): obj.B = B obj.Shape = drawAndCenter(pointsLWithRound(A, B, t, r1, r2)) - class _ProfileChannel(_Profile): - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: self.label = obj.Name # FIXME: : 'FeaturePython' object has no attribute 'size' self.size = FreeCAD.ActiveDocument.getObject(self.label).size @@ -1839,9 +1827,8 @@ def __init__(self, obj, profile): QT_TRANSLATE_NOOP("App::Property", "Radius of corner r2"), ).r2 = float(self.sa[4]) _Profile.__init__(self, obj, profile) - return - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: H = float(self.sa[0]) B = float(self.sa[1]) t1 = float(self.sa[2]) @@ -1856,11 +1843,10 @@ def execute(self, obj): obj.B = B obj.Shape = drawAndCenter(pointsChannelWithRound(H, B, t1, self.t2, r1, r2, Cy, self.s0)) - class _ProfileT(_Profile): """A parametric T beam profile. Profile data: [width, height, web thickness]""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: obj.Label = translate("Objects", "T-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", @@ -1894,15 +1880,14 @@ def __init__(self, obj, profile): ).t2 = profile[7] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: W, H, t1, t2 = obj.W.Value, obj.H.Value, obj.t1.Value, obj.t2.Value obj.Shape = drawAndCenter(pointsT(H, W, t1, t2)) - class _ProfileZ(_Profile): """A parametric Z beam profile. Profile data: [width, height, web thickness, flange thickness]""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: obj.Label = translate("Objects", "Z-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", @@ -1936,15 +1921,14 @@ def __init__(self, obj, profile): ).t2 = profile[7] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: W, H, t1, t2 = obj.W.Value, obj.H.Value, obj.t1.Value, obj.t2.Value obj.Shape = drawAndCenter(pointsZ(H, W, t1, t2)) - class _ProfileOmega(_Profile): """A parametric omega beam profile. Profile data: [W, H, D, t1,t2,t3]""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str]): obj.Label = translate("Objects", "Omega-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", @@ -1990,7 +1974,7 @@ def __init__(self, obj, profile): ).t3 = profile[9] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: W, H, D, t1, t2, t3 = ( obj.W.Value, obj.H.Value, @@ -2001,11 +1985,10 @@ def execute(self, obj): ) obj.Shape = drawAndCenter(pointsOmega(H, W, D, t1, t2, t3)) - class _ProfileH(_Profile): """A parametric omega beam profile. Profile data: [W, H, D, t1,t2,t3]""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str]): obj.Label = translate("Objects", "H-profile", "Profile name in the Tree View") obj.addProperty( "App::PropertyString", @@ -2051,7 +2034,7 @@ def __init__(self, obj, profile): ).t3 = profile[9] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: W, H, D, t1, t2, t3 = ( obj.W.Value, obj.H.Value, @@ -2062,11 +2045,10 @@ def execute(self, obj): ) obj.Shape = drawAndCenter(pointsH(H, W, D, t1, t2, t3)) - class _ProfileU(_Profile): """A parametric U beam profile. Profile data: [W, H, D, t1,t2,t3]""" - def __init__(self, obj, profile): + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str]): obj.addProperty( "App::PropertyString", "FType", @@ -2111,7 +2093,7 @@ def __init__(self, obj, profile): ).t3 = profile[9] _Profile.__init__(self, obj, profile) - def execute(self, obj): + def execute(self, obj:FreeCAD.DocumentObject)->None: W, H, D, t1, t2, t3 = ( obj.W.Value, obj.H.Value, From 8504354912649ccb59a712f84c92378a61c0c157 Mon Sep 17 00:00:00 2001 From: Syres916 <46537884+Syres916@users.noreply.github.com> Date: Sat, 21 Jun 2025 18:14:00 +0100 Subject: [PATCH 118/135] tooltips => Quetzal_tooltips --- CFrame.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CFrame.py b/CFrame.py index 1347d03..3ed6e8f 100644 --- a/CFrame.py +++ b/CFrame.py @@ -8,7 +8,7 @@ # import FreeCAD modules import os -import tooltips +import Quetzal_tooltips import FreeCAD import FreeCADGui @@ -47,7 +47,7 @@ def GetResources(self): "Pixmap": "Quetzal_FrameIt", "MenuText": QT_TRANSLATE_NOOP("Quetzal_FrameIt", "Place one-beam over one-edge"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_FrameIt", tooltips.frameit_tooltip + "Quetzal_FrameIt", Quetzal_tooltips.frameit_tooltip ), } @@ -79,7 +79,7 @@ def GetResources(self): "Pixmap": "Quetzal_SpinSection", "MenuText": QT_TRANSLATE_NOOP("Quetzal_SpinSection", "Spin beams by 45 deg."), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_SpinSection", tooltips.spinsect_tooltip + "Quetzal_SpinSection", Quetzal_tooltips.spinsect_tooltip ), } @@ -113,7 +113,7 @@ def GetResources(self): "Pixmap": "Quetzal_ReverseBeam", "MenuText": QT_TRANSLATE_NOOP("Quetzal_ReverseBeam", "Reverse orientation"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_ReverseBeam", tooltips.reversebeam_tooltip + "Quetzal_ReverseBeam", Quetzal_tooltips.reversebeam_tooltip ), } @@ -199,7 +199,7 @@ def GetResources(self): "Pixmap": "Quetzal_ShiftBeam", "MenuText": QT_TRANSLATE_NOOP("Quetzal_ShiftBeam", "Shift the beam"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_ShiftBeam", tooltips.shiftbeam_tooltip + "Quetzal_ShiftBeam", Quetzal_tooltips.shiftbeam_tooltip ), } @@ -249,7 +249,7 @@ def GetResources(self): "MenuText": QT_TRANSLATE_NOOP("Quetzal_LevelBeam", "Flush the surfaces"), "ToolTip": QT_TRANSLATE_NOOP( "Quetzal_LevelBeam", - tooltips.levelbeam_tooltip, + Quetzal_tooltips.levelbeam_tooltip, ), } @@ -328,7 +328,7 @@ def GetResources(self): "Pixmap": "Quetzal_PivotBeam", "MenuText": QT_TRANSLATE_NOOP("Quetzal_PivotBeam", "Pivot the beam"), "ToolTip": QT_TRANSLATE_NOOP( - "Quetzal_PivotBeam", tooltips.pivotbeam_tooltip + "Quetzal_PivotBeam", Quetzal_tooltips.pivotbeam_tooltip ), } @@ -552,7 +552,7 @@ def GetResources(self): return { "Pixmap": "Quetzal_FrameBranchManager", "MenuText": QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager", "FrameBranch Manager"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager", tooltips.framebranchmanager_tooltip), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_FrameBranchManager", Quetzal_tooltips.framebranchmanager_tooltip), } From 583fb065c6f199497406280c03c1d0a6f2a085f4 Mon Sep 17 00:00:00 2001 From: Syres916 <46537884+Syres916@users.noreply.github.com> Date: Sat, 21 Jun 2025 18:15:12 +0100 Subject: [PATCH 119/135] tooltips => Quetzal_tooltips --- CPipe.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CPipe.py b/CPipe.py index 45bf273..54c3cef 100644 --- a/CPipe.py +++ b/CPipe.py @@ -8,7 +8,7 @@ # import FreeCAD modules import FreeCAD import FreeCADGui -import tooltips +import Quetzal_tooltips from quetzal_config import addCommand @@ -50,7 +50,7 @@ def GetResources(self): return { "Pixmap": "Quetzal_InsertPipe", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", "Insert a tube"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", tooltips.insert_tube_tooltip), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertPipe", Quetzal_tooltips.insert_tube_tooltip), } @@ -70,7 +70,7 @@ def GetResources(self): return { "Pixmap": "Quetzal_InsertElbow", "MenuText": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", "Insert a elbow"), - "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", tooltips.elbow_tooltip), + "ToolTip": QT_TRANSLATE_NOOP("Quetzal_InsertElbow", Quetzal_tooltips.elbow_tooltip), } From d3719d22d7d71ca75fc63a51473be620d0f79d4e Mon Sep 17 00:00:00 2001 From: Syres916 <46537884+Syres916@users.noreply.github.com> Date: Sat, 21 Jun 2025 18:23:14 +0100 Subject: [PATCH 120/135] Create Quetzal_tooltips.py --- Quetzal_tooltips.py | 88 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 Quetzal_tooltips.py diff --git a/Quetzal_tooltips.py b/Quetzal_tooltips.py new file mode 100644 index 0000000..205f31f --- /dev/null +++ b/Quetzal_tooltips.py @@ -0,0 +1,88 @@ +insert_tube_tooltip = ( + "Create a tube not referenced to a single wire\n" + "______________________________________________________________________________________________________________________________________ \n" + "Usage \n" + "Preselect the following: \n" + " • Choose one o more wire the 3D view by clicking on it. if no wire is Preselect it will create a last lenght done vertical tube \n" + "\n" + "Apply the function: \n" + "A window will pop up order to select first wall pipe thickness standart follow by DN standart\n" + "then press insert button to create tube.\n" + "Apply button:\n" + "It will modify preselected tubes with new choose option selected on window pop up" + "\n" + "Invert button:\n" + "It will modify preselected tubes with new tube orientation rotating 180 degre tube using head tube side as pivot point\n" + "\n" + ) +frameit_tooltip = ( + "Relocate existing & selected beam at Preselected edge\n" + "_____________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "• Choose a existing beam at current document then select a edge target where beam will be relocated" + "Press [ESC] to cancel relocation function" +) +framebranchmanager_tooltip = ( + "Create a framebranch object with beam nest on tree. this object create parametric frames allowing change base sketch, path or wire and adapt to new dimentions\n" + "______________________________________________________________________________________________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "• Choose a existing sketch/path(s) then choose profile to be applied on pop up windows\n" +) +spinsect_tooltip = ( + "Spin beam object(s) selected around the Z axis of its wire/sketch shape by 45 degrees each click\n" + "______________________________________________________________________________________________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "• Select beam object(s) to spin\n" +) +reversebeam_tooltip = ( + "Spin beam object(s) selected around the X axis of its wire/sketch shape by 180 degrees each click\n" + "______________________________________________________________________________________________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "• Select beam object(s) to spin\n" + "Note: - if one edge of the object is selected, that is used\n" + "as the pivot of rotation." +) +shiftbeam_tooltip = ( + "Dialog to translate and copy objects.\n" + "______________________________________________________________________________________________________________________________________ \n" + "• [x/y/z] textboxes: direct input of amount of translation in each direction" + "• [Multiple] textbox: the multiple coefficient of the translation amount.\n" + "• [Steps] textbox: the denominator of the translation amount. It's used when the amount of translation is to be covered in some steps.\n" + "• [move/copy] radiobuttons: to select if the selected objects shall be copied or only translated.\n" + "• [Displacement] button: takes the amount and direction of translation from the distance of selected entities (points, edges, faces).\n" + "• [Vector] button: defines the amount and direction of translation by the orientation and length of the selected edge.\n" + "• [OK] button: execute the translation\n" + "• [Cancel]: exits\n" +) +levelbeam_tooltip = ( + "Tool to flush the parallel faces of two objects.\n" + "_________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "1.- Select fisrt beam face to take as reference\n" + "2.- Select second beam face to translate and match faces coplanar\n" + "Note: - actually the command takes to the same level, respect the position and orientation \n of the first face selected, the center-of-mass of all faces selected. Thus it translates the objects even if the faces are not parallel.\n" +) +pivotbeam_tooltip = ( + "Tool to pivot & copy around one edge or principal X/Y/Z axis\n" + "_________________________________________________ \n" + "Usage \n" + "Preselected the following:\n" + "1.- Select fisrt beam to modify rotation angle or press 's' key\n" + "2.- Choose a principal axis with x, y , z button or select a edge then press 'assign axis' button \n" + "3.- Press 'x' key to execute rotation\n" + "Note: - actually the command takes to the same level, respect the position and orientation \n of the first face selected, the center-of-mass of all faces selected. Thus it translates the objects even if the faces are not parallel.\n" +) +elbow_tooltip = ( + "Tool to insert a elbow based on gui option selections\n" + "_________________________________________________ \n" + "Usage \n" + "1.- Select edge or edges where you want to attach the elbow; should select circular end edges\n" + "2.- Choose elbow type according your needs on the GUI\n" + "3.- Press 'insert' button\n" + "Note: - There is dial available in case inserted elbow does not have right orientation\n" +) From bbc5bd010dc1717d671454a6db02f70e4fd96dd8 Mon Sep 17 00:00:00 2001 From: Syres916 <46537884+Syres916@users.noreply.github.com> Date: Sat, 21 Jun 2025 18:23:31 +0100 Subject: [PATCH 121/135] Delete tooltips.py --- tooltips.py | 88 ----------------------------------------------------- 1 file changed, 88 deletions(-) delete mode 100644 tooltips.py diff --git a/tooltips.py b/tooltips.py deleted file mode 100644 index 205f31f..0000000 --- a/tooltips.py +++ /dev/null @@ -1,88 +0,0 @@ -insert_tube_tooltip = ( - "Create a tube not referenced to a single wire\n" - "______________________________________________________________________________________________________________________________________ \n" - "Usage \n" - "Preselect the following: \n" - " • Choose one o more wire the 3D view by clicking on it. if no wire is Preselect it will create a last lenght done vertical tube \n" - "\n" - "Apply the function: \n" - "A window will pop up order to select first wall pipe thickness standart follow by DN standart\n" - "then press insert button to create tube.\n" - "Apply button:\n" - "It will modify preselected tubes with new choose option selected on window pop up" - "\n" - "Invert button:\n" - "It will modify preselected tubes with new tube orientation rotating 180 degre tube using head tube side as pivot point\n" - "\n" - ) -frameit_tooltip = ( - "Relocate existing & selected beam at Preselected edge\n" - "_____________________________________________________ \n" - "Usage \n" - "Preselected the following:\n" - "• Choose a existing beam at current document then select a edge target where beam will be relocated" - "Press [ESC] to cancel relocation function" -) -framebranchmanager_tooltip = ( - "Create a framebranch object with beam nest on tree. this object create parametric frames allowing change base sketch, path or wire and adapt to new dimentions\n" - "______________________________________________________________________________________________________________________________________ \n" - "Usage \n" - "Preselected the following:\n" - "• Choose a existing sketch/path(s) then choose profile to be applied on pop up windows\n" -) -spinsect_tooltip = ( - "Spin beam object(s) selected around the Z axis of its wire/sketch shape by 45 degrees each click\n" - "______________________________________________________________________________________________________________________________________ \n" - "Usage \n" - "Preselected the following:\n" - "• Select beam object(s) to spin\n" -) -reversebeam_tooltip = ( - "Spin beam object(s) selected around the X axis of its wire/sketch shape by 180 degrees each click\n" - "______________________________________________________________________________________________________________________________________ \n" - "Usage \n" - "Preselected the following:\n" - "• Select beam object(s) to spin\n" - "Note: - if one edge of the object is selected, that is used\n" - "as the pivot of rotation." -) -shiftbeam_tooltip = ( - "Dialog to translate and copy objects.\n" - "______________________________________________________________________________________________________________________________________ \n" - "• [x/y/z] textboxes: direct input of amount of translation in each direction" - "• [Multiple] textbox: the multiple coefficient of the translation amount.\n" - "• [Steps] textbox: the denominator of the translation amount. It's used when the amount of translation is to be covered in some steps.\n" - "• [move/copy] radiobuttons: to select if the selected objects shall be copied or only translated.\n" - "• [Displacement] button: takes the amount and direction of translation from the distance of selected entities (points, edges, faces).\n" - "• [Vector] button: defines the amount and direction of translation by the orientation and length of the selected edge.\n" - "• [OK] button: execute the translation\n" - "• [Cancel]: exits\n" -) -levelbeam_tooltip = ( - "Tool to flush the parallel faces of two objects.\n" - "_________________________________________________ \n" - "Usage \n" - "Preselected the following:\n" - "1.- Select fisrt beam face to take as reference\n" - "2.- Select second beam face to translate and match faces coplanar\n" - "Note: - actually the command takes to the same level, respect the position and orientation \n of the first face selected, the center-of-mass of all faces selected. Thus it translates the objects even if the faces are not parallel.\n" -) -pivotbeam_tooltip = ( - "Tool to pivot & copy around one edge or principal X/Y/Z axis\n" - "_________________________________________________ \n" - "Usage \n" - "Preselected the following:\n" - "1.- Select fisrt beam to modify rotation angle or press 's' key\n" - "2.- Choose a principal axis with x, y , z button or select a edge then press 'assign axis' button \n" - "3.- Press 'x' key to execute rotation\n" - "Note: - actually the command takes to the same level, respect the position and orientation \n of the first face selected, the center-of-mass of all faces selected. Thus it translates the objects even if the faces are not parallel.\n" -) -elbow_tooltip = ( - "Tool to insert a elbow based on gui option selections\n" - "_________________________________________________ \n" - "Usage \n" - "1.- Select edge or edges where you want to attach the elbow; should select circular end edges\n" - "2.- Choose elbow type according your needs on the GUI\n" - "3.- Press 'insert' button\n" - "Note: - There is dial available in case inserted elbow does not have right orientation\n" -) From 06ce9d2d14fece2ca1eec71391cf023c37714a2b Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Mon, 4 Aug 2025 23:45:35 -0600 Subject: [PATCH 122/135] Dependency issues fix(config): old Arch dependency remove fix(config): add typing_extensions module dependency --- package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.xml b/package.xml index b2a2079..7c37529 100644 --- a/package.xml +++ b/package.xml @@ -31,7 +31,7 @@ - Arch + typing_extensions Draft beams frames From 854b5c241cae0bc9597dd2dc5b815e8829a1b5a5 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Wed, 6 Aug 2025 20:31:50 -0600 Subject: [PATCH 123/135] Dependency issues 2 fix(config): retype typing-extensions module dependency --- fFeatures.py | 5 +++++ package.xml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/fFeatures.py b/fFeatures.py index ff79a44..dba33b9 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -1520,6 +1520,11 @@ def pointsZ(H:float, W:float, t1:float, t2:float)->list[Vector]: p8 = Vector(H - t1 / 2, -W / 2, 0) return [p1, p8, p7, p6, p5, p4, p3, p2, p1] +def pointsTslot(H:float, W:float): + pass + #TODO: + # p1 = Vector() + ########### _ ProfileXXX() classes ############### # class _Profile(Draft._DraftObject): diff --git a/package.xml b/package.xml index 7c37529..c2bebce 100644 --- a/package.xml +++ b/package.xml @@ -31,7 +31,7 @@ - typing_extensions + typing-extensions Draft beams frames From 5a0c8cc5c5de850f3cb454cabffa03f60ecc9643 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Sun, 24 Aug 2025 11:22:06 -0500 Subject: [PATCH 124/135] Update package.xml dependencies to be more explicit --- package.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.xml b/package.xml index c2bebce..13d85c8 100644 --- a/package.xml +++ b/package.xml @@ -31,8 +31,8 @@ - typing-extensions - Draft + typing-extensions + Draft beams frames pipe From 646b5c995a6c4ed890b5a6681cb08789d92b8ad0 Mon Sep 17 00:00:00 2001 From: PhoneDroid <73050054+PhoneDroid@users.noreply.github.com> Date: Mon, 20 Oct 2025 08:06:52 -0400 Subject: [PATCH 125/135] Add SPDX License Identifiers --- CFrame.py | 2 +- CPipe.py | 2 +- CUtils.py | 2 +- Init.py | 24 +----------------------- InitGui.py | 24 +----------------------- Quetzal_tooltips.py | 2 ++ ShpstData.py | 2 ++ anyShapez.py | 2 ++ cut_list/__init__.py | 25 +------------------------ cut_list/cut_list_commands.py | 2 ++ cut_list/cut_list_creation.py | 2 ++ cut_list/cut_list_ui.py | 2 ++ cut_list/resultSpreadsheet.py | 2 ++ dodoDialogs.py | 2 ++ dodoPM.py | 8 +------- fCmd.py | 2 +- fFeatures.py | 2 +- fForms.py | 2 +- fObservers.py | 2 +- pCmd.py | 2 +- pFeatures.py | 2 +- pForms.py | 2 +- pObservers.py | 2 +- quetzal_config.py | 2 ++ uCmd.py | 2 +- uForms.py | 2 +- 26 files changed, 35 insertions(+), 90 deletions(-) diff --git a/CFrame.py b/CFrame.py index 3ed6e8f..9011003 100644 --- a/CFrame.py +++ b/CFrame.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "frameTools toolbar" __author__ = "oddtopus" diff --git a/CPipe.py b/CPipe.py index 54c3cef..2007d4b 100644 --- a/CPipe.py +++ b/CPipe.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "pypeTools toolbar" __author__ = "oddtopus" diff --git a/CUtils.py b/CUtils.py index 50997e5..77e1a85 100644 --- a/CUtils.py +++ b/CUtils.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __license__ = "LGPL 3" diff --git a/Init.py b/Init.py index a859e09..6ceb116 100644 --- a/Init.py +++ b/Init.py @@ -1,23 +1 @@ -# **************************************************************************** -# * * -# * Dodo Workbench: * -# * substitute of flamingo for Py3 / Qt5 * -# * Copyright (c) 2019 Riccardo Treu LGPL * -# * * -# * This program is free software; you can redistribute it and/or modify * -# * it under the terms of the GNU Lesser General Public License (LGPL) * -# * as published by the Free Software Foundation; either version 2 of * -# * the License, or (at your option) any later version. * -# * for detail see the LICENCE text file. * -# * * -# * This program is distributed in the hope that it will be useful, * -# * but WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -# * GNU Library General Public License for more details. * -# * * -# * You should have received a copy of the GNU Library General Public * -# * License along with this program; if not, write to the Free Software * -# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * -# * USA * -# * * -# **************************************************************************** +# SPDX-License-Identifier: LGPL-3.0-or-later diff --git a/InitGui.py b/InitGui.py index a91945c..092d849 100644 --- a/InitGui.py +++ b/InitGui.py @@ -1,26 +1,4 @@ -# **************************************************************************** -# * * -# * Dodo Workbench: * -# * substitute of flamingo for Py3 / Qt5 * -# * Copyright (c) 2019 Riccardo Treu LGPL * -# * * -# * This program is free software; you can redistribute it and/or modify * -# * it under the terms of the GNU Lesser General Public License (LGPL) * -# * as published by the Free Software Foundation; either version 2 of * -# * the License, or (at your option) any later version. * -# * for detail see the LICENCE text file. * -# * * -# * This program is distributed in the hope that it will be useful, * -# * but WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -# * GNU Library General Public License for more details. * -# * * -# * You should have received a copy of the GNU Library General Public * -# * License along with this program; if not, write to the Free Software * -# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * -# * USA * -# * * -# **************************************************************************** +# SPDX-License-Identifier: LGPL-3.0-or-later import os import sys diff --git a/Quetzal_tooltips.py b/Quetzal_tooltips.py index 205f31f..0d96c68 100644 --- a/Quetzal_tooltips.py +++ b/Quetzal_tooltips.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + insert_tube_tooltip = ( "Create a tube not referenced to a single wire\n" "______________________________________________________________________________________________________________________________________ \n" diff --git a/ShpstData.py b/ShpstData.py index 5aeb0c2..13d0a1d 100644 --- a/ShpstData.py +++ b/ShpstData.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + type=[ '00_Angle','01_Channel','02_H_Shape','03_I-Shape','04_CT_Shape','05_Pipe', '06_Flat_Bar','07_Light_Weight_Angle','08_Light_Weight_Channel','09_Rip_Channel','10_Square_Pipe', diff --git a/anyShapez.py b/anyShapez.py index 7c905a0..1680196 100644 --- a/anyShapez.py +++ b/anyShapez.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + import FreeCAD import FreeCADGui import Part diff --git a/cut_list/__init__.py b/cut_list/__init__.py index 84ea15a..9dce8b8 100644 --- a/cut_list/__init__.py +++ b/cut_list/__init__.py @@ -1,27 +1,4 @@ -# **************************************************************************** -# * * -# * Cut List Creation for Dodo Workbench * -# * * -# * Copyright (c) 2023 FilePhil LGPL * -# * * -# * This program is free software; you can redistribute it and/or modify * -# * it under the terms of the GNU Lesser General Public License (LGPL) * -# * as published by the Free Software Foundation; either version 2 of * -# * the License, or (at your option) any later version. * -# * for detail see the LICENCE text file. * -# * * -# * This program is distributed in the hope that it will be useful, * -# * but WITHOUT ANY WARRANTY; without even the implied warranty of * -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -# * GNU Library General Public License for more details. * -# * * -# * You should have received a copy of the GNU Library General Public * -# * License along with this program; if not, write to the Free Software * -# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * -# * USA * -# * * -# **************************************************************************** - +# SPDX-License-Identifier: LGPL-3.0-or-later import os diff --git a/cut_list/cut_list_commands.py b/cut_list/cut_list_commands.py index 39063aa..29cfcaa 100644 --- a/cut_list/cut_list_commands.py +++ b/cut_list/cut_list_commands.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + import os import FreeCAD diff --git a/cut_list/cut_list_creation.py b/cut_list/cut_list_creation.py index 750419c..b2a0114 100644 --- a/cut_list/cut_list_creation.py +++ b/cut_list/cut_list_creation.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + import FreeCAD from dataclasses import dataclass diff --git a/cut_list/cut_list_ui.py b/cut_list/cut_list_ui.py index a3ed5f4..383a312 100644 --- a/cut_list/cut_list_ui.py +++ b/cut_list/cut_list_ui.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + import FreeCAD import FreeCADGui import os diff --git a/cut_list/resultSpreadsheet.py b/cut_list/resultSpreadsheet.py index 4fb5e5f..cabff9a 100644 --- a/cut_list/resultSpreadsheet.py +++ b/cut_list/resultSpreadsheet.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + # Heavily Inspired Code from # https://github.com/furti/FreeCAD-Reporting/blob/master/report.py diff --git a/dodoDialogs.py b/dodoDialogs.py index b006c29..1504522 100644 --- a/dodoDialogs.py +++ b/dodoDialogs.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + import csv from os import listdir from os.path import abspath, dirname, join diff --git a/dodoPM.py b/dodoPM.py index 02369a4..63920de 100644 --- a/dodoPM.py +++ b/dodoPM.py @@ -1,10 +1,4 @@ -# Copyright (C) 2018 oddtopus (www.github.com/oddtopus/dodo) -# Following code is derived from -# PieMenu widget for FreeCAD -# -# Copyright (C) 2016, 2017 triplus @ FreeCAD -# Copyright (C) 2015,2016 looo @ FreeCAD -# Copyright (C) 2015 microelly +# SPDX-License-Identifier: LGPL-3.0-or-later import FreeCAD import FreeCADGui diff --git a/fCmd.py b/fCmd.py index 9f5186f..887d2b4 100644 --- a/fCmd.py +++ b/fCmd.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "frameTools functions" __author__ = "oddtopus" diff --git a/fFeatures.py b/fFeatures.py index dba33b9..e1557e1 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "frameTools objects" __author__ = "oddtopus" diff --git a/fForms.py b/fForms.py index ad0f92f..fc097cc 100644 --- a/fForms.py +++ b/fForms.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __license__ = "LGPL 3" diff --git a/fObservers.py b/fObservers.py index dcc6e80..d3dcb78 100644 --- a/fObservers.py +++ b/fObservers.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "frameTools selection observers" __author__ = "oddtopus" diff --git a/pCmd.py b/pCmd.py index 14d40e7..400a52f 100644 --- a/pCmd.py +++ b/pCmd.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "pypeTools functions" import FreeCAD diff --git a/pFeatures.py b/pFeatures.py index dbbe2bb..8aba381 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part ofdodo tools w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "pypeTools objects" __author__ = "oddtopus" diff --git a/pForms.py b/pForms.py index d82c93c..fd26d20 100644 --- a/pForms.py +++ b/pForms.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __license__ = "LGPL 3" diff --git a/pObservers.py b/pObservers.py index 3012087..1e50844 100644 --- a/pObservers.py +++ b/pObservers.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo tools w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "frameTools toolbar" __author__ = "oddtopus" diff --git a/quetzal_config.py b/quetzal_config.py index 13a488c..f0741d3 100644 --- a/quetzal_config.py +++ b/quetzal_config.py @@ -1,3 +1,5 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + import inspect import os diff --git a/uCmd.py b/uCmd.py index b854ba3..452f70e 100644 --- a/uCmd.py +++ b/uCmd.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __license__ = "LGPL 3" diff --git a/uForms.py b/uForms.py index a61fd3a..5e2b99f 100644 --- a/uForms.py +++ b/uForms.py @@ -1,4 +1,4 @@ -# (c) 2019 R. T. LGPL: part of dodo w.b. for FreeCAD +# SPDX-License-Identifier: LGPL-3.0-or-later __title__ = "query dialog" __author__ = "oddtopus" From 75f066238b670931f1af4ce173b712b184b6b257 Mon Sep 17 00:00:00 2001 From: PhoneDroid <73050054+PhoneDroid@users.noreply.github.com> Date: Mon, 20 Oct 2025 08:07:14 -0400 Subject: [PATCH 126/135] Add previous authors --- package.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.xml b/package.xml index 13d85c8..c97dc7a 100644 --- a/package.xml +++ b/package.xml @@ -25,7 +25,11 @@ https://forum.freecad.org/viewtopic.php?t=22711 + microelly + looo + triplus Riccardo Treu (oddtopus) + Edgar Robles iconz/quetzal.svg From 57ffc70ed960cc14361ffba3809204a3dd3b40c4 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 30 Nov 2025 19:55:06 -0600 Subject: [PATCH 127/135] fix(typing): Overall length parameter --- pFeatures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pFeatures.py b/pFeatures.py index dbbe2bb..c2a3a40 100644 --- a/pFeatures.py +++ b/pFeatures.py @@ -221,7 +221,7 @@ def __init__(self,obj,rating,DN="PCV-1/2",OD=21.3,L=33.2,SW=18.7, OD2=21.33): "App::PropertyLength", "L", "TerminalAdapter", - QT_TRANSLATE_NOOP("App::Property", "Overall lenght"), + QT_TRANSLATE_NOOP("App::Property", "Overall length"), ).L = L obj.addProperty( "App::PropertyLength", From 9b877b731709c78758452b292197588f192f120b Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 30 Nov 2025 20:03:09 -0600 Subject: [PATCH 128/135] refactor(ui): simplify framemanager add button tooltips add preview profile images fix(miters): add TSLOT on do profile method plane wrong placement object name refactor(core): Rename onChanged functions --- dialogz/fbranch.ui | 664 +++++++++++++++++------- fFeatures.py | 216 +++++--- iconz/PreviewSections/RHS100x50x3.2.png | Bin 0 -> 23346 bytes iconz/PreviewSections/RHS50x30x2.9.png | Bin 0 -> 9444 bytes iconz/PreviewSections/RHS50x30x3.png | Bin 0 -> 9473 bytes iconz/PreviewSections/RHS50x30x4.png | Bin 0 -> 9762 bytes iconz/PreviewSections/RHS60x40x2.9.png | Bin 0 -> 13455 bytes iconz/PreviewSections/RHS80x40x2.9.png | Bin 0 -> 17196 bytes iconz/PreviewSections/RHS90x50x3.png | Bin 0 -> 21282 bytes iconz/PreviewSections/UB127x76x13.png | Bin 0 -> 36367 bytes 10 files changed, 635 insertions(+), 245 deletions(-) create mode 100644 iconz/PreviewSections/RHS100x50x3.2.png create mode 100644 iconz/PreviewSections/RHS50x30x2.9.png create mode 100644 iconz/PreviewSections/RHS50x30x3.png create mode 100644 iconz/PreviewSections/RHS50x30x4.png create mode 100644 iconz/PreviewSections/RHS60x40x2.9.png create mode 100644 iconz/PreviewSections/RHS80x40x2.9.png create mode 100644 iconz/PreviewSections/RHS90x50x3.png create mode 100644 iconz/PreviewSections/UB127x76x13.png diff --git a/dialogz/fbranch.ui b/dialogz/fbranch.ui index cd83624..aa78f48 100644 --- a/dialogz/fbranch.ui +++ b/dialogz/fbranch.ui @@ -6,86 +6,44 @@ 0 0 - 290 - 588 + 265 + 646 - + 0 0 + + + 100 + 100 + + FrameBranch Manager + + + ../iconz/Quetzal_FrameBranchManager.svg../iconz/Quetzal_FrameBranchManager.svg + - - - - AddBeams - - - - - - - -99 - - - Qt::Horizontal - - - - - - - Generate planes - - - - - - - - - - Qt::Vertical + + + + + 0 + 0 + - + - 20 - 40 + 500 + 30 - - - - - - RemoveBeams - - - - - - - Cut Miters - - - - - - - Qt::AlignCenter - - - offset head - - - - - <no target selected> @@ -94,155 +52,493 @@ - - - + + + + + 0 + 0 + + + - 80 - 0 + 500 + 30 - - Qt::AlignCenter - - - <degrees> - - - - - - - - - Add single + <no item selected> - - - - Qt::AlignCenter - - <length> - - + - - hotkeys: "S" to select, "X" to trim - - - Qt::AlignCenter - - - - - - - Get targets - - - - - - - Qt::AlignCenter - - - offset tail - - - - - - + 0 0 - - Redraw - - - - - - - -99 - - - Qt::Horizontal - - - - - - - Trim/Extend - - - - - - - 359 - - - Qt::Horizontal - - - false - - - false - - - true - - - 15.000000000000000 - - - true + + + 500 + 20 + - - - - - <no item selected> + hotkeys: "S" to select, "X" to trim Qt::AlignCenter - - - - ChangeProfile - - - - - + + - 80 + 0 0 - - Qt::AlignCenter - - - <name> + + + 500 + 4000 + + + 0 + + + + + 0 + 0 + + + + Creation + + + + + + Qt::Horizontal + + + + + + + Rate: + + + + + + + Size: + + + + + + + + + + + 20 + + + 500 + + + + + + + 20 + + + 500 + + + false + + + + + + + + + + + + + <html><head/><body><p>Create a single beam.</p><p>if a wire is previous selected beam will reorientade normal to wire but no based frame will be created.</p></body></html> + + + Add single + + + + + + + <html><head/><body><p>Add a beam to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select a wire/sketch that belongs to the structure you want to add.</p><p>2.-Press the AddBeams button</p></body></html> + + + AddBeams + + + + + + + <html><head/><body><p>Remove a beam to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select a beam that belongs to the structure you want to remove.</p><p>2.-Press the RemoveBeams button</p></body></html> + + + RemoveBeams + + + + + + + <html><head/><body><p>Change beam profile to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select the wire / sketch that belongs to the structure</p><p>2.-Select the new profile on the drop down menu</p><p>3.-Press the ChangeProfile button</p></body></html> + + + ChangeProfile + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + 50 + 50 + + + + + 800 + 600 + + + + + 800 + 600 + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 0 + 0 + + + + + 50 + 50 + + + + + 800 + 600 + + + + + 800 + 600 + + + + Qt::DefaultContextMenu + + + + + + false + + + + + + ../iconz/UB_SECTION.png + + + false + + + Qt::AlignCenter + + + false + + + 8 + + + + + + + + + + + + 0 + 0 + + + + Edition + + + + + + + 0 + 0 + + + + + 300 + 200 + + + + 359 + + + Qt::Horizontal + + + false + + + false + + + true + + + 15.000000000000000 + + + true + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Redraw + + + + + + + + 80 + 0 + + + + Qt::AlignCenter + + + <degrees> + + + + + + + + + + + + 80 + 0 + + + + Qt::AlignCenter + + + <name> + + + + + + + Qt::AlignCenter + + + <length> + + + + + + + + + + + <html><head/><body><p>Store the edge or face that will be use has reference for trim or extend beams inside structure object.</p><p>------------------------------------------------------------------------------------------------------------------------</p><p>1.-Select the reference edge or face.</p><p>2.-Press Get targets button to save reference.</p></body></html> + + + Get targets + + + + + + + <html><head/><body><p>Trim or extend selected beam using preselected target as reference.</p><p>Operation can be applied on multiple beam at ones.</p><p>---------------------------------------------------------------------------</p><p>1.-Select the reference beam edge or face.</p><p>2.-Press Trim/Extend button.</p></body></html> + + + Trim/Extend + + + + + + + <html><head/><body><p>Cut miters from structure.</p><p>Important!. Reference planes must be generated first </p><p>---------------------------------------------------------------------------</p><p>1.-Select the structure object to process.</p><p>2.-Press Cut Miters button.</p></body></html> + + + Cut Miters + + + + + + + <html><head/><body><p>Create bisect planes between beams required for cut miter operation.</p><p>---------------------------------------------------------------------------</p><p>1.-Select the structure object to process.</p><p>2.-Press Generate planes button.</p></body></html> + + + Generate planes + + + + + + + + + + + Qt::AlignCenter + + + offset head + + + + + + + -99 + + + Qt::Horizontal + + + + + + + Qt::AlignCenter + + + offset tail + + + + + + + -99 + + + Qt::Horizontal + + + + + + + diff --git a/fFeatures.py b/fFeatures.py index dba33b9..f9bfd47 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -8,7 +8,7 @@ import csv from math import degrees, sqrt, cos, radians, sin, tan from os import listdir -from os.path import abspath, dirname, join +from os.path import abspath, dirname, join, isfile from sys import float_info import ArchProfile @@ -39,6 +39,7 @@ translate = FreeCAD.Qt.translate QT_TRANSLATE_NOOP = FreeCAD.Qt.QT_TRANSLATE_NOOP +settings = QSettings("quetzal","fFeatures") ################ FUNCTIONS ########################### @@ -457,7 +458,7 @@ class frameBranchForm(dodoDialogs.protoTypeDialog): def __init__(self): super(frameBranchForm, self).__init__("fbranch.ui") - self.sectDictList = [] # list (sizes) of properties (dictionaries) of the current type of section + self.LocalSizesDict = [] # list (sizes) of properties (dictionaries) of the current type of section self.form.editAngle.setValidator(QDoubleValidator()) self.form.editAngle.editingFinished.connect(self.changeAngle) self.form.editHead.setValidator(QDoubleValidator()) @@ -465,20 +466,12 @@ def __init__(self): self.form.editTail.setValidator(QDoubleValidator()) self.form.editTail.editingFinished.connect(self.changeTailOffset) self.form.editLength.setValidator(QDoubleValidator()) - tablez = listdir(join(dirname(abspath(__file__)), "tablez")) - files = [name for name in tablez if name.startswith("Section")] - # RatingsList = [s.lstrip("Section_").rstrip(".csv") for s in files] - import ArchProfile - - buffer = list() - self.ArchList = ArchProfile.readPresets() - for rating in self.ArchList: - if rating[1] not in buffer: - buffer.append(rating[1]) - # self.form.comboRatings.addItems(RatingsList) - self.form.comboRatings.addItems(buffer) - self.form.comboRatings.addItems([""]) - self.form.comboRatings.currentIndexChanged.connect(self.fillSizes) + QuetzalRatings = self.fillRatings() + self.form.Rate_comboBox.addItems(QuetzalRatings) + self.form.Rate_comboBox.setCurrentText(settings.value("LastRateApplied")) + self.form.Rate_comboBox.addItems([""]) + self.form.Rate_comboBox.currentIndexChanged.connect(self.fillSizes) + self.form.Sizes_comboBox.currentIndexChanged.connect(self.on_currentIndexChanged) self.form.btnRemove.clicked.connect(self.removeBeams) self.form.btnAdd.clicked.connect(self.addBeams) self.form.btnGenPlanes.clicked.connect(self.generateBisectPlanes) @@ -497,12 +490,22 @@ def __init__(self): self.actionX.triggered.disconnect(self.accept) # disconnect from accept() self.actionX.triggered.connect(self.trim) # reconnect to trim() - def getPropsfromlistSizes(self): + def on_currentIndexChanged(self) -> None: + profilepath = "/home/edgar/.local/share/FreeCAD/Mod/quetzal/iconz/PreviewSections/" + lastsizeselected=self.form.Sizes_comboBox.currentText() + fullimagepath = profilepath+str(lastsizeselected)+".png" + FreeCAD.Console.PrintMessage(fullimagepath+"\r\n") + profilepixmap = QPixmap(fullimagepath) + self.form.ProfileImage.setPixmap(profilepixmap) + + def getPropsfromSizes(self): """ - Check profileslist and return full properties selected on the widget list + Check profileslist and return full properties selected on the widget list from BIM workbench """ - for value in self.ArchList: - if self.form.listSizes.currentItem().text() in value[2]: + for value in self.BIM_PropList: + if self.form.Sizes_comboBox.currentText() in value[2]: + settings.setValue("LastRateApplied",self.form.Rate_comboBox.currentText()) + settings.setValue("LastSizeApplied",self.form.Sizes_comboBox.currentText()) return value def makeSingle(self): @@ -511,11 +514,18 @@ def makeSingle(self): ) if self.SType == "": profile = FreeCAD.ActiveDocument.getObjectsByLabel( - self.form.listSizes.currentItem().text() + self.form.Sizes_comboBox.currentText() )[0] else: - prop = self.getPropsfromlistSizes() - # prop = self.sectDictList[self.form.listSizes.currentRow()] + #Properties from selected row dict to list from BIM + prop = self.getPropsfromSizes() + # FreeCAD.Console.PrintMessage(prop) + if len(self.LocalSizesDict) != 0: + # prop2 = self.sectDictList[self.form.Sizes_comboBox.currentRow()] + index=self.form.Sizes_comboBox.currentIndex() + #Convert localsizedict to list + # prop2 = list(self.LocalSizesDict[index].values()) + # prop=prop2 FreeCAD.Console.PrintMessage(prop) profile = makeProfile(prop) # profile = newProfile(prop) @@ -712,12 +722,12 @@ def generateBisectPlanes(self): if (content) or (contentsub): # FreeCAD.Console.PrintMessage('Punto de interseccion: '+str(interVertex[0])+'\r\n') # Store edge pair that intersect - FreeCAD.Console.PrintMessage( - "Reachedlines: {0} and {1}".format( - reachedlines[rep][0], reachedlines[rep][1] - ) - + "\r\n" - ) + # FreeCAD.Console.PrintMessage( + # "Reachedlines: {0} and {1}".format( + # reachedlines[rep][0], reachedlines[rep][1] + # ) + # + "\r\n" + # ) rep = rep + 1 # FIXME: intersectCC method does not return line intersection; findIntersection method does it right # interpoint=element.intersectCC(subelement)[0] @@ -738,6 +748,7 @@ def generateBisectPlanes(self): subelement.StartPoint - subelement.EndPoint ) bisectvector = fCmd.bisect(resultv1, resultv2) + # FreeCAD.Console.PrintMessage('Vector bisector: '+str(bisectvector)+'\r\n') plane = FreeCAD.activeDocument().addObject( "Part::Plane", "cutplane" ) @@ -759,7 +770,7 @@ def generateBisectPlanes(self): self.placementrotplan = FreeCAD.Placement( self.rotvector, FreeCAD.Rotation(FreeCAD.Vector(0, 1, 0), 90) ) - plane.AttachmentOffset = self.placementrotplan + plane.Placement = self.placementrotplan # FreeCAD.Console.PrintMessage('Antes Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') # crossvector=resultv1.cross(resultv2).normalize() # FreeCAD.Console.PrintMessage('Vector cruz: '+str(crossvector)+'\r\n') @@ -769,7 +780,7 @@ def generateBisectPlanes(self): FreeCAD.Rotation(plane.Shape.normalAt(0, 0), bisectvector), interVertex[0], ).multiply(self.placementrotplan) - # plane.AttachmentOffset = self.placementrelative + # plane.Placement = self.placementrelative # FreeCAD.Console.PrintMessage('Despues Angulo de arista a vector bisectriz: '+str((FreeCAD.Rotation(bisectvector,plane.Shape.normalAt(0,0)).Angle)*180/pi)+'\r\n') if self.roundVectors( plane.Shape.normalAt(0, 0), 0 @@ -782,7 +793,7 @@ def generateBisectPlanes(self): FreeCAD.Rotation(FreeCAD.Vector(0, 0, 1), rotateplane), interVertex[0], ).multiply(self.placementrelative) - plane.AttachmentOffset = self.placementfinal + plane.Placement = self.placementfinal # FreeCAD.Console.PrintMessage(str(plane.Name)) # sel[0].cutplanes.append(plane.Name) # TODO::Made method definition to change plane dots colors @@ -799,17 +810,18 @@ def accept(self): if FreeCAD.ActiveDocument: # GET BASE bases = [b for b in FreeCADGui.Selection.getSelection() if hasattr(b, "Shape")] - if bases and self.form.listSizes.selectedItems(): + if bases: FreeCAD.activeDocument().openTransaction( translate("Transaction", "Insert Frame Branch") ) if self.SType == "": profile = FreeCAD.ActiveDocument.getObjectsByLabel( - self.form.listSizes.currentItem().text() + self.form.Sizes_comboBox.currentText() )[0] else: # prop = self.sectDictList[self.form.listSizes.currentRow()] - prop = self.getPropsfromlistSizes() + prop = self.getPropsfromSizes() + # FreeCAD.Console.PrintMessage(prop) profile = makeProfile(prop) # profile = newProfile(prop) # MAKE FRAMEBRANCH @@ -878,14 +890,30 @@ def mouseActionB1(self, CtrlAltShift): self.form.dialAngle.setValue(0) self.form.lab1.setText("") + def fillRatings(self): + """ + Fill standard section profiles name into ratings list + """ + tablez = listdir(join(dirname(abspath(__file__)), "tablez")) + files = [name for name in tablez if name.startswith("Section")] + QuetzalRatings = [s.lstrip("Section_").rstrip(".csv") for s in files] + self.BIM_PropList = ArchProfile.readPresets() + "Avoid to add dublicated ratings names in widget" + for rating in self.BIM_PropList: + if rating[1] not in QuetzalRatings: + QuetzalRatings.append(rating[1]) + return QuetzalRatings + def fillSizes(self): """ - Fill standard beam sizes into a framebeams widget + Fill standard beam sizes into a framebeams widget based on previus selected rating """ - self.SType = self.form.comboRatings.currentText() - self.form.listSizes.clear() + "Selected rating" + self.SType = self.form.Rate_comboBox.currentText() + "Clean list of sizes" + self.form.Sizes_comboBox.clear() if self.SType == "": - self.form.listSizes.addItems( + self.form.Sizes_comboBox.addItems( [ s.Label for s in FreeCAD.ActiveDocument.Objects @@ -897,23 +925,31 @@ def fillSizes(self): for s in FreeCAD.ActiveDocument.Objects if hasattr(s, "Shape") and s.Shape.Faces and not s.Shape.Solids ] - self.form.listSizes.addItems(obj2D) + self.form.Sizes_comboBox.addItems(obj2D) else: - sizelist = list() - for profilesizes in self.ArchList: - if profilesizes[1] == self.form.comboRatings.currentText(): + temp_sizelist = list() + "Retrieved ratings from BIM csv library" + for profilesizes in self.BIM_PropList: + if profilesizes[1] == self.form.Rate_comboBox.currentText() and profilesizes[2] not in temp_sizelist: # FreeCAD.Console.PrintMessage(profilesizes[2]+'\r\n') - sizelist.append(profilesizes[2]) - self.form.listSizes.addItems(sizelist) - # fileName = "Section_" + self.SType + ".csv" - # f = open(join(dirname(abspath(__file__)), "tablez", fileName), "r") - # reader = csv.DictReader(f, delimiter=";") - # self.sectDictList = [x for x in reader] - self.sectDictList = [x for x in self.ArchList] - # f.close() - # for row in self.sectDictList: - # s = row["SSize"] - # self.form.listSizes.addItem(s) + temp_sizelist.append(profilesizes[2]) + "Add BIM list to listSizes" + self.form.Sizes_comboBox.addItems(temp_sizelist) + self.form.Sizes_comboBox.setCurrentText(settings.value("LastSizeApplied")) + "Retrieved profiles sizes from quetzal tablez" + # "Create file name based on rating selection" + # "Open quetzal CSV file based on rating selection" + fileName = "Section_" + self.SType + ".csv" + filepath = join(dirname(abspath(__file__)), "tablez", fileName) + if isfile(filepath): + f = open(filepath, "r") + reader = csv.DictReader(f, delimiter=";") + self.LocalSizesDict = [x for x in reader] + for row1 in self.LocalSizesDict: + s1 = row1["SSize"] + # FreeCAD.Console.PrintMessage(s1+"\r\n") + self.form.Sizes_comboBox.addItem(s1) + f.close() def addBeams(self): # find selected FB @@ -975,13 +1011,13 @@ def changeProfile(self): except: FreeCAD.Console.PrintError("Nothing selected\n") return - if FB and self.form.listSizes.selectedItems(): + if FB: if self.SType == "": profile = FreeCAD.ActiveDocument.getObjectsByLabel( - self.form.listSizes.currentItem().text() + self.form.Sizes_comboBox.currentText() )[0] else: - prop = self.getPropsfromlistSizes() + prop = self.getPropsfromSizes() # prop = self.sectDictList[self.form.listSizes.currentRow()] # profile = newProfile(prop) profile = makeProfile(prop) @@ -1339,7 +1375,7 @@ def onDelete(self, feature, subelements): # subelements is a tuple of strings def doProfile(typeS="RH", label="Square", dims=[50, 100, 5])->FreeCAD.DocumentObject: "doProfile(typeS, label, dims)" - if typeS in ["RH", "R", "H", "U", "L", "T", "Z", "omega", "circle"]: + if typeS in ["RH", "R", "H", "U", "L", "T","TSLOT", "Z", "omega", "circle"]: profile = [0, "SECTION", label, typeS] + dims # for py2.6 versions obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython", profile[2]) # FIXME: if profile[3] == "RH": @@ -1351,6 +1387,8 @@ def doProfile(typeS="RH", label="Square", dims=[50, 100, 5])->FreeCAD.DocumentOb _ProfileChannel(obj, profile) elif profile[3] == "T": _ProfileT(obj, profile) + elif profile[3] == "TSLOT": + _ProfileTSLOT(obj, profile) elif profile[3] == "H": _ProfileH(obj, profile) elif profile[3] == "L": @@ -1520,10 +1558,25 @@ def pointsZ(H:float, W:float, t1:float, t2:float)->list[Vector]: p8 = Vector(H - t1 / 2, -W / 2, 0) return [p1, p8, p7, p6, p5, p4, p3, p2, p1] -def pointsTslot(H:float, W:float): - pass +def pointsTSLOT(H:float, W:float, slot_width:float, slot_depth:float): #TODO: - # p1 = Vector() + Polivect =[] + Polivect.append(Vector(0, 2.1, 0)) + Polivect.append(Vector(0, 3.8, 0)) + Polivect.append(Vector(2.74, 3.8, 0)) + Polivect.append(Vector(6, 7.06, 0)) + Polivect.append(Vector(6, 8.5, 0)) + Polivect.append(Vector(2.63, 8.5, 0)) + Polivect.append(Vector(2.63, 10, 0)) + Polivect.append(Vector(10, 10, 0)) + Polivect.append(Vector(10,2.63,0)) + Polivect.append(Vector(8.5, 2.63, 0)) + Polivect.append(Vector(8.5, 6, 0)) + Polivect.append(Vector(7.06, 6, 0)) + Polivect.append(Vector(3.8, 2.74, 0)) + Polivect.append(Vector(3.8, 0, 0)) + Polivect.append(Vector(2.1, 0, 0)) + return [px for px in Polivect] ########### _ ProfileXXX() classes ############### @@ -1587,6 +1640,47 @@ def execute(self, obj:FreeCAD.DocumentObject)->None: q = Part.makePolygon([q1, q2, q3, q4, q1]) obj.Shape = Part.Face(p).cut(Part.Face(q)) +class _ProfileTSLOT(_Profile): + """A parametric Rectangular hollow beam profile. Profile data: [width, height, thickness]""" + + def __init__(self, obj:FreeCAD.DocumentObject, profile:list[str])->None: + obj.Label = translate("Objects", "Rectangular t-slot profile", "Profile name in the Tree View") + obj.addProperty( + "App::PropertyString", + "FType", + "Profile", + QT_TRANSLATE_NOOP("App::Property", "Type of section"), + ).FType = "TSLOT" + obj.addProperty( + "App::PropertyLength", + "W", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Width of the beam"), + ).W = profile[4] + obj.addProperty( + "App::PropertyLength", + "H", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Height of the beam"), + ).H = profile[5] + obj.addProperty( + "App::PropertyLength", + "t1", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Thickness of the vertical sides"), + ).slot_width = profile[6] + obj.addProperty( + "App::PropertyLength", + "t2", + "Draft", + QT_TRANSLATE_NOOP("App::Property", "Thickness of the horizontal sides"), + ).slot_depth = profile[7] + _Profile.__init__(self, obj, profile) + + def execute(self, obj:FreeCAD.DocumentObject)->None: + W, H, t1, t2 = obj.W.Value, obj.H.Value, obj.slot_width.Value, obj.slot_depth.Value + obj.Shape = drawAndCenter(pointsTSLOT(H,W,slot_width,slot_depth)) + class _ProfileR(_Profile): """A parametric Rectangular solid beam profile. Profile data: [width, height]""" diff --git a/iconz/PreviewSections/RHS100x50x3.2.png b/iconz/PreviewSections/RHS100x50x3.2.png new file mode 100644 index 0000000000000000000000000000000000000000..06378aad28a2d927a465e0ad9745d62d004a6103 GIT binary patch literal 23346 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 Rh;2)Nhnjl#>(vpj{s&~ZvMK-o literal 0 HcmV?d00001 diff --git a/iconz/PreviewSections/RHS50x30x3.png b/iconz/PreviewSections/RHS50x30x3.png new file mode 100644 index 0000000000000000000000000000000000000000..c94f7d870dbd1c955701bd21e3f472d9ea424080 GIT binary patch literal 9473 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 literal 0 HcmV?d00001 diff --git a/iconz/PreviewSections/RHS50x30x4.png b/iconz/PreviewSections/RHS50x30x4.png new file mode 100644 index 0000000000000000000000000000000000000000..6287b9289dd41572ad1427c83b08b5c6c6ce198b GIT binary patch literal 9762 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 literal 0 HcmV?d00001 diff --git a/iconz/PreviewSections/RHS80x40x2.9.png b/iconz/PreviewSections/RHS80x40x2.9.png new file mode 100644 index 0000000000000000000000000000000000000000..04c5dac466c99309b82e855097bff00a795af730 GIT binary patch literal 17196 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 literal 0 HcmV?d00001 diff --git a/iconz/PreviewSections/RHS90x50x3.png b/iconz/PreviewSections/RHS90x50x3.png new file mode 100644 index 0000000000000000000000000000000000000000..afdd27b2c1fa6221a9e324d4996defa5bc099c1a GIT binary patch literal 21282 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 Date: Sun, 30 Nov 2025 20:10:22 -0600 Subject: [PATCH 129/135] feature(profiles): include local parameters t-slot profile --- tablez/Section_TSLOT.csv | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tablez/Section_TSLOT.csv diff --git a/tablez/Section_TSLOT.csv b/tablez/Section_TSLOT.csv new file mode 100644 index 0000000..32c4d43 --- /dev/null +++ b/tablez/Section_TSLOT.csv @@ -0,0 +1,21 @@ +SSize;stype;H;W;slot_width;slot_depth;;;;;;;;; +T-Slot2020;TSLOT;20;20;4;8;;;;;;;;; +T-Slot2525;TSLOT;120;114;5;8;;;;;;;;; +T-Slot3030;TSLOT;140;133;5.5;8.5;;;;;;;;; +T-Slot4040;TSLOT;0;152;6;9;;;;;;;;; +T-Slot4040-L;TSLOT;0;171;6;9.5;;;;;;;;; +T-Slot4040-UL;TSLOT;0;190;6.5;10;;;;;;;;; +T-Slot4080;TSLOT;0;210;7;11;;;;;;;;; +T-Slot4080-L;TSLOT;230;7.5;12;;;;;;;;; +T-Slot4545;TSLOT;0;250;7.5;12.5;;;;;;;;; +T-Slot4545-L;TSLOT;0;250;7.5;12.5;;;;;;;;; +T-Slot2550;TSLOT;0;270;8;13;;;;;;;;; +T-Slot2514;TSLOT;0;290;8.5;14;;;;;;;;; +T-Slot2040;TSLOT;0;310;9;15.5;;;;;;;;; +T-Slot8080;TSLOT;0;330;9.5;16.5;;;;;;;;; +T-Slot4003;TSLOT;300;350;10;17.5;;;;;;;;; +T-Slot5050;TSLOT;300;350;10;17.5;;;;;;;;; +T-Slot2576;TSLOT;300;350;10;17.5;;;;;;;;; +T-Slot3060;TSLOT;300;350;10;17.5;;;;;;;;; +T-Slot4590;TSLOT;300;350;10;17.5;;;;;;;;; +T-Slot9090;TSLOT;300;350;10;17.5;;;;;;;;; From e132189de092916babe6574dca1338fde1c10933 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 30 Nov 2025 20:12:39 -0600 Subject: [PATCH 130/135] docs(framemanager): update traslations --- translationz/Quetzal.ts | 935 +++++++++++++++++---------------- translationz/Quetzal_es-ES.qm | Bin 50592 -> 57550 bytes translationz/Quetzal_es-ES.ts | 941 ++++++++++++++++++---------------- 3 files changed, 995 insertions(+), 881 deletions(-) diff --git a/translationz/Quetzal.ts b/translationz/Quetzal.ts index af70714..0f58452 100644 --- a/translationz/Quetzal.ts +++ b/translationz/Quetzal.ts @@ -4,188 +4,193 @@ App::Property - - + + The extension of the tail - - + + The extension of the head - - + + The rotation of the section - - + + Type of frameFeature - + Size of frame - + the edges - + the profile - + The beams names - - + + The path. - + The profile - - - - - - - - - - - + + + + + + + + + + + + Type of section - - - - - - - - + + + + + + + + + Width of the beam - - - - - - - - - - + + + + + + + + + + + Height of the beam - + + Thickness of the vertical sides - + + Thickness of the horizontal sides - + Diameter of the beam - + Thickness - - - - + + + + Thickness of the webs - - + + Radius of corner r1 - - + + Radius of corner r2 - - - + + + Thickness of the web - + Thickness of the flanges - + Width of the flanges - - - + + + Thickness 1 - - - + + + Thickness 2 - - - + + + Thickness 3 - - + + Width of the bottom flange - - + + Width of the top flange @@ -206,7 +211,7 @@ - + Ports position relative to the origin of Shape @@ -217,240 +222,256 @@ - - - - - + + + + + + Outside diameter - - - - - - + + + + + + Wall thickness - - - + + + Inside diameter - + Length of tube - - - + + + Section dim. - + + Overall length + + + + + Support width + + + + + Outside thread side + + + + Bend Angle - - + + Bend Radius - + Type of flange - + Flange diameter - + Bore diameter - + Bolts distance - + Bolts hole diameter - + Thickness of flange - + Nr. of bolts - + Thickness of raised face - + Diameter of raised face - + Length of welding neck - + Diameter of welding neck - + Outside diameter of pipe - + Flange fillet radius - + Flange neck length - + Socket diameter - + Socket depth - + Major diameter - + Minor diameter - + Make the length variable - + Length of reduction - + Concentric or Eccentric - + the radius of bending - + The group. - + Type of pipeFeature - + Type of clamp - + Size of clamp - + Arc diameter - + Overall height - + Rod diameter - + Size of thread - + Tank's length - + Tank's width - + Tank's height - + Thickness of tank's shell - + Thickness of tank's top - + The tubes of the branch. - + The curves of the branch. @@ -458,7 +479,7 @@ App::PropertyString - + The group. @@ -847,92 +868,152 @@ DialogFBranch - + FrameBranch Manager - + AddBeams - + Generate planes - + RemoveBeams - + + Creation + + + + + Rate: + + + + + Size: + + + + + <html><head/><body><p>Create a single beam.</p><p>if a wire is previous selected beam will reorientade normal to wire but no based frame will be created.</p></body></html> + + + + + <html><head/><body><p>Add a beam to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select a wire/sketch that belongs to the structure you want to add.</p><p>2.-Press the AddBeams button</p></body></html> + + + + + <html><head/><body><p>Remove a beam to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select a beam that belongs to the structure you want to remove.</p><p>2.-Press the RemoveBeams button</p></body></html> + + + + + <html><head/><body><p>Change beam profile to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select the wire / sketch that belongs to the structure</p><p>2.-Select the new profile on the drop down menu</p><p>3.-Press the ChangeProfile button</p></body></html> + + + + + Edition + + + + + <html><head/><body><p>Store the edge or face that will be use has reference for trim or extend beams inside structure object.</p><p>------------------------------------------------------------------------------------------------------------------------</p><p>1.-Select the reference edge or face.</p><p>2.-Press Get targets button to save reference.</p></body></html> + + + + Cut Miters - + offset head - + <no target selected> - + <degrees> - + Add single - + <length> - + + <html><head/><body><p>Trim or extend selected beam using preselected target as reference.</p><p>Operation can be applied on multiple beam at ones.</p><p>---------------------------------------------------------------------------</p><p>1.-Select the reference beam edge or face.</p><p>2.-Press Trim/Extend button.</p></body></html> + + + + + <html><head/><body><p>Cut miters from structure.</p><p>Important!. Reference planes must be generated first </p><p>---------------------------------------------------------------------------</p><p>1.-Select the structure object to process.</p><p>2.-Press Cut Miters button.</p></body></html> + + + + + <html><head/><body><p>Create bisect planes between beams required for cut miter operation.</p><p>---------------------------------------------------------------------------</p><p>1.-Select the structure object to process.</p><p>2.-Press Generate planes button.</p></body></html> + + + + hotkeys: "S" to select, "X" to trim - + Get targets - + offset tail - + Redraw - + Trim/Extend - + <no item selected> - + ChangeProfile - + <name> @@ -1337,101 +1418,107 @@ profile Objects - + Rectangular hollow Profile name in the Tree View - + + Rectangular t-slot profile + Profile name in the Tree View + + + + Rectangular solid Profile name in the Tree View - + Circle-profile Profile name in the Tree View - + L-profile Profile name in the Tree View - + U-profile Profile name in the Tree View - + T-profile Profile name in the Tree View - + Z-profile Profile name in the Tree View - + Omega-profile Profile name in the Tree View - + H-profile Profile name in the Tree View - + Tube - + Elbow - + Flange - + Reduct - + U-Bolt - + Tank - + Cap - + Valve - + Pipe route @@ -1439,12 +1526,12 @@ profile Quetzal_AdjustFrameAngle - + Adjust frame angle - + Adjust the angle of frame by two edges @@ -1452,12 +1539,12 @@ profile Quetzal_AlignEdge - + Mate the edges - + Join two edges: select two or pre-select several @@ -1465,12 +1552,12 @@ profile Quetzal_AlignFlange - + Align flange - + Rotates the section of the beam to make the faces parallel to another face @@ -1478,12 +1565,12 @@ profile Quetzal_Attach2Tube - + Attach to tube - + Attach one pype to the nearest port of selected pipe @@ -1491,12 +1578,12 @@ profile Quetzal_BreakPipe - + Break the pipe - + Break one pipe at point and insert gap @@ -1504,7 +1591,7 @@ profile Quetzal_CapQM - + QM for caps @@ -1525,7 +1612,7 @@ profile Quetzal_ElbowQM - + QM for elbows @@ -1533,12 +1620,12 @@ profile Quetzal_ExtendBeam - + Extend the beam - + Extend the beam either to a face, a vertex or the c.o.m. of the selected object @@ -1546,12 +1633,12 @@ profile Quetzal_ExtendIntersection1 - + Extend pipe to intersection - + Extends pipe to intersection @@ -1559,12 +1646,12 @@ profile Quetzal_ExtendIntersection2 - + Extend pipes to intersection - + Extends pipes to intersection @@ -1572,7 +1659,7 @@ profile Quetzal_FlangeQM - + QM for flanges @@ -1580,51 +1667,41 @@ profile Quetzal_Flat - + Fit one elbow - - Place the elbow between two pipes or beams + + Place a existing elbow between two pipes adjusting lenght pipes Quetzal_FrameBranchManager - + FrameBranch Manager - - - Open FrameBranch Manager - - Quetzal_FrameIt - + Place one-beam over one-edge - - - Place one beam after the other over the edges - - Quetzal_HackedLine - + Draw a Draft wire - + WP is re-positioned at each point. Possible to spin and offset it. @@ -1632,12 +1709,12 @@ profile Quetzal_InsertAnyShape - + Insert any shape - + Insert a STEP, IGES or BREP @@ -1645,12 +1722,12 @@ profile Quetzal_InsertBranch - + Insert a branch - + Insert a PypeBranch @@ -1658,8 +1735,8 @@ profile Quetzal_InsertCap - - + + Insert a cap @@ -1668,16 +1745,15 @@ profile Quetzal_InsertElbow - - Insert a curve + Insert a elbow Quetzal_InsertFlange - - + + Insert a flange @@ -1685,12 +1761,12 @@ profile Quetzal_InsertPath - + Insert path - + Creates one path along selected edges @@ -1699,7 +1775,6 @@ profile Quetzal_InsertPipe - Insert a tube @@ -1707,12 +1782,12 @@ profile Quetzal_InsertPypeLine - + PypeLine Manager - + Open PypeLine Manager @@ -1720,8 +1795,8 @@ profile Quetzal_InsertReduct - - + + Insert a reduction @@ -1729,12 +1804,12 @@ profile Quetzal_InsertRoute - + Insert a pipe route - + Create a sketch attached to a circular edge @@ -1742,12 +1817,12 @@ profile Quetzal_InsertSection - + Insert sections - + Creates customized beam profiles 2D @@ -1755,21 +1830,30 @@ profile Quetzal_InsertTank - + Insert a tank - + Create tank and nozzles + + Quetzal_InsertTerminalAdapter + + + + Insert Terminal adapter + + + Quetzal_InsertUbolt - - + + Insert a U-bolt @@ -1777,8 +1861,8 @@ profile Quetzal_InsertValve - - + + Insert a valve @@ -1786,12 +1870,12 @@ profile Quetzal_JoinPype - + Join pipes - + Select the part-pype and the port @@ -1799,12 +1883,12 @@ profile Quetzal_Laydown - + Lay-down the pipe - + Lay-down the pipe on the support plane @@ -1812,25 +1896,20 @@ profile Quetzal_LevelBeam - + Flush the surfaces - - - Shift the beams to line-up the faces to the first selection (faces must be //) - - Quetzal_MakeHeader - + Connect to header - + Connect branches to one header pipe Branches and header's axes must be ortho @@ -1839,12 +1918,12 @@ Branches and header's axes must be ortho Quetzal_MateEdges - + Mate pipes edges - + Mate two terminations through their edges @@ -1852,12 +1931,12 @@ Branches and header's axes must be ortho Quetzal_MoveHandle - + Move objects - + Move quickly objects inside viewport @@ -1865,12 +1944,12 @@ Branches and header's axes must be ortho Quetzal_MoveWorkPlane - + Align workplane - + Moves and rotates the drafting workplane with points, edges and faces @@ -1878,22 +1957,22 @@ Branches and header's axes must be ortho Quetzal_OffsetWorkPlane - + Offset Work Plane - + Offset: - + Offset workplane - + Shifts the WP along its normal. @@ -1901,7 +1980,7 @@ Branches and header's axes must be ortho Quetzal_PipeQM - + QM for pipes @@ -1909,25 +1988,20 @@ Branches and header's axes must be ortho Quetzal_PivotBeam - + Pivot the beam - - - Rotates the beam around an axis (edge or center-of-curvature) - - Quetzal_Point2Point - + Draw a tube point by point - + A new body is created on each click on subsequent points @@ -1935,12 +2009,12 @@ Branches and header's axes must be ortho Quetzal_PressureLossCalculator - + Pressure loss calculator - + Calculate pressure loss in 'pypes' using ChEDL libraries. See __doc__ of the module for further information. @@ -1949,12 +2023,12 @@ See __doc__ of the module for further information. Quetzal_QueryModel - + Query the model - + Click objects to print infos @@ -1962,12 +2036,12 @@ See __doc__ of the module for further information. Quetzal_Raiseup - + Raise-up the support - + Raise the support to the pipe @@ -1975,25 +2049,20 @@ See __doc__ of the module for further information. Quetzal_ReverseBeam - + Reverse orientation - - - Reverse the orientation of selected objects - - Quetzal_RotateJoin - + Rotate join to edge - + Rotates and align the beam according another edge @@ -2001,12 +2070,12 @@ See __doc__ of the module for further information. Quetzal_RotateWorkPlane - + Rotate workplane - + Spin the Draft working plane about one of its axes @@ -2014,12 +2083,12 @@ See __doc__ of the module for further information. Quetzal_SelectSolids - + Select solids - + Grab all solids or those partially selected to export in .step format @@ -2028,38 +2097,28 @@ See __doc__ of the module for further information. Quetzal_ShiftBeam - + Shift the beam - - - Translate objects by vectors defined on existing geometry - - Quetzal_SpinSection - + Spin beams by 45 deg. - - - Rotates the section of the beam by 45 degrees - - Quetzal_StretchBeam - + Stretch the beam - + Changes the length of the beam, either according a preselected edge or a direct input @@ -2067,7 +2126,7 @@ See __doc__ of the module for further information. Quetzal_ValveQM - + QM for valves @@ -2075,87 +2134,57 @@ See __doc__ of the module for further information. Transaction - - Spin - - - - - Reverse - - - - - Level The Beams - - - - - Align Edge - - - - - Rotate to Join on Edge - - - - - Make Path - - - - + Mate - + Extend pipes to intersection - + Extend pipe to intersection - + Lay-down the pipe - + Raise-up the support - + Attach to tube - + Connect to header - + Insert Single Structure - + Insert Frame Branch - + Trim Frame Branch - + Update Frame Line @@ -2190,12 +2219,12 @@ See __doc__ of the module for further information. - + Insert profile - + Modify profile @@ -2205,92 +2234,93 @@ See __doc__ of the module for further information. - + Insert pipe - + Insert elbow - + Insert flange - + Insert cap - + Insert valve - + Place one curve - + Redraw pipe-lines - + Trim pipes - + + Insert reduction - + Insert clamp in (0,0,0) - + Insert clamp on tube - + Insert pipe line - + Assign Base - + Insert pipe branch - + Break pipes - + Point to Point - + Add nozzles - + Make pipe route @@ -2313,36 +2343,41 @@ See __doc__ of the module for further information. - + + Frame tools - + Utils - - + Draft snap + + + + + Pipe tools - + QM Menus - + Frames - + Pipes @@ -2350,33 +2385,35 @@ See __doc__ of the module for further information. breakForm - + Break the pipes - + Length - + <reference> - + PypeLine: - - + + + + <none> - + <new> @@ -2506,17 +2543,17 @@ See __doc__ of the module for further information. insertBranchForm - + Insert a branch - + <name> - + <bend radius> @@ -2524,17 +2561,17 @@ See __doc__ of the module for further information. insertCapForm - + Insert caps - + Reverse - + Apply @@ -2542,48 +2579,48 @@ See __doc__ of the module for further information. insertElbowForm - + Insert elbows - + <bend angle> - + <bend radius> - + Trim/Extend - + Reverse - + Apply - + 0 deg - + Wrong selection - + deg @@ -2591,40 +2628,45 @@ See __doc__ of the module for further information. insertFlangeForm - + Insert flanges - + Reverse - + Apply + + + Remove pipe equivalent length + + insertPipeForm - + Insert pipes - + <length> - + Reverse - + Apply @@ -2632,48 +2674,48 @@ See __doc__ of the module for further information. insertPypeLineForm - + PypeLine Manager - + <name> - + Redraw - + Part list - + Color - + Get Path - + Get Profile - - - - - - - + + + + + + + <new> @@ -2681,22 +2723,24 @@ See __doc__ of the module for further information. insertReductForm - + Insert reductions - + + Reverse - + + Apply - + Eccentric @@ -2704,40 +2748,48 @@ See __doc__ of the module for further information. insertRouteForm - + <select an edge> + + insertTerminalAdapter + + + Insert terminal adapter + + + insertUboltForm - + Insert U-bolt - + - no ref. face - - + Ref. face - + Head - + Middle - + Tail @@ -2745,22 +2797,22 @@ See __doc__ of the module for further information. insertValveForm - + Insert valves - + Reverse - + Apply - + Insert in pipe @@ -2768,7 +2820,7 @@ See __doc__ of the module for further information. makeframenbranch - + Structure @@ -2776,7 +2828,7 @@ See __doc__ of the module for further information. mouseActionB1 - + ____TAIL @@ -2784,12 +2836,12 @@ See __doc__ of the module for further information. pForms - + Offset Work Plane - + Offset: @@ -2797,12 +2849,12 @@ See __doc__ of the module for further information. point2pointPipe - + Reset - + Move WP on click @@ -2810,7 +2862,7 @@ See __doc__ of the module for further information. profEdit - + Shift profile @@ -2818,13 +2870,18 @@ See __doc__ of the module for further information. protoPypeForm - - + + Rating: - + + <none> + + + + Insert @@ -2832,17 +2889,17 @@ See __doc__ of the module for further information. protoTypeDialog - + "%s" to select; "%s" to execute - + No view available. - + Actions "%s" and "%s" removed @@ -2863,18 +2920,18 @@ See __doc__ of the module for further information. uCmd - + Quick move Transaction - + Offset Work Plane - + Offset: diff --git a/translationz/Quetzal_es-ES.qm b/translationz/Quetzal_es-ES.qm index 4ab2b13e0c5d6822ca6409a3e38c183e41116d1e..3094b0ddde23bb25b7ec6ebc4bb1457dd086a20f 100644 GIT binary patch delta 12080 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 E4|5@(&j0`b delta 5355 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 Y&S^b=Q10Au<(!;1W(PRWU6XMC3(A5MqyPW_ diff --git a/translationz/Quetzal_es-ES.ts b/translationz/Quetzal_es-ES.ts index c75d6fb..a0ac0dd 100644 --- a/translationz/Quetzal_es-ES.ts +++ b/translationz/Quetzal_es-ES.ts @@ -5,396 +5,412 @@ App::Property - - - - - + + + + + + Outside diameter Diámetro exterior - - - - - - + + + + + + Wall thickness Espesor de muro - - - + + + Inside diameter Diámetro interno - + Length of tube Longitud del tubo - - - + + + Section dim. Dimensión de sección. - + + Support width + Ancho de soporte + + + + Outside thread side + Tamaño de rosca exterior + + + Bend Angle Ángulo de doblez - - + + Bend Radius Radio de doblez - + Type of flange Tipo de brida - + Flange diameter Diámetro de brida - + Bore diameter Diámetro de orificio - + Bolts distance Distancia de pernos - + Bolts hole diameter Diámetro de orificio para perno - + Thickness of flange Espesor de brida - + Nr. of bolts Numero de pernos - + Thickness of raised face Espesor de cara elevada - + Diameter of raised face Diámetro de cara elevada - + Length of welding neck Longitud de cuello para soldadura - + Diameter of welding neck Diámetro de cuello para soldadura - + Outside diameter of pipe Diámetro exterior de tubería - + Flange fillet radius Diámetro de redondeo de brida - + Socket diameter Diámetro de zócalo - + Socket depth Profundidad de zócalo - + Major diameter Diámetro mayor - + Minor diameter Diámetro menor - + Make the length variable Hace la longitud variable - + Length of reduction Longitud de reducción - + Concentric or Eccentric Concéntrico o excéntrico - + the radius of bending El radio de doblez - + Thickness of tank's shell Espesor de carcasa del depósito - + Thickness of tank's top Espesor superior del depósito - - + + The extension of the tail La extensión de la cola - - + + The extension of the head La extensión de la cabecera - - + + The rotation of the section La rotación de la sección - - + + Type of frameFeature Tipo de característica de marco - + Size of frame Tamaño de marco - + The group. El grupo. - + the edges Los bordes - + the profile El perfil - + The beams names Los nombres de las vigas - + The profile El perfil - - - - - - - - - - - + + + + + + + + + + + + Type of section Tipo de sección - - - - - - - - + + + + + + + + + Width of the beam Ancho de la viga - - - - - - - - - - + + + + + + + + + + + Height of the beam Alto de la viga - + + Thickness of the vertical sides Espesor de los lados verticales - + + Thickness of the horizontal sides Espesor de los lados horizontales - + Diameter of the beam Diámetro de la viga - + Thickness Espesor - - - - + + + + Thickness of the webs Espesor de la redes - - + + Radius of corner r1 Radio de esquina r1 - - + + Radius of corner r2 Radio de esquina r2 - - - + + + Thickness of the web Espesor de la red - + Thickness of the flanges Espesor de las bridas - + Width of the flanges Ancho de las bridas - - - + + + Thickness 1 Espesor 1 - - - + + + Thickness 2 Espesor 2 - - - + + + Thickness 3 Espesor 3 - - + + Width of the bottom flange Ancho inferior de la brida - - + + Width of the top flange Ancho superior de la brida - + Type of pipeFeature Tipo de característica de tubo - + Type of clamp Tipo de sujeción - + Size of clamp Tamaño de sujeción - + Arc diameter Diámetro de arco - + Overall height Altura total - + Rod diameter Diámetro de vástago - + Size of thread Tamaño de rosca - + Ports position relative to the origin of Shape Posición de los puertos relativos al origen de la forma @@ -419,38 +435,43 @@ Factor de flujo (m3/h/bar) - + + Overall length + Longitud total + + + Flange neck length Longitud de cuello de brida - + Tank's length Longitud de depósito - + Tank's width Ancho de depósito - + Tank's height Altura de depósito - + The tubes of the branch. Tubos de la derivación. - + The curves of the branch. Las curvas de la derivación. - - + + The path. La ruta. @@ -458,7 +479,7 @@ App::PropertyString - + The group. El grupo. @@ -849,92 +870,152 @@ DialogFBranch - + FrameBranch Manager Gestor de marcos ramificados - + + <html><head/><body><p>Trim or extend selected beam using preselected target as reference.</p><p>Operation can be applied on multiple beam at ones.</p><p>---------------------------------------------------------------------------</p><p>1.-Select the reference beam edge or face.</p><p>2.-Press Trim/Extend button.</p></body></html> + <html><head/><body><p>Corta o extiende la viga seleccionada utilizando referencia preseleccionada.</p><p>Operacion puede ser aplicada a multiples vigas a la vez.</p><p>---------------------------------------------------------------------------</p><p>1.-Selecciona la arista o cara de la viga.</p><p>2.-Presiona el boton Cortar/Extender.</p></body></html> + + + + <html><head/><body><p>Cut miters from structure.</p><p>Important!. Reference planes must be generated first </p><p>---------------------------------------------------------------------------</p><p>1.-Select the structure object to process.</p><p>2.-Press Cut Miters button.</p></body></html> + <html><head/><body><p>Corta ingletes en estructura.</p><p>Importante!. Planos de referencia deben generarse primero </p><p>---------------------------------------------------------------------------</p><p>1.-Selecciona el objeto estructura a procesar.</p><p>2.-Presiona el boton Cortar ingletes.</p></body></html> + + + + <html><head/><body><p>Create bisect planes between beams required for cut miter operation.</p><p>---------------------------------------------------------------------------</p><p>1.-Select the structure object to process.</p><p>2.-Press Generate planes button.</p></body></html> + <html><head/><body><p>Crea planos bisectores entre vigas requeridos para hacer operaccion de corte en inglete.</p><p>---------------------------------------------------------------------------</p><p>1.-Selecciona el objeto estructura a procesar</p><p>2.-Presiona el boton Generar planos.</p></body></html> + + + Generate planes Generar planos - + Cut Miters Cortar ingletes - + <no target selected> <ningún objetivo seleccionado> - + <degrees> <grados> - + offset tail Desfasar cola - + Trim/Extend Cortar/Extender - + + Creation + Creacion + + + + Rate: + Grado: + + + + Size: + Tamano: + + + + <html><head/><body><p>Create a single beam.</p><p>if a wire is previous selected beam will reorientade normal to wire but no based frame will be created.</p></body></html> + <html><head/><body><p>Crea un viga simple.</p><p>Si un alambre es previamente seleccionada la viga sera orientada normal al alambre pero no objecto sera creado.</p></body></html> + + + + <html><head/><body><p>Add a beam to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select a wire/sketch that belongs to the structure you want to add.</p><p>2.-Press the AddBeams button</p></body></html> + <html><head/><body><p>Agrega una viga al objeto estructura actual</p><p>-------------------------------------------------------------------------</p><p>1.-Selecciona un alambre/boceto que pertenece a la estructura que quieres agregar.</p><p>2.-Presiona el boton Agregar vigas</p></body></html> + + + AddBeams Agregar vigas - + + <html><head/><body><p>Remove a beam to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select a beam that belongs to the structure you want to remove.</p><p>2.-Press the RemoveBeams button</p></body></html> + <html><head/><body><p>Elimina una viga de un objeto estructra existente</p><p>-------------------------------------------------------------------------</p><p>1.-Selecciona una viga que pertenezca a una estructura que quieras eliminar.</p><p>2.-Presiona el boton Eliminar Vigas</p></body></html> + + + + <html><head/><body><p>Change beam profile to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select the wire / sketch that belongs to the structure</p><p>2.-Select the new profile on the drop down menu</p><p>3.-Press the ChangeProfile button</p></body></html> + <html><head/><body><p>Cambia el perfil de la viga de un objeto estructura existente</p><p>-------------------------------------------------------------------------</p><p>1.-Selecciona el alambre / boceto que pertenece a la estructura</p><p>2.-Selecciona el nuevo perfil desde el menu desplegable</p><p>3.-Presiona el boton Cambiar perfil</p></body></html> + + + ChangeProfile Cambiar perfil - + + Edition + Edicion + + + <name> <nombre> - + <no item selected> <ningún elemento seleccionado> - + Redraw Redibujar - + + <html><head/><body><p>Store the edge or face that will be use has reference for trim or extend beams inside structure object.</p><p>------------------------------------------------------------------------------------------------------------------------</p><p>1.-Select the reference edge or face.</p><p>2.-Press Get targets button to save reference.</p></body></html> + <html><head/><body><p>Almacena una arista o cara que sera utilizada como referencia para cortar o alargar perfiles dentro del objeto estructura.</p><p>------------------------------------------------------------------------------------------------------------------------</p><p>1.-Selecciona la arista o cara de referencia.</p><p>2.-Presiona boton Obtener objetivos para guardar la referencia.</p></body></html> + + + offset head Desfasar cabecera - + RemoveBeams Eliminar vigas - + Get targets Obtener objetivos - + <length> <longitud> - + hotkeys: "S" to select, "X" to trim teclas rápidas: "S" para seleccionar, "X" para ejecutar - + Add single Agregar viga sencilla @@ -1340,101 +1421,107 @@ profile Objects - + Rectangular hollow Profile name in the Tree View Rectangular hueco - + + Rectangular t-slot profile + Profile name in the Tree View + Perfil t-slot rectangular + + + Rectangular solid Profile name in the Tree View Rectangular sólido - + Circle-profile Profile name in the Tree View Perfil circular - + L-profile Profile name in the Tree View Perfil L - + U-profile Profile name in the Tree View Perfil U - + T-profile Profile name in the Tree View Perfil T - + Z-profile Profile name in the Tree View Perfil Z - + Omega-profile Profile name in the Tree View Perfil Omega - + H-profile Profile name in the Tree View Perfil H - + Tube Tubo - + Elbow Codo - + Flange Brida - + Reduct Reducción - + U-Bolt Perno en U - + Tank Depósito - + Cap Tapón - + Valve Válcula - + Pipe route Ruta de tubo @@ -1442,12 +1529,12 @@ profile Quetzal_AdjustFrameAngle - + Adjust frame angle Ajuste de ángulo de marcos - + Adjust the angle of frame by two edges Ajustar el ángulo del marco por medio de dos aristas @@ -1455,12 +1542,12 @@ profile Quetzal_AlignEdge - + Mate the edges Coincidir las aristas - + Join two edges: select two or pre-select several Unir dos aristas:selecciona dos o pre selecciona varias @@ -1468,12 +1555,12 @@ profile Quetzal_AlignFlange - + Align flange Alinear brida - + Rotates the section of the beam to make the faces parallel to another face Rota la sección de la viga para hacer las caras paralelas a otra cara @@ -1481,12 +1568,12 @@ profile Quetzal_Attach2Tube - + Attach to tube Ligado al tubo - + Attach one pype to the nearest port of selected pipe Liga un tipo de tubería al puerto mas cercano de la tubería seleccionada @@ -1494,12 +1581,12 @@ profile Quetzal_BreakPipe - + Break the pipe Romper la tubería - + Break one pipe at point and insert gap Dividir un tubo al punto e insertar un espacio @@ -1507,7 +1594,7 @@ profile Quetzal_CapQM - + QM for caps QM para tapones @@ -1528,7 +1615,7 @@ profile Quetzal_ElbowQM - + QM for elbows QM para codos @@ -1536,12 +1623,12 @@ profile Quetzal_ExtendBeam - + Extend the beam Extender la viga - + Extend the beam either to a face, a vertex or the c.o.m. of the selected object Extender la viga a sea hacia una cara, vértice o centro de masa del objeto seleccionado @@ -1549,12 +1636,12 @@ profile Quetzal_ExtendIntersection1 - + Extend pipe to intersection Extender tubo a la intersección - + Extends pipe to intersection Extender tubo a la intersección @@ -1562,12 +1649,12 @@ profile Quetzal_ExtendIntersection2 - + Extend pipes to intersection Extender tubos a la intersección - + Extends pipes to intersection Extender tubos a la intersección @@ -1575,7 +1662,7 @@ profile Quetzal_FlangeQM - + QM for flanges QM para bridas @@ -1583,51 +1670,41 @@ profile Quetzal_Flat - + Fit one elbow Colocar un codo - - Place the elbow between two pipes or beams - Colocar un codo entre 2 tuberías o vigas + + Place a existing elbow between two pipes adjusting lenght pipes + Coloca un codo entre dos tubos ajustando la longitud de los tubos Quetzal_FrameBranchManager - + FrameBranch Manager Gestor de marcos ramificados - - - Open FrameBranch Manager - Abre gestor de marcos - Quetzal_FrameIt - + Place one-beam over one-edge Colocar una viga sobre una arista - - - Place one beam after the other over the edges - Coloca una viga después de las otras aristas - Quetzal_HackedLine - + Draw a Draft wire Dibujar un alambre de Draft - + WP is re-positioned at each point. Possible to spin and offset it. Plano de trabajo es posicionado cada point. Es posible girarlo y desfasarlo. @@ -1635,12 +1712,12 @@ profile Quetzal_InsertAnyShape - + Insert any shape Insertar cualquier forma - + Insert a STEP, IGES or BREP Insertar un solido STEP, IGES, BREP @@ -1648,12 +1725,12 @@ profile Quetzal_InsertBranch - + Insert a branch Insertar una ramificación - + Insert a PypeBranch Insertar una derivación de tubería @@ -1661,8 +1738,8 @@ profile Quetzal_InsertCap - - + + Insert a cap Insertar un tapón @@ -1671,16 +1748,15 @@ profile Quetzal_InsertElbow - - Insert a curve - Insertar una curva + Insert a elbow + Insertar un codo Quetzal_InsertFlange - - + + Insert a flange Insertar una brida @@ -1688,12 +1764,12 @@ profile Quetzal_InsertPath - + Insert path Insertar trayectoria - + Creates one path along selected edges Crea una trayectoria a lo largo de la arista seleccionada @@ -1702,7 +1778,6 @@ profile Quetzal_InsertPipe - Insert a tube Insertar un tubo @@ -1710,12 +1785,12 @@ profile Quetzal_InsertPypeLine - + PypeLine Manager Gestor de línea de tubo - + Open PypeLine Manager Abre gestor de tubería de línea @@ -1723,8 +1798,8 @@ profile Quetzal_InsertReduct - - + + Insert a reduction Insertar una reducción @@ -1732,12 +1807,12 @@ profile Quetzal_InsertRoute - + Insert a pipe route Insertar una ruta de tubería - + Create a sketch attached to a circular edge Crea un boceto adjunta a una arista circular @@ -1745,12 +1820,12 @@ profile Quetzal_InsertSection - + Insert sections Insertar secciones - + Creates customized beam profiles 2D Crea un perfil de viga 2D personalizado @@ -1758,21 +1833,30 @@ profile Quetzal_InsertTank - + Insert a tank Insertar un depósito - + Create tank and nozzles Crear un depósito y boquillas + + Quetzal_InsertTerminalAdapter + + + + Insert Terminal adapter + Insertar adaptador de terminal + + Quetzal_InsertUbolt - - + + Insert a U-bolt Insertar un perno U @@ -1780,8 +1864,8 @@ profile Quetzal_InsertValve - - + + Insert a valve Insertar una válvula @@ -1789,12 +1873,12 @@ profile Quetzal_JoinPype - + Join pipes Unir tuberías - + Select the part-pype and the port Selecciona la pieza de tubería y el puerto @@ -1802,12 +1886,12 @@ profile Quetzal_Laydown - + Lay-down the pipe Empotrar la tubería - + Lay-down the pipe on the support plane Empotra la tubería sobre el plano de soporte @@ -1815,25 +1899,20 @@ profile Quetzal_LevelBeam - + Flush the surfaces Empotrar las superficies - - - Shift the beams to line-up the faces to the first selection (faces must be //) - Desplaza la viga para alinearla a la cara de la primera selección (caras deben ser paralelas) - Quetzal_MakeHeader - + Connect to header Conectar a la cabecera - + Connect branches to one header pipe Branches and header's axes must be ortho Conectar ramificaciones a una cabecera de tubo; ramificaciones y ejes de cabecera's deben ser ortogonales @@ -1842,12 +1921,12 @@ Branches and header's axes must be ortho Quetzal_MateEdges - + Mate pipes edges Coincidir las aristas de las tuberías - + Mate two terminations through their edges Coincidir dos terminaciones a través de sus aristas @@ -1855,12 +1934,12 @@ Branches and header's axes must be ortho Quetzal_MoveHandle - + Move objects Mover objetos - + Move quickly objects inside viewport Mover objetos rápidamente dentro de la vista @@ -1868,12 +1947,12 @@ Branches and header's axes must be ortho Quetzal_MoveWorkPlane - + Align workplane Alinear plano de trabajo - + Moves and rotates the drafting workplane with points, edges and faces Mover y rotar el dibujo del plano de trabajo con puntos, aristas y caras @@ -1881,22 +1960,22 @@ Branches and header's axes must be ortho Quetzal_OffsetWorkPlane - + Offset Work Plane Desfase de plano de trabajo - + Offset: Desface: - + Offset workplane Desfasar plano de trabajo - + Shifts the WP along its normal. Desplaza el plano de trabajo a lo largo de su normal. @@ -1904,7 +1983,7 @@ Branches and header's axes must be ortho Quetzal_PipeQM - + QM for pipes QM para tuberías @@ -1912,25 +1991,20 @@ Branches and header's axes must be ortho Quetzal_PivotBeam - + Pivot the beam Pivotear viga - - - Rotates the beam around an axis (edge or center-of-curvature) - Rota la viga alrededor de un eje (arista o centro de curvatura) - Quetzal_Point2Point - + Draw a tube point by point Dibujar un tubo de punto a punto - + A new body is created on each click on subsequent points Un nuevo cuerpo es creado en cada punto creado de foma subsequente @@ -1938,12 +2012,12 @@ Branches and header's axes must be ortho Quetzal_PressureLossCalculator - + Pressure loss calculator Calculadora de pérdida de presión - + Calculate pressure loss in 'pypes' using ChEDL libraries. See __doc__ of the module for further information. Calcular pérdida de presión en tuberías utilizando bibliotecas de ChEDL. @@ -1953,12 +2027,12 @@ Revisar __doc__ del módulo para mayor información. Quetzal_QueryModel - + Query the model Consultar el modelo - + Click objects to print infos Dar clic en objetos para imprimir información @@ -1966,12 +2040,12 @@ Revisar __doc__ del módulo para mayor información. Quetzal_Raiseup - + Raise-up the support Elevar el soporte - + Raise the support to the pipe Eleva el soporte hacia la tubería @@ -1979,25 +2053,20 @@ Revisar __doc__ del módulo para mayor información. Quetzal_ReverseBeam - + Reverse orientation Invertir orientación - - - Reverse the orientation of selected objects - Invertir orientación a los objetos seleccionados - Quetzal_RotateJoin - + Rotate join to edge Rotar para unir en borde - + Rotates and align the beam according another edge Rota y alinea la viga acorde a otra arista @@ -2005,12 +2074,12 @@ Revisar __doc__ del módulo para mayor información. Quetzal_RotateWorkPlane - + Rotate workplane Rotar plano de trabajo - + Spin the Draft working plane about one of its axes Gira el dibujo en el plano de trabajo a lo largo de uno de sus ejes @@ -2018,12 +2087,12 @@ Revisar __doc__ del módulo para mayor información. Quetzal_SelectSolids - + Select solids Seleccionar sólidos - + Grab all solids or those partially selected to export in .step format Sujeta todos los solidos parcialmente seleccionados @@ -2033,38 +2102,28 @@ para exportar en formato step Quetzal_ShiftBeam - + Shift the beam Desplazar la viga - - - Translate objects by vectors defined on existing geometry - Traslada el objeto por vectores definidos sobre la geometría existente - Quetzal_SpinSection - + Spin beams by 45 deg. - Girar viga 45 grados - - - - Rotates the section of the beam by 45 degrees - Rota la sección de la viga 45 grados + Girar viga 45 grados. Quetzal_StretchBeam - + Stretch the beam Estirar viga - + Changes the length of the beam, either according a preselected edge or a direct input Cambia la longitud de la viga, ya sea acorde a la arista preseleccionada o una entrada directa @@ -2072,7 +2131,7 @@ para exportar en formato step Quetzal_ValveQM - + QM for valves QM para válvulas @@ -2080,87 +2139,57 @@ para exportar en formato step Transaction - - Spin - Girar - - - - Reverse - Invertir - - - - Level The Beams - Nivelar las vigas - - - - Align Edge - Alinear Borde - - - - Rotate to Join on Edge - Rotar para unir en Borde - - - - Make Path - Crear Ruta - - - + Mate Emparejar - + Extend pipes to intersection Extender tubos a la intersección - + Extend pipe to intersection Extender tubo a la intersección - + Lay-down the pipe Empotra la tubería - + Raise-up the support Elevar el soporte - + Attach to tube Ligado al tubo - + Connect to header Conectar a la cabecera - + Insert Single Structure Insertar Estructura Única - + Insert Frame Branch Insertar una ramificación de marco - + Trim Frame Branch Recortar una ramificación de marco - + Update Frame Line Actualizar línea de marco @@ -2195,12 +2224,12 @@ para exportar en formato step Rotar la viga alrededor - + Insert profile Insertar perfil - + Modify profile Modificar perfil @@ -2210,92 +2239,93 @@ para exportar en formato step Ajustar ángulo - + Insert pipe Insertar tubería - + Insert elbow Insertar codo - + Insert flange Insertar brida - + Insert cap Insertar tapón - + Insert valve Insertar válvula - + Place one curve Colocar una curva - + Redraw pipe-lines Redibujar líneas de tubería - + Trim pipes Cortar tuberías - + + Insert reduction Insertar reducción - + Insert clamp in (0,0,0) Insertar perno en U en (0,0,0) - + Insert clamp on tube Insertar perno en U en tubo - + Insert pipe line Insertar tubería - + Assign Base Asignar base - + Insert pipe branch Insertar una derivación de tubería - + Break pipes Romper tuberías - + Point to Point Punto a punto - + Add nozzles Agregar boquillas - + Make pipe route Crear trayectoria de tubería @@ -2318,36 +2348,41 @@ para exportar en formato step Quetzal es la bifurcación del banco de trabajo Dodo para FreeCAD. Extendiendo soporte al banco de trabajo Dodo y agregando soporte de traducción. - + + Frame tools Herramientas para estructuras - + Utils Utilidades - - + Draft snap + + + + + Pipe tools Herramientas de tuberías - + QM Menus Menús QM - + Frames Estructuras - + Pipes Tuberías @@ -2355,33 +2390,35 @@ para exportar en formato step breakForm - + Break the pipes Romper las tuberías - + Length longitud - + <reference> <referencia> - + PypeLine: Linea de tubo: - - + + + + <none> <ninguno> - + <new> <nuevo> @@ -2511,17 +2548,17 @@ para exportar en formato step insertBranchForm - + Insert a branch Insertar una ramificación - + <name> <nombre> - + <bend radius> <radio de doblez> @@ -2529,17 +2566,17 @@ para exportar en formato step insertCapForm - + Insert caps Insertar tapones - + Reverse Invertir - + Apply Aplicar @@ -2547,49 +2584,49 @@ para exportar en formato step insertElbowForm - + Insert elbows Insertar codos - + <bend angle> <ángulo de doblez> - + <bend radius> <radio de doblez> - + Trim/Extend Cortar/Extender - + Reverse Invertir - + Apply Aplicar - + 0 deg 0 grados - + Wrong selection Selección equivocada - + deg grados @@ -2597,40 +2634,45 @@ para exportar en formato step insertFlangeForm - + Insert flanges Insertar bridas - + Reverse Invertir - + Apply Aplicar + + + Remove pipe equivalent length + Eliminar longitud de tubo equivalente + insertPipeForm - + Insert pipes Insertar tubería - + <length> <Longitud> - + Reverse Invertir - + Apply Aplicar @@ -2638,48 +2680,48 @@ para exportar en formato step insertPypeLineForm - + PypeLine Manager Gestor de línea de tubo - + <name> <nombre> - + Redraw Redibujar - + Part list Lista de parte - + Color Color - + Get Path Obtener trayectoria - + Get Profile Obtener perfil - - - - - - - + + + + + + + <new> <nuevo> @@ -2687,22 +2729,24 @@ para exportar en formato step insertReductForm - + Insert reductions Insertar reducciones - + + Reverse Invertir - + + Apply Aplicar - + Eccentric Excéntrico @@ -2710,40 +2754,48 @@ para exportar en formato step insertRouteForm - + <select an edge> <seleccionar un borde> + + insertTerminalAdapter + + + Insert terminal adapter + Insertar adaptador de terminal + + insertUboltForm - + Insert U-bolt Insertar perno en U - + - no ref. face - Sin cara de referencia - + Ref. face Cara de referencia - + Head Cabecera - + Middle Medio - + Tail Cola @@ -2751,22 +2803,22 @@ para exportar en formato step insertValveForm - + Insert valves Insertar válvulas - + Reverse Invertir - + Apply Aplicar - + Insert in pipe Insertar en tubo @@ -2774,7 +2826,7 @@ para exportar en formato step makeframenbranch - + Structure Estructura @@ -2782,7 +2834,7 @@ para exportar en formato step mouseActionB1 - + ____TAIL ____COLA @@ -2790,12 +2842,12 @@ para exportar en formato step pForms - + Offset Work Plane Desface de plano de trabajo - + Offset: Desface: @@ -2803,12 +2855,12 @@ para exportar en formato step point2pointPipe - + Reset Reiniciar - + Move WP on click Mover plano de trabajo al clic @@ -2816,7 +2868,7 @@ para exportar en formato step profEdit - + Shift profile Girar perfil @@ -2824,13 +2876,18 @@ para exportar en formato step protoPypeForm - - + + Rating: Grado: - + + <none> + <ninguno> + + + Insert Insertar @@ -2838,17 +2895,17 @@ para exportar en formato step protoTypeDialog - + "%s" to select; "%s" to execute "%s" para seleccionar; "%s" para ejecutar - + No view available. Vista no disponible. - + Actions "%s" and "%s" removed Acciones "%s" y "%s" eliminado @@ -2869,18 +2926,18 @@ para exportar en formato step uCmd - + Quick move Transaction Movimiento rápido - + Offset Work Plane Desfasar plano de trabajo - + Offset: Desface: From 09fa9545ab6cbc6bd76fd2d61c60bcaad47e010e Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sun, 30 Nov 2025 20:15:17 -0600 Subject: [PATCH 131/135] chore(quetzal): update quetzal workbench version fix(fForms): include TSLOT profile --- fForms.py | 8 +++++--- package.xml | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/fForms.py b/fForms.py index ad0f92f..b65841c 100644 --- a/fForms.py +++ b/fForms.py @@ -15,7 +15,7 @@ translate = FreeCAD.Qt.translate -FTypes = ["R", "circle", "T", "H", "U", "L", "Z", "omega"] +FTypes = ["R", "circle", "T", "TSLOT", "H", "U", "L", "Z", "omega"] class fillForm(dodoDialogs.protoTypeDialog): @@ -536,6 +536,10 @@ def setProfile(self, typeS): self.form.labImg.setPixmap(pixT) self.type = "T" self.label = "T-profile" + elif typeS == "TSLOT": + self.form.labImg.setPixmap(pixT) + self.type = "TSLOT" + self.label = "T-slot" elif typeS == "U": self.form.labImg.setPixmap(pixU) self.type = "U" @@ -584,10 +588,8 @@ def accept(self): elif self.type == "H": sect = fFeatures.doProfile(self.type, label, [B, H, D, t1, t2, t3]) elif self.type == "U" and t2 < H and t1 < B / 2: - #FIXME:Add radius or include exception sect = fFeatures.doProfile(self.type, label, [B, H, D, t1, t2, t3]) elif self.type == "L" and t2 < H and t1 < B: - #FIXME:Add radius or include exception sect = fFeatures.doProfile(self.type, label, [B, H, t1, t2]) elif self.type == "T" and t2 < H and t1 < B: sect = fFeatures.doProfile(self.type, label, [B, H, t1, t2]) diff --git a/package.xml b/package.xml index c2bebce..19722b9 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.5.6 + 1.6.7 2025-01-15 @@ -31,8 +31,8 @@ - typing-extensions - Draft + typing-extensions + Draft beams frames pipe From 103b2339967ed168d56088d544d8dabe2ff115ef Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Mon, 1 Dec 2025 20:41:58 -0600 Subject: [PATCH 132/135] fix(Quetzal_FrameBranchManager): profile path hard code Removed profilepath variable hardcode for testing --- fFeatures.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fFeatures.py b/fFeatures.py index 2b5045a..06998d8 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -491,7 +491,7 @@ def __init__(self): self.actionX.triggered.connect(self.trim) # reconnect to trim() def on_currentIndexChanged(self) -> None: - profilepath = "/home/edgar/.local/share/FreeCAD/Mod/quetzal/iconz/PreviewSections/" + profilepath = FreeCAD.getUserAppDataDir() + "Mod/quetzal/iconz/PreviewSections/" lastsizeselected=self.form.Sizes_comboBox.currentText() fullimagepath = profilepath+str(lastsizeselected)+".png" FreeCAD.Console.PrintMessage(fullimagepath+"\r\n") From 39ac8c7cb342872471471fccbd45388e22124ef7 Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Mon, 1 Dec 2025 20:45:15 -0600 Subject: [PATCH 133/135] chore(quetzal version): Update fix version to 1.6.8 --- package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.xml b/package.xml index 0e3df2f..c44421f 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.6.7 + 1.6.8 2025-01-15 From 422355a81dab4a5414aa1007c0c43c4a45f6022d Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 13 Dec 2025 00:23:18 -0600 Subject: [PATCH 134/135] perf(frameBranch): reduce trim & extend function time --- fFeatures.py | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/fFeatures.py b/fFeatures.py index 06998d8..194f172 100644 --- a/fFeatures.py +++ b/fFeatures.py @@ -115,14 +115,22 @@ def findFB(beamName=None, baseName=None): return None -def refresh(): - for b in [ - o - for o in FreeCAD.ActiveDocument.Objects - if hasattr(o, "FType") and o.FType == "FrameBranch" - ]: - b.touch() - FreeCAD.ActiveDocument.recompute() +def refreshBranchObject(beamChild=None): + """ + Touch each FrameBranch object in document + """ + # import timeit + # codigomedir2='''for b in [o for o in FreeCAD.ActiveDocument.Objects if hasattr(o, "FType") and o.FType == "FrameBranch"]: + # b.touch()''' + # timefull2=timeit.timeit(codigomedir2,number=1,globals={'FreeCAD': FreeCAD,'fCmd':fCmd}) + # print("Algoritmo de busqueda de FrameBranch:") + # print(f"tiempo total: {timefull2:.4f} segundos") + # print(f"Promedio por ejecución: {timefull2/1000:.6f} segundos") + for bf in [o for o in FreeCAD.ActiveDocument.Objects if hasattr(o, "FType") and o.FType == "FrameBranch"]: + for selected in bf.Beams: + if selected == beamChild.Name: + # print(bf.Name) + bf.touch() FreeCAD.ActiveDocument.recompute() @@ -478,7 +486,9 @@ def __init__(self): self.form.btnMiter.clicked.connect(self.cutMiters) self.form.btnProfile.clicked.connect(self.changeProfile) self.form.btnRefresh.clicked.connect(self.refresh) + # Signal connection to get targets for trim or extend self.form.btnTargets.clicked.connect(self.selectAction) + # Signal connection to execute trim or extend operation self.form.btnTrim.clicked.connect(self.trim) self.form.btnSingle.clicked.connect(self.makeSingle) self.form.sliTail.valueChanged.connect(self.stretchTail) @@ -494,7 +504,7 @@ def on_currentIndexChanged(self) -> None: profilepath = FreeCAD.getUserAppDataDir() + "Mod/quetzal/iconz/PreviewSections/" lastsizeselected=self.form.Sizes_comboBox.currentText() fullimagepath = profilepath+str(lastsizeselected)+".png" - FreeCAD.Console.PrintMessage(fullimagepath+"\r\n") + # FreeCAD.Console.PrintMessage(fullimagepath+"\r\n") profilepixmap = QPixmap(fullimagepath) self.form.ProfileImage.setPixmap(profilepixmap) @@ -1081,6 +1091,9 @@ def spinAngle(self): self.changeAngle() def trim(self): + """ + Trim or extend function for preselected beams + """ FreeCAD.activeDocument().openTransaction(translate("Transaction", "Trim Frame Branch")) for target in self.targets: for b in fCmd.beams(): @@ -1109,17 +1122,19 @@ def trim(self): b.tailOffset = -deltaTail else: b.headOffset = deltaHead - refresh() + refreshBranchObject(b) FreeCAD.ActiveDocument.commitTransaction() def refresh(self): + """ + no used + """ obj = findFB(fCmd.beams()[0].Name) if not obj: obj = findFB(baseName=FreeCADGui.Selection.getSelection()[0]) if obj: obj.Proxy.redraw(obj) FreeCAD.ActiveDocument.recompute() - FreeCAD.ActiveDocument.recompute() ################ CLASSES ########################### From f64b3be709eb2f8bc53cebc6ff1a6214da9937ae Mon Sep 17 00:00:00 2001 From: EdgarJRobles Date: Sat, 13 Dec 2025 00:32:37 -0600 Subject: [PATCH 135/135] dcore(readme): Sync quetzal version --- CHANGELOG.md | 5 +++ dialogz/fbranch.ui | 84 ++++++++++++++++++++++++++++++++++++++++++++-- package.xml | 2 +- 3 files changed, 87 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f04e714..0fa8797 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [1.7.8] - 2025-12-13 + +- Sync quetzal version +- Improve branch frame trim and extend method + ## [1.1.0] - 2025-01-17 ### Added diff --git a/dialogz/fbranch.ui b/dialogz/fbranch.ui index aa78f48..ac8d7f3 100644 --- a/dialogz/fbranch.ui +++ b/dialogz/fbranch.ui @@ -111,7 +111,7 @@ - 0 + 1 @@ -151,6 +151,12 @@ + + + 0 + 22 + + 20 @@ -161,6 +167,12 @@ + + + 0 + 22 + + 20 @@ -180,6 +192,12 @@ + + + 0 + 22 + + <html><head/><body><p>Create a single beam.</p><p>if a wire is previous selected beam will reorientade normal to wire but no based frame will be created.</p></body></html> @@ -190,6 +208,12 @@ + + + 0 + 22 + + <html><head/><body><p>Add a beam to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select a wire/sketch that belongs to the structure you want to add.</p><p>2.-Press the AddBeams button</p></body></html> @@ -200,6 +224,12 @@ + + + 0 + 22 + + <html><head/><body><p>Remove a beam to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select a beam that belongs to the structure you want to remove.</p><p>2.-Press the RemoveBeams button</p></body></html> @@ -210,6 +240,12 @@ + + + 0 + 22 + + <html><head/><body><p>Change beam profile to a existing structure object</p><p>-------------------------------------------------------------------------</p><p>1.-Select the wire / sketch that belongs to the structure</p><p>2.-Select the new profile on the drop down menu</p><p>3.-Press the ChangeProfile button</p></body></html> @@ -406,7 +442,7 @@ 80 - 0 + 22 @@ -426,7 +462,7 @@ 80 - 0 + 22 @@ -439,6 +475,12 @@ + + + 0 + 22 + + Qt::AlignCenter @@ -453,6 +495,12 @@ + + + 0 + 22 + + <html><head/><body><p>Store the edge or face that will be use has reference for trim or extend beams inside structure object.</p><p>------------------------------------------------------------------------------------------------------------------------</p><p>1.-Select the reference edge or face.</p><p>2.-Press Get targets button to save reference.</p></body></html> @@ -463,6 +511,12 @@ + + + 0 + 22 + + <html><head/><body><p>Trim or extend selected beam using preselected target as reference.</p><p>Operation can be applied on multiple beam at ones.</p><p>---------------------------------------------------------------------------</p><p>1.-Select the reference beam edge or face.</p><p>2.-Press Trim/Extend button.</p></body></html> @@ -473,6 +527,12 @@ + + + 0 + 22 + + <html><head/><body><p>Cut miters from structure.</p><p>Important!. Reference planes must be generated first </p><p>---------------------------------------------------------------------------</p><p>1.-Select the structure object to process.</p><p>2.-Press Cut Miters button.</p></body></html> @@ -483,6 +543,12 @@ + + + 0 + 22 + + <html><head/><body><p>Create bisect planes between beams required for cut miter operation.</p><p>---------------------------------------------------------------------------</p><p>1.-Select the structure object to process.</p><p>2.-Press Generate planes button.</p></body></html> @@ -497,6 +563,12 @@ + + + 0 + 22 + + Qt::AlignCenter @@ -517,6 +589,12 @@ + + + 0 + 22 + + Qt::AlignCenter diff --git a/package.xml b/package.xml index c44421f..dbc34bb 100644 --- a/package.xml +++ b/package.xml @@ -5,7 +5,7 @@ A set of commands and objects that help to speed-up the drawing of frames and pipelines. Dodo successor. - 1.6.8 + 1.7.8 2025-01-15