This commit is contained in:
Keith Sloan
2020-06-04 20:31:42 +01:00
committed by Yorik van Havre
parent 7597dd0564
commit f333d9ca0f
2 changed files with 125 additions and 23 deletions

View File

@@ -82,7 +82,7 @@ class ViewProviderTree:
return objs
def getIcon(self):
import OpenSCAD_rc
import freecad.OpenSCAD.OpenSCAD_rc
if isinstance(self.Object.Proxy,RefineShape):
return(":/icons/OpenSCAD_RefineShapeFeature.svg")
if isinstance(self.Object.Proxy,IncreaseTolerance):
@@ -179,6 +179,43 @@ class OpenSCADPlaceholder:
import Part
fp.Shape = Part.Compound([]) #empty Shape
class Resize :
def __init__(self,obj,target,vector) :
import FreeCAD
#self.Obj = obj
self.Target = target
self.Vector = vector
#obj.addProperty("App::PropertyPythonObject","Object","Resize", \
# "Object to be resized").Object = target
obj.addProperty("Part::PropertyPartShape","Shape","Resize", "Shape of the Resize")
obj.addProperty("App::PropertyVector","Vector","Resize",
" Resize Vector").Vector = FreeCAD.Vector(vector)
obj.Proxy = self
def onChanged(self, fp, prop):
if prop in ['Object','Vector'] :
self.createGeometry(fp)
def execute(self, fp):
self.createGeometry(fp)
def createGeometry(self, fp) :
print("Resize create Geometry")
import FreeCAD
mat = FreeCAD.Matrix()
mat.A11 = self.Vector[0]
mat.A22 = self.Vector[1]
mat.A33 = self.Vector[2]
print(mat)
fp.Shape = self.Target.Shape.transformGeometry(mat)
def __getstate__(self):
return None
def __setstate__(self,state):
return None
class MatrixTransform:
def __init__(self, obj,matrix=None,child=None):
obj.addProperty("App::PropertyLink","Base","Base",
@@ -236,9 +273,9 @@ class RefineShape:
def execute(self, fp):
if fp.Base and fp.Base.Shape.isValid():
import OpenSCADUtils
import freecad.OpenSCAD.OpenSCADUtils
sh=fp.Base.Shape.removeSplitter()
fp.Shape=OpenSCADUtils.applyPlacement(sh)
fp.Shape=freecad.OpenSCAD.OpenSCADUtils.applyPlacement(sh)
class IncreaseTolerance:
'''increase the tolerance of every vertex
@@ -462,8 +499,8 @@ class CGALFeature:
def execute(self,fp):
#arguments are ignored
maxmeshpoints = None #TBD: add as property
import Part,OpenSCADUtils
shape = OpenSCADUtils.process_ObjectsViaOpenSCADShape(fp.Document,fp.Children,\
import Part, freecad.OpenSCAD.OpenSCADUtils
shape = freecad.OpenSCAD.OpenSCADUtils.process_ObjectsViaOpenSCADShape(fp.Document,fp.Children,\
fp.Operation, maxmeshpoints=maxmeshpoints)
if shape:
fp.Shape = shape

View File

@@ -41,24 +41,24 @@ else:
if printverbose: print("FreeCAD Gui not present.")
gui = False
try:
import ply.lex as lex
import ply.yacc as yacc
except:
FreeCAD.Console.PrintError("PLY module was not found. Please refer to the OpenSCAD documentation on the FreeCAD wiki\n")
import ply.lex as lex
import ply.yacc as yacc
import Part
from OpenSCADFeatures import *
from OpenSCADUtils import *
import freecad.OpenSCAD.OpenSCADFeatures
import freecad.OpenSCAD.OpenSCADUtils
params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD")
printverbose = params.GetBool('printVerbose',False)
printverbose = True
# Get the token map from the lexer. This is required.
import tokrules
import freecad.OpenSCAD.tokrules
from tokrules import tokens
try:
from PySide import QtGui
_encoding = QtGui.QApplication.UnicodeUTF8
def translate(context, text):
"convenience function for Qt translator"
@@ -77,6 +77,7 @@ def open(filename):
docname = os.path.splitext(os.path.basename(filename))[0]
doc = FreeCAD.newDocument(docname)
if filename.lower().endswith('.scad'):
from OpenSCADUtils import callopenscad, workaroundforissue128needed
tmpfile=callopenscad(filename)
if workaroundforissue128needed():
pathName = '' #https://github.com/openscad/openscad/issues/128
@@ -104,6 +105,7 @@ def insert(filename,docname):
doc=FreeCAD.newDocument(docname)
#importgroup = doc.addObject("App::DocumentObjectGroup",groupname)
if filename.lower().endswith('.scad'):
from OpenSCADUtils import callopenscad, workaroundforissue128needed
tmpfile=callopenscad(filename)
if workaroundforissue128needed():
pathName = '' #https://github.com/openscad/openscad/issues/128
@@ -125,7 +127,7 @@ def processcsg(filename):
if printverbose: print ('ImportCSG Version 0.6a')
# Build the lexer
if printverbose: print('Start Lex')
lex.lex(module=tokrules)
lex.lex(module=freecad.OpenSCAD.tokrules)
if printverbose: print('End Lex')
# Build the parser
@@ -347,6 +349,7 @@ def p_operation(p):
| hull_action
| minkowski_action
| offset_action
| resize_action
'''
p[0] = p[1]
@@ -366,6 +369,7 @@ def placeholder(name,children,arguments):
def CGALFeatureObj(name,children,arguments=[]):
myobj=doc.addObject("Part::FeaturePython",name)
from OpenSCADFeatures import CGALFeature
CGALFeature(myobj,name,children,str(arguments))
if gui:
for subobj in children:
@@ -414,23 +418,71 @@ def p_offset_action(p):
def p_hull_action(p):
'hull_action : hull LPAREN RPAREN OBRACE block_list EBRACE'
from OpenSCADFeatures import CGALFeature
p[0] = [ CGALFeatureObj(p[1],p[5]) ]
def setObjColor(obj, color):
# set color for all faces of selected object
colorlist=[]
for i in range(len(obj.Shape.Faces)):
colorlist.append(color)
#print('[*] Object contains %d faces'%(len(colorlist),))
obj.ViewObject.DiffuseColor = colorlist
def setOutListColor(obj, color) :
if obj.OutList != None :
for i in obj.OutList :
setOutListColor(i,color)
setObjColor(i,color)
def p_minkowski_action(p):
'''
minkowski_action : minkowski LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE'''
p[0] = [ CGALFeatureObj(p[1],p[6],p[3]) ]
# - For minkowski Just indicate first shape needs editing
if len(p[6]) == 2 :
# return just first object
#print(dir(p[6][0]))
#print(dir((p[6][1]).ViewObject))
#print(p[6][0].TypeId)
p[6][0].ViewObject.ShapeColor = (1.,0.,0.)
setObjColor(p[6][0],(1.,0.,0.))
setOutListColor(p[6][0],(1.,0.,0.))
#print(p[6][1].TypeId)
p[6][1].ViewObject.ShapeColor = (0.,1.,0.)
setObjColor(p[6][1],(0.,1.,0.))
setOutListColor(p[6][1],(1.,0.,0.))
#p[6][1].ViewObject.hide()
p[0] = [p[6][0]]
else :
p[0] = [ CGALFeatureObj(p[1],p[6],p[3]) ]
def p_resize_action(p):
'''
resize_action : resize LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE'''
from OpenSCADFeatures import Resize, ViewProviderTree
print("Resize")
newsize = p[3]['newsize']
print(newsize)
auto = p[3]['auto']
print(auto)
myresize = doc.addObject('Part::FeaturePython','Resize')
Resize(myresize,p[6][0],newsize)
ViewProviderTree(myresize.ViewObject)
p[0] = [myresize]
def p_not_supported(p):
'''
not_supported : glide LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE
| resize LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE
| subdiv LPAREN keywordargument_list RPAREN OBRACE block_list EBRACE
'''
if gui and not FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\
GetBool('usePlaceholderForUnsupported'):
from PySide import QtGui
QtGui.QMessageBox.critical(None, translate('OpenSCAD',"Unsupported Function")+" : "+p[1],translate('OpenSCAD',"Press OK"))
QtGui.QMessageBox.critical(None, translate('OpenSCAD',p[1]+" : Unsupported Function"),translate('OpenSCAD',"Press OK"))
else:
p[0] = [placeholder(p[1],p[6],p[3])]
@@ -568,6 +620,8 @@ def p_intersection_action(p):
if printverbose: print("End Intersection")
def process_rotate_extrude(obj,angle):
from OpenSCADFeatures import RefineShape
newobj=doc.addObject("Part::FeaturePython",'RefineRotateExtrude')
RefineShape(newobj,obj)
if gui:
@@ -609,6 +663,8 @@ def p_rotate_extrude_file(p):
def process_linear_extrude(obj,h) :
#if gui:
from OpenSCADFeatures import RefineShape
newobj=doc.addObject("Part::FeaturePython",'RefineLinearExtrude')
RefineShape(newobj,obj)#mylinear)
if gui:
@@ -771,6 +827,10 @@ def processSTL(fname):
def p_multmatrix_action(p):
'multmatrix_action : multmatrix LPAREN matrix RPAREN OBRACE block_list EBRACE'
from OpenSCADUtils import isspecialorthogonalpython, \
fcsubmatrix, roundrotation, isrotoinversionpython, \
decomposerotoinversion
from OpenSCADFeatures import RefineShape
if printverbose: print("MultMatrix")
transform_matrix = FreeCAD.Matrix()
if printverbose: print("Multmatrix")
@@ -790,6 +850,9 @@ def p_multmatrix_action(p):
if printverbose: print(transform_matrix)
if printverbose: print("Apply Multmatrix")
# If more than one object on the stack for multmatrix fuse first
if p[6] == None :
print(p)
print(dir(p))
if (len(p[6]) == 0) :
part = placeholder('group',[],'{}')
elif (len(p[6]) > 1) :
@@ -953,6 +1016,7 @@ def p_cylinder_action(p):
else:
if printverbose: print("Make Frustum")
mycyl=doc.addObject("Part::FeaturePython",'frustum')
from OpenSCADFeatures import Frustum
Frustum(mycyl,r1,r2,n,h)
if gui:
if FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\
@@ -1201,9 +1265,10 @@ def p_projection_action(p) :
subobj[0].ViewObject.hide()
p[0] = [obj]
else: # cut == 'false' => true projection
if gui and not FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\
GetBool('usePlaceholderForUnsupported'):
from PySide import QtGui
QtGui.QMessageBox.critical(None, translate('OpenSCAD',"Unsupported Function")+" : "+p[1],translate('OpenSCAD',"Press OK"))
else:
p[0] = [placeholder(p[1],p[6],p[3])]
#if gui and not FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/OpenSCAD").\
# GetBool('usePlaceholderForUnsupported'):
# from PySide import QtGui
# QtGui.QMessageBox.critical(None, translate('OpenSCAD',p[1]+" : Unsupported Function"),translate('OpenSCAD',"Press OK"))
#else:
# p[0] = [placeholder(p[1],p[6],p[3])]
p[0] = [placeholder(p[1],p[6],p[3])]