Skip to content

Commit

Permalink
Merge pull request #66 from ybh1998/is_inside
Browse files Browse the repository at this point in the history
Fix bug in part hierarchy
  • Loading branch information
chbergmann authored Feb 14, 2025
2 parents 1b61c49 + f43d255 commit 048d094
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 25 deletions.
4 changes: 4 additions & 0 deletions Ray.py
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,8 @@ def check2D(self, objlist):
return nvec

def isInsideSolid(self, origin, lens):
lens_placement_matrix = lens.getGlobalPlacement().Matrix
origin = lens_placement_matrix.inverse().multVec(origin)
for b in lens.Base:
for sol in b.Shape.Solids:
if sol.isInside(origin, EPSILON, True):
Expand All @@ -764,6 +766,8 @@ def isInsideSolid(self, origin, lens):
return False

def isInsideLens(self, isec_struct, origin, lens):
lens_placement_matrix = lens.getGlobalPlacement().Matrix
origin = lens_placement_matrix.inverse().multVec(origin)
nr_solids = 0
for b in lens.Base:
for sol in b.Shape.Solids:
Expand Down
Binary file modified examples/example_hierarchy2D.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
57 changes: 44 additions & 13 deletions examples/example_hierarchy2D.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from FreeCAD import Vector
from FreeCAD import Vector, Rotation
import Sketcher
import Part
import FreeCAD as App
Expand All @@ -10,6 +10,26 @@
_icondir_ = os.path.join(os.path.dirname(__file__), '..')
_exname_ = QT_TRANSLATE_NOOP('ExampleHierarchy2D', 'Example - Hierarchy 2D')

def makeLens(doc, name):
sketch = doc.addObject('Sketcher::SketchObject', name + '_sketch')
circle = Part.Circle(Vector(2, 0, 0), Vector(0, 0, 1), 5)
arc = Part.ArcOfCircle(circle, 2, 4)
sketch.addGeometry(arc)
line = Part.LineSegment(Vector(0, 4.5, 0), Vector(0, -4.5, 0))
sketch.addGeometry(line)
sketch.addConstraint(Sketcher.Constraint('Radius', 0, 5))
sketch.addConstraint(Sketcher.Constraint('PointOnObject', 0, 1, -2))
sketch.addConstraint(Sketcher.Constraint('PointOnObject', 0, 2, -2))
sketch.addConstraint(Sketcher.Constraint('Coincident', 1, 1, 0, 1))
sketch.addConstraint(Sketcher.Constraint('Coincident', 0, 2, 1, 2))
sketch.addConstraint(Sketcher.Constraint('PointOnObject', 0, 3, -1))
sketch.addConstraint(Sketcher.Constraint('DistanceX', 0, 3, 2))
sketch.Placement.Base = Vector(0, 19, 0)
sketch.Placement.Rotation = Rotation(-42, 0, 0)
lens = OpticsWorkbench.makeLens([sketch])
lens.Label = name
return lens

def makeMirror(doc, name):
sketch = doc.addObject('Sketcher::SketchObject', name + '_sketch')
sketch.addGeometry(Part.LineSegment(Vector(10.0, 0.0, 0.0), Vector(12.0, 10.0, 0.0)))
Expand All @@ -18,55 +38,66 @@ def makeMirror(doc, name):
return mirror

def makeRay(name):
ray = OpticsWorkbench.makeRay(Vector(0, 0, 0), Vector(2.0, 1.0, 0), beamNrColumns=10)
ray = OpticsWorkbench.makeRay(Vector(0, 0, 0), Vector(2.0, 1.0, 0), beamNrColumns=10, beamDistance=0.4)
ray.Placement.Base = Vector(0, -1.5, 0)
ray.Label = name
return ray

def createRayInsideMirrorInside(doc):
obj = doc.addObject('App::Part', 'ray_inside_mirror_inside')
mirror = makeMirror(doc, 'mirror_a')
obj.addObject(mirror)
lens = makeLens(doc, 'lens_a')
obj.addObject(lens)
ray = makeRay('ray_a')
obj.addObject(ray)
obj.Placement.Base = Vector(-20.0, -20.0, 0.0)
ray.MaxRayLength = 20.0
obj.Placement.Base += Vector(-30.0, -30.0, 0.0)
ray.MaxRayLength = 24.0
return obj

