Skip to content

Commit

Permalink
Arch: Included some utility functions into Arch module
Browse files Browse the repository at this point in the history
* makeCompoundFromSelected: creates a compound object from selected subobjects
* cleanArchSplitter: cleans the splitters on imported Arch objects
* rebuildArchShape: tries to rebuild a solid from the faces of an invalid shape
  • Loading branch information
yorikvanhavre committed Aug 4, 2014
1 parent c7bfaf2 commit caf0231
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 5 deletions.
87 changes: 83 additions & 4 deletions src/Mod/Arch/ArchCommands.py
Expand Up @@ -487,8 +487,9 @@ def meshToShape(obj,mark=True,fast=True,tol=0.001,flat=False,cut=True):
return None

def removeShape(objs,mark=True):
'''takes an arch object (wall or structure) built on a cubic shape, and removes
the inner shape, keeping its length, width and height as parameters.'''
'''removeShape(objs,mark=True): takes an arch object (wall or structure) built on a cubic shape, and removes
the inner shape, keeping its length, width and height as parameters. If mark is True, objects that cannot
be processed by this function will become red.'''
import DraftGeomUtils
if not isinstance(objs,list):
objs = [objs]
Expand Down Expand Up @@ -547,8 +548,9 @@ def mergeCells(objectslist):
return base

def download(url,force=False):
'''downloads a file from the given URL and saves it in the
macro path. Returns the path to the saved file'''
'''download(url,force=False): downloads a file from the given URL and saves it in the
macro path. Returns the path to the saved file. If force is True, the file will be
downloaded again evn if it already exists.'''
import urllib2, os
name = url.split('/')[-1]
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro")
Expand Down Expand Up @@ -779,6 +781,83 @@ def toggleIfcBrepFlag(obj):
obj.IfcAttributes = d


def makeCompoundFromSelected(objects=None):
"""makeCompoundFromSelected([objects]): Creates a new compound object from the given
subobjects (faces, edges) or from the the selection if objects is None"""
import FreeCADGui,Part
so = []
if not objects:
objects = FreeCADGui.Selection.getSelectionEx()
if not isinstance(objects,list):
objects = [objects]
for o in objects:
so.extend(o.SubObjects)
if so:
c = Part.makeCompound(so)
Part.show(c)


def cleanArchSplitter(objets=None):
"""cleanArchSplitter([objects]): removes the splitters from the base shapes
of the given Arch objects or selected Arch objects if objects is None"""
import FreeCAD,FreeCADGui
if not objects:
objects = FreeCADGui.Selection.getSelection()
if not isinstance(objects,list):
objects = [objects]
for obj in objects:
if obj.isDerivedFrom("Part::Feature"):
if hasattr(obj,"Base"):
if obj.Base:
print "Attempting to clean splitters from ",obj.Label
if obj.Base.isDerivedFrom("Part::Feature"):
if not obj.Base.Shape.isNull():
obj.Base.Shape = obj.Base.Shape.removeSplitter()
FreeCAD.ActiveDocument.recompute()


def rebuildArchShape(objects=None):
"""rebuildArchShape([objects]): takes the faces from the base shape of the given (
or selected if objects is None) Arch objects, and tries to rebuild a valid solid from them."""
import FreeCAD,FreeCADGui,Part
if not objects:
objects = FreeCADGui.Selection.getSelection()
if not isinstance(objects,list):
objects = [objects]
for obj in objects:
success = False
if obj.isDerivedFrom("Part::Feature"):
if hasattr(obj,"Base"):
if obj.Base:
try:
print "Attempting to rebuild ",obj.Label
if obj.Base.isDerivedFrom("Part::Feature"):
if not obj.Base.Shape.isNull():
faces = []
for f in obj.Base.Shape.Faces:
f2 = Part.Face(f.Wires)
#print "rebuilt face: isValid is ",f2.isValid()
faces.append(f2)
if faces:
shell = Part.Shell(faces)
if shell:
#print "rebuilt shell: isValid is ",shell.isValid()
solid = Part.Solid(shell)
if solid:
if not solid.isValid():
solid.sewShape()
solid = Part.Solid(solid)
#print "rebuilt solid: isValid is ",solid.isValid()
if solid.isValid():
print "Success"
obj.Base.Shape = solid
success = True
except:
pass
if not success:
print "Failed"
FreeCAD.ActiveDocument.recompute()

# command definitions ###############################################

class _CommandAdd:
Expand Down
11 changes: 10 additions & 1 deletion src/Mod/Arch/importIFC.py
Expand Up @@ -193,7 +193,8 @@ def insert(filename,docname,skip=[]):
if not obj:
obj = baseobj
if obj:
if DEBUG: print "creating object ",pid," : ",ptype, " with shape: ",baseobj
sh = baseobj.Shape.ShapeType if hasattr(baseobj,"Shape") else "None"
if DEBUG: print "creating object ",pid," : ",ptype, " with shape: ",sh
objects[pid] = obj

# subtractions
Expand All @@ -210,6 +211,14 @@ def insert(filename,docname,skip=[]):
Arch.addComponents(cobs,objects[host])

FreeCAD.ActiveDocument.recompute()

# cleaning bad shapes
for obj in objects.values():
if obj.isDerivedFrom("Part::Feature"):
if obj.Shape.isNull():
Arch.rebuildArchShape(obj)
FreeCAD.ActiveDocument.recompute()

if FreeCAD.GuiUp:
import FreeCADGui
FreeCADGui.SendMsgToActiveView("ViewFit")
Expand Down

0 comments on commit caf0231

Please sign in to comment.