Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
import os
import sys
this_dir = os.path.dirname(os.path.realpath(__file__))
sys.path.append(this_dir)
from App import App
from HeeksConfig import HeeksConfig
import step
import geom
import cad
import wx
from HDialog import HDialog
from HDialog import control_border
from NiceTextCtrl import LengthCtrl
from NiceTextCtrl import DoubleCtrl
from Ribbon import RB
from Ribbon import Ribbon
import ContextTool
import EllipseDrawing
import Gear
def ImportSolidsFile():
step.ImportSolidsFile(cad.GetFilePathForImportExport())
def ExportSolidsFile():
step.ExportSolidsFile(cad.GetFilePathForImportExport())
class SolidApp(App):
def __init__(self):
App.__init__(self)
def GetAppTitle(self):
return 'Heeks CAD 2 ( Computer Aided Design )'
def GetAppConfigName(self):
return 'HeeksCADSolid'
def LoadConfig(self):
App.LoadConfig(self)
config = HeeksConfig()
step.SetShowFaceNormals(config.ReadBool('ShowFaceNormals', False))
def RegisterObjectTypes(self):
step.SetResPath(self.cad_dir)
step.SetApp(cad.GetApp())
App.RegisterObjectTypes(self)
cad.RegisterOnEndXmlWrite(step.WriteSolids)
step.SetStepFileObjectType(cad.RegisterObjectType("STEP_file", step.CreateStepFileObject, add_to_filter = False))
step.SetSolidType(cad.RegisterObjectType("Solid", None))
step.SetFaceType(cad.RegisterObjectType("Face", None))
step.SetEdgeType(cad.RegisterObjectType("Edge", None))
step.SetEllipseType(cad.RegisterObjectType("Ellipse", step.CreateEllipse))
step.SetSplineType(cad.RegisterObjectType("Spline", step.CreateSpline))
self.RegisterImportFileTypes(['step', 'stp'], 'STEP Files', ImportSolidsFile)
self.RegisterImportFileTypes(['iges', 'igs'], 'IGES Files', ImportSolidsFile)
self.RegisterExportFileTypes(['step', 'stp'], 'STEP Files', ExportSolidsFile)
self.RegisterExportFileTypes(['iges', 'igs'], 'IGES Files', ExportSolidsFile)
def GetObjectTools(self, object, control_pressed, from_tree_canvas = False):
tools = App.GetObjectTools(self, object, control_pressed, from_tree_canvas)
t = object.GetType()
if t == step.GetEdgeType():
tools.append(ContextTool.CADObjectContextTool(object, "Blend", "fillet", self.BlendEdge))
tools.append(ContextTool.CADObjectContextTool(object, "Chamfer", "chamfer", self.ChamferEdge))
elif t == step.GetFaceType():
tools.append(ContextTool.CADObjectContextTool(object, "Make Sketch From Face", "face2sketch", self.FaceToSketch))
self.context_face_plane = object.GetPlane()
if self.context_face_plane != None:
tools.append(ContextTool.CADObjectContextTool(object, "Rotate To Face", "rotface", self.RotateToFace))
tools.append(ContextTool.CADObjectContextTool(object, "(to do ) Make Face Radius 1mm smaller", "facerch", self.FaceRadiusChange))
elif t == Gear.type:
tools.append(ContextTool.CADContextTool("Make Solid", "gear", object.AddSolid))
return tools
def FaceToSketch(self, object):
sketch = step.NewSketchFromFace(object)
cad.AddUndoably(sketch)
cad.Select(sketch)
def FacesToSketches(self):
cad.StartHistory('Faces to Sketches')
for object in cad.GetSelectedObjects():
if object.GetType() == step.GetFaceType():
sketch = step.NewSketchFromFace(object)
cad.AddUndoably(sketch)
cad.EndHistory()
def RotateToFace(self, object):
n = self.context_face_plane.normal
p = n * (-self.context_face_plane.d)
x,y = n.ArbitraryAxes()
face_matrix = geom.Matrix(p, x, y)
inv_matrix = face_matrix.Inverse()
cad.StartHistory('Rotate To Face')
selected = cad.GetSelectedObjects()
# move the solid
parent_body = object.GetParentBody()
cad.TransformUndoably(parent_body, inv_matrix)
self.EndHistory()
def FaceRadiusChange(self, object):
sketch = step.NewSketchFromFace(object)
cad.AddUndoably(sketch)
cad.Select(sketch)
def BlendEdge(self, object):
cad.ClearSelection()
cad.Select(object)
self.OnFillet(None)
def ChamferEdge(self, object):
cad.ClearSelection()
cad.Select(object)
self.OnChamfer(None)
def IsSolidApp(self):
return True
def AddObjectFromButton(self, new_object):
cad.StartHistory('Add Object From Button')
cad.AddUndoably(new_object,None, None)
cad.ClearSelection(True)
cad.Select(new_object)
self.SetInputMode(self.select_mode)
self.EndHistory()
cad.Repaint()
def OnSphere(self, event):
self.AddObjectFromButton(step.NewSphere())
def OnCube(self, event):
self.AddObjectFromButton(step.NewCuboid())
def OnCyl(self, event):
self.AddObjectFromButton(step.NewCyl())
def OnCone(self, event):
self.AddObjectFromButton(step.NewCone())
def OnRuledSurface(self, event):
if not self.CheckForNumberOrMore(2, [cad.OBJECT_TYPE_SKETCH], 'Pick two or more sketches, to create a lofted solid between\n( hold down Ctrl key to select more than one solid )', 'Lofted Body'):
return
step.CreateRuledSurface(True)
def InputExtrusionHeight(self, value, extrude_makes_a_solid, taper_angle):
dlg = HDialog('Make Extrusion')
sizerMain = wx.BoxSizer(wx.VERTICAL)
value_control = LengthCtrl(dlg)
value_control.SetValue(value)
dlg.AddLabelAndControl(sizerMain, 'Height', value_control)
solid_check_box = None
if extrude_makes_a_solid != None:
solid_check_box = wx.CheckBox(dlg, label = 'Extrude makes a solid')
solid_check_box.SetValue(extrude_makes_a_solid)
sizerMain.Add( solid_check_box, 0, wx.ALL | wx.ALIGN_LEFT, control_border )
taper_angle_control = None
if taper_angle != None:
taper_angle_control = DoubleCtrl(dlg)
taper_angle_control.SetValue(taper_angle)
dlg.AddLabelAndControl( sizerMain, 'Taper Outward Angle', taper_angle_control )
dlg.MakeOkAndCancel( wx.HORIZONTAL ).AddToSizer( sizerMain )
dlg.SetSizer( sizerMain )
sizerMain.Fit( dlg )
value_control.SetFocus()
if dlg.ShowModal() == wx.ID_OK:
value = value_control.GetValue()
if extrude_makes_a_solid != None: extrude_makes_a_solid = solid_check_box.GetValue()
if taper_angle != None: taper_angle = taper_angle_control.GetValue()
return True, value, extrude_makes_a_solid, taper_angle
return False, value, extrude_makes_a_solid, taper_angle
def OnExtrude(self, event):
if cad.GetNumSelected() == 0:
self.PickObjects('Pick Some Sketches, Faces or Circles')
if not self.CheckForNumberOrMore(1, [cad.OBJECT_TYPE_SKETCH, step.GetFaceType(), cad.OBJECT_TYPE_CIRCLE], 'Pick one or more sketches, faces or circles, to create an extruded body from\n( hold down Ctrl key to select more than one solid )', 'Extude'):
return
config = HeeksConfig();
height = config.ReadFloat('ExtrusionHeight', 10.0)
taper_angle = config.ReadFloat('ExtrusionTaperAngle', 0.0)
extrude_makes_a_solid = config.ReadBool('ExtrudeToSolid')
success, height, extrude_makes_a_solid, taper_angle = self.InputExtrusionHeight(height, extrude_makes_a_solid, taper_angle)
if success:
config.WriteFloat('ExtrusionHeight', height)
config.WriteFloat('ExtrusionTaperAngle', taper_angle)
config.WriteBool('ExtrudeToSolid', extrude_makes_a_solid)
return step.CreateExtrusion(height, extrude_makes_a_solid, False, taper_angle, cad.Color(128, 128, 128))
def InputRevolutionAngle(self, angle, extrude_makes_a_solid):
dlg = HDialog('Input Revolution Angle')
sizerMain = wx.BoxSizer(wx.VERTICAL)
angle_control = DoubleCtrl(dlg)
angle_control.SetValue(angle)
dlg.AddLabelAndControl(sizerMain, 'Angle', angle_control)
solid_check_box = None
if extrude_makes_a_solid != None:
solid_check_box = wx.CheckBox(dlg, label = 'Extrude makes a solid')
solid_check_box.SetValue(extrude_makes_a_solid)
sizerMain.Add( solid_check_box, 0, wx.ALL | wx.ALIGN_LEFT, control_border )
dlg.MakeOkAndCancel( wx.HORIZONTAL ).AddToSizer( sizerMain )
dlg.SetSizer( sizerMain )
sizerMain.Fit( dlg )
angle_control.SetFocus()
if dlg.ShowModal() == wx.ID_OK:
angle = angle_control.GetValue()
if extrude_makes_a_solid != None: extrude_makes_a_solid = solid_check_box.GetValue()
return True, angle, extrude_makes_a_solid
return False, angle, extrude_makes_a_solid
def OnRevolve(self, event):
if cad.GetNumSelected() == 0:
self.PickObjects('Pick Some Sketches, Faces or Circles')
if not self.CheckForNumberOrMore(1, [cad.OBJECT_TYPE_SKETCH, step.GetFaceType(), cad.OBJECT_TYPE_CIRCLE], 'Pick one or more sketches, faces or circles, to create an extruded body from\n( hold down Ctrl key to select more than one solid )', 'Revolve'):
return
config = HeeksConfig();
angle = config.ReadFloat('RevolutionAngle', 360.0)
extrude_makes_a_solid = config.ReadBool('ExtrudeToSolid')
success, angle, extrude_makes_a_solid = self.InputRevolutionAngle(angle, extrude_makes_a_solid)
if success:
config.WriteFloat('RevolutionAngle', angle)
config.WriteBool('ExtrudeToSolid', extrude_makes_a_solid)
step.CreateExtrusion(angle, extrude_makes_a_solid, True, 0.0, cad.Color(128, 128, 150))
def OnSweep(self, event):
if cad.GetNumSelected() == 0:
self.PickObjects('Pick Some Sketches, Faces or Circles')
if not self.CheckForNumberOrMore(1, [cad.OBJECT_TYPE_SKETCH, step.GetFaceType(), cad.OBJECT_TYPE_CIRCLE], 'Pick one or more sketches, faces or circles, to sweep\n( hold down Ctrl key to select more than one solid )', 'Sweep'):
return
sweep_objects = cad.GetSelectedObjects()
cad.ClearSelection(True)
self.PickObjects('Pick a Sketch to Sweep Along')
if not self.CheckForNumberOrMore(1, [cad.OBJECT_TYPE_SKETCH], 'Pick one sketch to sweep along', 'Sweep'):
return
sweep_profile = cad.GetSelectedObjects()[0]
cad.StartHistory('Sweep')
step.CreateSweep(sweep_objects, sweep_profile, cad.Color(128, 150, 128))
self.EndHistory()
def OnSubtract(self, event):
if not self.CheckForNumberOrMore(2, [step.GetFaceType(), step.GetSolidType()], 'Pick two or more faces or solids, the first one will be cut by the others', 'Subtract Solids'):
return
objects = cad.GetSelectedObjects()
cad.ClearSelection(True)
cad.StartHistory('Subtract')
step.CutShapes(objects)
self.EndHistory()
def OnFuse(self, event):
if not self.CheckForNumberOrMore(2, [step.GetSolidType()], 'Pick two or more solids to be fused together', 'Fuse Solids'):
return
objects = cad.GetSelectedObjects()
cad.ClearSelection(True)
cad.StartHistory('Fuse')
step.FuseShapes()
self.EndHistory()
def OnCommon(self, event):
if not self.CheckForNumberOrMore(2, [step.GetSolidType()], 'Pick two or more solids, only the shape that is contained by all of them will remain', 'Intersection of Solids'):
return
objects = cad.GetSelectedObjects()
cad.ClearSelection(True)
cad.StartHistory('Common')
step.CommonShapes()
self.EndHistory()
def OnShadow(self, event):
if not self.CheckForNumberOrMore(1, [step.GetSolidType(), cad.OBJECT_TYPE_STL_SOLID], 'Pick one or more solids to make a shadow sketch from', 'Shadow Sketch of Solids'):
return
accuracy = self.InputLength('Enter Shadow Accuracy', 'Accuracy', geom.get_accuracy())
if accuracy:
cad.StartHistory('Shadow')
geom.set_accuracy(accuracy)
for object in cad.GetSelectedObjects():
stl = object.GetTris(accuracy)
mat = geom.Matrix()
shadow = stl.Shadow(mat, False)
#shadow.Reorder()
sketch = cad.NewSketchFromArea(shadow)
cad.AddUndoably(sketch)
self.EndHistory()
def OnFillet(self, event):
if not self.CheckForNumberOrMore(1, [step.GetEdgeType()], 'Pick one or more edges to add a fillet to', 'Edge Fillet'):
return
config = HeeksConfig()
rad = config.ReadFloat('EdgeBlendRadius', 2.0)
rad = self.InputLength('Enter Blend Radius', 'Radius', rad)
if rad:
cad.StartHistory('Fillet')
step.FilletOrChamferEdges(rad, False)
config.WriteFloat('EdgeBlendRadius', rad)
cad.ClearSelection(True)
self.EndHistory()
def OnChamfer(self, event):
if not self.CheckForNumberOrMore(1, [step.GetEdgeType()], 'Pick one or more edges to add a chamfer to', 'Edge Chamfer'):
return
config = HeeksConfig()
rad = config.ReadFloat('EdgeChamferDist', 2.0)
rad = self.InputLength('Enter Chamfer Distance', 'Distance', rad)
if rad:
cad.StartHistory('Chamfer')
step.FilletOrChamferEdges(rad, True)
config.WriteFloat('EdgeChamferDist', rad)
cad.ClearSelection(True)
self.EndHistory()
def AddExtraRibbonPages(self, ribbon):
page = RB.RibbonPage(ribbon, wx.ID_ANY, 'Solid', ribbon.Image('solids'))
page.Bind(wx.EVT_KEY_DOWN, ribbon.OnKeyDown)
panel = RB.RibbonPanel(page, wx.ID_ANY, 'Primitives', ribbon.Image('solids'))
toolbar = RB.RibbonButtonBar(panel)
Ribbon.AddToolBarTool(toolbar, 'Sphere', 'sphere', 'Add a sphere', self.OnSphere)
Ribbon.AddToolBarTool(toolbar, 'Cube', 'cube', 'Add a cube', self.OnCube)
Ribbon.AddToolBarTool(toolbar, 'Cylinder', 'cyl', 'Add a cylinder', self.OnCyl)
Ribbon.AddToolBarTool(toolbar, 'Cone', 'cone', 'Add a cone', self.OnCone)
panel = RB.RibbonPanel(page, wx.ID_ANY, 'Sketch Conversions', ribbon.Image('ruled'))
toolbar = RB.RibbonButtonBar(panel)
Ribbon.AddToolBarTool(toolbar, 'Ruled', 'ruled', 'Loft multiple sketches', self.OnRuledSurface)
Ribbon.AddToolBarTool(toolbar, 'Extrude', 'extrude', 'Extrude a sketch', self.OnExtrude)
Ribbon.AddToolBarTool(toolbar, 'Revolve', 'revolve', 'Revolve a sketch', self.OnRevolve)
Ribbon.AddToolBarTool(toolbar, 'Sweep', 'sweep', 'Sweep objects along a sketch', self.OnSweep)
panel = RB.RibbonPanel(page, wx.ID_ANY, 'Operations', ribbon.Image('subtract'))
toolbar = RB.RibbonButtonBar(panel)
Ribbon.AddToolBarTool(toolbar, 'Cut', 'subtract', 'Cut solid with solids', self.OnSubtract)
Ribbon.AddToolBarTool(toolbar, 'Fuse', 'fuse', 'Join solids', self.OnFuse)
Ribbon.AddToolBarTool(toolbar, 'Common', 'common', 'Leave intersection of solids', self.OnCommon)
Ribbon.AddToolBarTool(toolbar, 'Shadow', 'shadow', 'Make shadow sketch of solid', self.OnShadow)
panel = RB.RibbonPanel(page, wx.ID_ANY, 'Edge Modifiers', ribbon.Image('subtract'))
toolbar = RB.RibbonButtonBar(panel)
Ribbon.AddToolBarTool(toolbar, 'Round', 'fillet', 'Make Edges Rounded', self.OnFillet)
Ribbon.AddToolBarTool(toolbar, 'Chamfer', 'chamfer', 'Make Edges Chamfered', self.OnChamfer)
page.Realize()
Ribbon.AddToolBarTool(ribbon.other_drawing_toolbar, 'Ellipses', 'circles', 'Draw Ellipses', self.OnEllipse)
Ribbon.AddToolBarTool(ribbon.other_drawing_toolbar,'Spline', 'splpts', 'Spline Through Points', self.OnSpline)
def AddOptionsRibbonPanels(self, ribbon):
App.AddOptionsRibbonPanels(self, ribbon)
from Ribbon import ModeButton
ModeButton( step.GetShowFaceNormals, step.SetShowFaceNormals, 'showfacenormals', 'hidefacenormals', "ShowFaceNormals", 'Show Face Normals', 'Hide Face Normals').AddToToolbar(self.view_toolbar)
def OnFaceNormalCheck(self, e):
config = HeeksConfig()
step.SetShowFaceNormals(not step.GetShowFaceNormals())
self.FaceNormalCheck.SetValue(step.GetShowFaceNormals())
config.WriteBool('ShowFaceNormals', step.GetShowFaceNormals())
self.frame.graphics_canvas.Refresh()
def OnEllipse(self, e):
EllipseDrawing.SetEllipseDrawing()
def OnSpline(self, e):
if not self.CheckForNumberOrMore(2, [cad.OBJECT_TYPE_POINT], 'Pick one or more points to make a spline through', 'Spline Through Points'):
return
cad.StartHistory('Spline')
points = []
for object in cad.GetSelectedObjects():
points.append(object.GetStartPoint())
new_object = step.NewSplineFromPoints(points)
cad.AddUndoably(new_object)
self.EndHistory()
def GetSelectionFilterTools(self, filter):
tools = App.GetSelectionFilterTools(self, filter)
objects = cad.GetSelectedObjects()
if filter.IsTypeInFilter(cad.OBJECT_TYPE_SKETCH) or self.SketchChildTypeInFilter(filter):
tools.append(ContextTool.CADContextTool('Sketch to Face', 'la2face', step.SketchToFace))
if filter.IsTypeInFilter(step.GetFaceType()):
tools.append(ContextTool.CADContextTool('Faces to Sketches', 'la2face', self.FacesToSketches))
return tools
def SketchChildTypeInFilter(self, filter):
if App.SketchChildTypeInFilter(self, filter): return True
if filter.IsTypeInFilter(step.GetEllipseType()): return True
if filter.IsTypeInFilter(step.GetSplineType()): return True
return False
if __name__ == "__main__":
app = SolidApp()
app.MainLoop()
c5721c306This file is pinned to the selected release. Download the original to open it in your design tool.