def createRayOutsideMirrorOutside(doc):
obj = doc.addObject('App::DocumentObjectGroup', 'ray_outside_mirror_outside')
mirror = makeMirror(doc, 'mirror_b')
mirror.Base[0].Placement.Base = Vector(20.0, -20.0, 0.0)
mirror.Base[0].Placement.Base += Vector(30.0, -30.0, 0.0)
obj.addObject(mirror)
lens = makeLens(doc, 'lens_b')
lens.Base[0].Placement.Base += Vector(30.0, -30.0, 0.0)
obj.addObject(lens)
ray = makeRay('ray_b')
ray.Placement.Base = Vector(20.0, -20.0, 0.0)
ray.Placement.Base += Vector(30.0, -30.0, 0.0)
obj.addObject(ray)
ray.MaxRayLength = 20.0
ray.MaxRayLength = 24.0
return obj

def createRayInsideMirrorOutside(doc):
obj = doc.addObject('App::DocumentObjectGroup', 'ray_inside_mirror_outside')
obj_inside = doc.addObject('App::Part', 'ray_inside')
obj_inside.Placement.Base = Vector(-20.0, 20.0, 0.0)
obj_inside.Placement.Base = Vector(-30.0, 30.0, 0.0)
obj.addObject(obj_inside)
mirror = makeMirror(doc, 'mirror_c')
mirror.Base[0].Placement.Base = Vector(-20.0, 20.0, 0.0)
mirror.Base[0].Placement.Base += Vector(-30.0, 30.0, 0.0)
obj.addObject(mirror)
lens = makeLens(doc, 'lens_c')
lens.Base[0].Placement.Base += Vector(-30.0, 30.0, 0.0)
obj.addObject(lens)
ray = makeRay('ray_c')
obj_inside.addObject(ray)
ray.MaxRayLength = 20.0
ray.MaxRayLength = 24.0
return obj

def createRayOutsideMirrorInside(doc):
obj = doc.addObject('App::DocumentObjectGroup', 'ray_outside_mirror_inside')
obj_inside = doc.addObject('App::Part', 'mirror_inside')
obj_inside.Placement.Base = Vector(20.0, 20.0, 0.0)
obj_inside.Placement.Base = Vector(30.0, 30.0, 0.0)
obj.addObject(obj_inside)
mirror = makeMirror(doc, 'mirror_d')
obj_inside.addObject(mirror)
lens = makeLens(doc, 'lens_d')
obj_inside.addObject(lens)
ray = makeRay('ray_d')
ray.Placement.Base = Vector(20.0, 20.0, 0.0)
ray.Placement.Base += Vector(30.0, 30.0, 0.0)
obj.addObject(ray)
ray.MaxRayLength = 20.0
ray.MaxRayLength = 24.0
return obj

def make_optics():
Expand Down
Binary file modified examples/example_hierarchy3D.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
49 changes: 37 additions & 12 deletions examples/example_hierarchy3D.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,27 @@
import Part
import FreeCAD as App
import FreeCADGui as Gui
from BOPTools import BOPFeatures
import OpticsWorkbench
import os
from PySide.QtCore import QT_TRANSLATE_NOOP

_icondir_ = os.path.join(os.path.dirname(__file__), '..')
_exname_ = QT_TRANSLATE_NOOP('ExampleHierarchy3D', 'Example - Hierarchy 3D')

def makeLens(doc, name):
sphere = doc.addObject('Part::Sphere', name + '_sphere')
box = doc.addObject('Part::Box', name + '_box')
box.Placement.Base = Vector(-2, -5, -5)
bp = BOPFeatures.BOPFeatures(doc)
cut = bp.make_cut([sphere.Label, box.Label])
cut.Label = name + '_cut'
cut.Placement.Base = Vector(0, 10, 0)
cut.Placement.Rotation = Rotation(-42, 0, 0)
lens = OpticsWorkbench.makeLens([cut])
lens.Label = name
return lens

def makeMirror(doc, name):
box = doc.addObject('Part::Box', name + '_box')
box.Length = 2.0
Expand All @@ -20,55 +34,66 @@ def makeMirror(doc, name):
return mirror

def makeRay(name):
ray = OpticsWorkbench.makeRay(Vector(0, 0, 0), Vector(2.0, 1.0, 0), beamNrColumns=10, beamNrRows=10)
ray = OpticsWorkbench.makeRay(Vector(0, 0, 0), Vector(2.0, 1.0, 0), beamNrColumns=10, beamNrRows=10, beamDistance=0.4)
ray.Placement.Base = Vector(0, -1.5, -2)
ray.Label = name
return ray

def createRayInsideMirrorInside(doc):
obj = doc.addObject('App::Part', 'ray_inside_mirror_inside')
mirror = makeMirror(doc, 'mirror_a')
obj.addObject(mirror)
lens = makeLens(doc, 'lens_a')
obj.addObject(lens)
ray = makeRay('ray_a')
obj.addObject(ray)
obj.Placement.Base = Vector(-20.0, -20.0, 0.0)
ray.MaxRayLength = 20.0
obj.Placement.Base = Vector(-30.0, -30.0, 0.0)
ray.MaxRayLength = 24.0
return obj

def createRayOutsideMirrorOutside(doc):
obj = doc.addObject('App::DocumentObjectGroup', 'ray_outside_mirror_outside')
mirror = makeMirror(doc, 'mirror_b')
mirror.Base[0].Placement.Base += Vector(20.0, -20.0, 0.0)
mirror.Base[0].Placement.Base += Vector(30.0, -30.0, 0.0)
obj.addObject(mirror)
lens = makeLens(doc, 'lens_b')
lens.Base[0].Placement.Base += Vector(30.0, -30.0, 0.0)
obj.addObject(lens)
ray = makeRay('ray_b')
ray.Placement.Base = Vector(20.0, -20.0, 0.0)
ray.Placement.Base += Vector(30.0, -30.0, 0.0)
obj.addObject(ray)
ray.MaxRayLength = 20.0
ray.MaxRayLength = 24.0
return obj

def createRayInsideMirrorOutside(doc):
obj = doc.addObject('App::DocumentObjectGroup', 'ray_inside_mirror_outside')
obj_inside = doc.addObject('App::Part', 'ray_inside')
obj_inside.Placement.Base = Vector(-20.0, 20.0, 0.0)
obj_inside.Placement.Base = Vector(-30.0, 30.0, 0.0)
obj.addObject(obj_inside)
mirror = makeMirror(doc, 'mirror_c')
mirror.Base[0].Placement.Base += Vector(-20.0, 20.0, 0.0)
mirror.Base[0].Placement.Base += Vector(-30.0, 30.0, 0.0)
obj.addObject(mirror)
lens = makeLens(doc, 'lens_c')
lens.Base[0].Placement.Base += Vector(-30.0, 30.0, 0.0)
obj.addObject(lens)
ray = makeRay('ray_c')
obj_inside.addObject(ray)
ray.MaxRayLength = 20.0
ray.MaxRayLength = 24.0
return obj

def createRayOutsideMirrorInside(doc):
obj = doc.addObject('App::DocumentObjectGroup', 'ray_outside_mirror_inside')
obj_inside = doc.addObject('App::Part', 'mirror_inside')
obj_inside.Placement.Base = Vector(20.0, 20.0, 0.0)
obj_inside.Placement.Base = Vector(30.0, 30.0, 0.0)
obj.addObject(obj_inside)
mirror = makeMirror(doc, 'mirror_d')
obj_inside.addObject(mirror)
lens = makeLens(doc, 'lens_d')
obj_inside.addObject(lens)
ray = makeRay('ray_d')
ray.Placement.Base = Vector(20.0, 20.0, 0.0)
ray.Placement.Base += Vector(30.0, 30.0, 0.0)
obj.addObject(ray)
ray.MaxRayLength = 20.0
ray.MaxRayLength = 24.0
return obj

def make_optics():
Expand Down

0 comments on commit 048d094

Please sign in to comment.