Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add FCStd read and write nodes #3674

Merged
merged 52 commits into from Apr 12, 2022
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
6668cf0
Add files via upload
rastart Oct 26, 2020
9073411
added SvReadFCStd/SvWriteFCStd to Exchange
rastart Oct 26, 2020
4b26c12
Update nodes/exchange/FCStd_read.py
rastart Oct 27, 2020
825162c
Update nodes/exchange/FCStd_read.py
rastart Oct 27, 2020
802492e
Update nodes/exchange/FCStd_write.py
rastart Oct 27, 2020
d11ca03
Update FCStd_write.py
rastart Oct 27, 2020
b6fef17
Update FCStd_read.py
rastart Oct 27, 2020
8c7e302
Update FCStd_read.py
rastart Oct 27, 2020
d9f5ef0
Update FCStd_write.py
rastart Oct 27, 2020
70024f3
Update FCStd_read.py
rastart Oct 27, 2020
98b7d49
Update FCStd_read.py
rastart Oct 30, 2020
c60442b
Update FCStd_read.py
rastart Oct 30, 2020
3d2b71f
Update FCStd_read.py
rastart Oct 30, 2020
0eae3ff
added FCStd_sketch node
rastart Nov 29, 2020
259e321
added SvReadFCStdSketchNode
rastart Nov 29, 2020
a7874d0
added curve output ( line - circle - arc )
rastart Dec 10, 2020
dcbceb8
beging to add body/part/feature filter
rastart Dec 30, 2020
f168fae
parent body placement matrix
rastart Dec 30, 2020
23730c6
FCStd_spreadsheet node
rastart Dec 30, 2020
ec7134b
added SvFCStdSpreadsheetNode in exchange
rastart Dec 30, 2020
50a1959
Update FCStd_spreadsheet.py
rastart Jan 30, 2021
2773a47
added nurbs curve conversion
rastart Jan 30, 2021
21cc34e
added construction geometry filter
rastart Jan 30, 2021
ca94cf7
Merge remote-tracking branch 'upstream/master'
rastart Feb 10, 2021
75a75c8
Update FCStd_write.py
rastart Feb 10, 2021
45e43d4
register issue fix
rastart Feb 10, 2021
88e7c57
Update FCStd_sketch.py
rastart Feb 10, 2021
9f65386
Update FCStd_write.py
rastart Feb 10, 2021
0f8eca6
Update FCStd_write.py
rastart Feb 11, 2021
ca18170
Merge remote-tracking branch 'upstream/master'
rastart Feb 11, 2021
1cf0eb5
Merge remote-tracking branch 'upstream/master'
rastart Feb 19, 2021
bee2af7
fix unregister error
rastart Feb 19, 2021
13ab57d
adding docs
rastart Feb 19, 2021
bf90473
Update exchange_index.rst
rastart Feb 19, 2021
6bfc66d
Update exchange_index.rst
rastart Feb 19, 2021
296282c
Merge remote-tracking branch 'upstream/master'
rastart Mar 27, 2021
0de6e50
Update FCStd_spreadsheet.py
rastart Mar 27, 2021
87c1af9
Merge remote-tracking branch 'upstream/master'
rastart Apr 4, 2021
8a0e2ac
Merge remote-tracking branch 'upstream/master'
rastart Apr 8, 2021
5b640e4
Merge remote-tracking branch 'upstream/master'
rastart May 8, 2021
98a05c3
tree/node name & freecad 0.19 fix
rastart May 9, 2021
4e694cb
added update button (all nodes)
rastart May 22, 2021
d6bbb3b
Merge remote-tracking branch 'upstream/master'
rastart May 22, 2021
7f337ca
Merge remote-tracking branch 'upstream/master'
rastart Aug 16, 2021
0f56ad3
approximate subd to nurbs node added
rastart Aug 17, 2021
0095b68
Merge remote-tracking branch 'upstream/master'
rastart Aug 17, 2021
1ec4192
Update approx_subd_to_nurbs.py
rastart Aug 17, 2021
b04bd64
Update approx_subd_to_nurbs.py
rastart Aug 17, 2021
2f6975f
Merge remote-tracking branch 'upstream/master'
rastart Aug 19, 2021
a9a2f6c
Merge remote-tracking branch 'upstream/master'
rastart Oct 22, 2021
1e842ae
Merge remote-tracking branch 'upstream/master'
rastart Jan 20, 2022
9cd424a
Merge remote-tracking branch 'upstream/master'
rastart Mar 16, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions index.md
Expand Up @@ -614,6 +614,8 @@
SvExJsonToNurbsNode
SvImportSolidNode
SvExportSolidNode
SvReadFCStdNode
SvWriteFCStdNode

## Network
UdpClientNode
Expand Down
102 changes: 102 additions & 0 deletions nodes/exchange/FCStd_read.py
@@ -0,0 +1,102 @@
from sverchok.dependencies import FreeCAD
from sverchok.utils.dummy_nodes import add_dummy

if FreeCAD is None:
add_dummy('SvReadFCStdNode', 'SvReadFCStdNode', 'FreeCAD')

else:
F = FreeCAD
import bpy,sys
from bpy.props import IntProperty, FloatProperty, StringProperty, BoolProperty
from sverchok.node_tree import SverchCustomTreeNode
from sverchok.utils.logging import info, exception
from numpy import ndarray

class SvReadFCStdNode(bpy.types.Node, SverchCustomTreeNode):
''' SvReadFCStdNode '''
rastart marked this conversation as resolved.
Show resolved Hide resolved
bl_idname = 'SvReadFCStdNode'
bl_label = 'Read FCStd'
bl_icon = 'IMPORT'
solid_catergory = "Inputs"

read_update : BoolProperty(name="read_update", default=True)
part_filter : StringProperty(name="part_filter", default="", description="use ',' to separate name with no space: part1,part2,... ")
inv_filter : BoolProperty(name="inv_filter", default=False)
rastart marked this conversation as resolved.
Show resolved Hide resolved

def draw_buttons(self, context, layout):

layout.label(text="filter by name:")

col = layout.column(align=True)
col.prop(self, 'part_filter',text="")
col.prop(self, 'inv_filter')
col.prop(self, 'read_update')

def sv_init(self, context):
self.inputs.new('SvFilePathSocket', "File Path")
self.outputs.new('SvSolidSocket', "Solid")

def process(self):
if not any(socket.is_linked for socket in self.outputs):
return
if not self.inputs['File Path'].is_linked:
return

if self.read_update:

files = self.inputs['File Path'].sv_get()[0]
solids = []

for f in files:
S = LoadSolid(f,self.part_filter,self.inv_filter)
for s in S:
solids.append(s)

self.outputs['Solid'].sv_set(solids)

else:
return


def LoadSolid(fc_file,part_filter,inv_filter):
solids = []

if ',' in part_filter:
part_filter = part_filter.split(',')

elif not part_filter:
part_filter = ['all']

else:
part_filter = [part_filter]

try:

F.open(fc_file)
Fname = bpy.path.display_name_from_filepath(fc_file)
F.setActiveDocument(Fname)

for obj in F.ActiveDocument.Objects:

if obj.Module in ('Part','PartDesign'):

if not inv_filter:
if obj.Label in part_filter or 'all' in part_filter:
solids.append(obj.Shape)

else:
if not obj.Label in part_filter:
solids.append(obj.Shape)

except:
info('FCStd read error')
finally:
F.closeDocument(Fname)
return solids


def register():
bpy.utils.register_class(SvReadFCStdNode)

def unregister():
bpy.utils.unregister_class(SvReadFCStdNode)
182 changes: 182 additions & 0 deletions nodes/exchange/FCStd_write.py
@@ -0,0 +1,182 @@

from sverchok.dependencies import FreeCAD
from sverchok.utils.dummy_nodes import add_dummy

if FreeCAD is None:
add_dummy('SvWriteFCStdNode', 'SvWriteFCStdNode', 'FreeCAD')

else:
F = FreeCAD
import bpy,sys
from bpy.props import IntProperty, FloatProperty, StringProperty, BoolProperty,EnumProperty
from sverchok.node_tree import SverchCustomTreeNode, throttled
from sverchok.data_structure import updateNode
from numpy import ndarray
rastart marked this conversation as resolved.
Show resolved Hide resolved

class SvWriteFCStdNode(bpy.types.Node, SverchCustomTreeNode):
''' SvWriteFCStdNode '''
bl_idname = 'SvWriteFCStdNode'
bl_label = 'Write FCStd'
bl_icon = 'IMPORT'
solid_catergory = "Inputs"

write_update : BoolProperty(
name="write_update",
default=True)

part_name : StringProperty(
name="part_name",
default="part_name")

@throttled
def changeMode(self, context):

if self.obj_format == 'mesh':
if 'Verts' not in self.inputs:
self.inputs.remove(self.inputs['Solid'])
self.inputs.new('SvVerticesSocket', 'Verts')
self.inputs.new('SvVerticesSocket', 'Faces')
return
else:
if 'Solid' not in self.inputs:
self.inputs.remove(self.inputs['Verts'])
self.inputs.remove(self.inputs['Faces'])
self.inputs.new('SvSolidSocket', 'Solid')
return


obj_format : EnumProperty(
name='format',
description='choose format',
items={
('solid', 'solid', 'solid'),
('mesh', 'mesh', 'mesh')},
default='solid',
update=changeMode)

def draw_buttons(self, context, layout):

layout.label(text="write name:")
col = layout.column(align=True)
col.prop(self, 'part_name',text="")
col.prop(self, 'obj_format',text="")
col.prop(self, 'write_update')
if self.obj_format == 'mesh':
col.label(text="need triangle meshes")


def sv_init(self, context):
self.inputs.new('SvFilePathSocket', "File Path")

if self.obj_format == 'mesh':
self.inputs.new('SvVerticesSocket', "Verts")
self.inputs.new('SvStringsSocket', "Faces")

else:
self.inputs.new('SvSolidSocket', 'Solid')

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When this function is called obj_format will always be the default value (solid)

Copy link
Collaborator Author

@rastart rastart Oct 27, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I noticed a strange behaviour with the enum, also if I save sometime when I reopen the file the value is changed.
I'll look better at how this is implemented in other nodes.


def process(self):

if not self.inputs['File Path'].is_linked:
return

files = self.inputs['File Path'].sv_get()

if not len(files[0]) == 1:
print ('FCStd write node support just 1 file at once')
return

fc_file=files[0][0]

if self.obj_format == 'mesh':

if any((self.inputs['Verts'].is_linked,self.inputs['Faces'].is_linked,self.write_update)):

verts=self.inputs['Verts'].sv_get()
pols=self.inputs['Faces'].sv_get()
fc_write_parts(fc_file,verts,pols,self.part_name,None,self.obj_format)
rastart marked this conversation as resolved.
Show resolved Hide resolved

elif self.obj_format == 'solid':

if self.inputs['Solid'].is_linked and self.write_update:
solid=self.inputs['Solid'].sv_get()
fc_write_parts(fc_file,None,None,self.part_name,solid,self.obj_format)

else:
return


def fc_write_parts(fc_file, verts, faces, part_name, solid, mod):

try:
F.open(fc_file)
Fname = bpy.path.display_name_from_filepath(fc_file)
except:
print ('FCStd open error')
return


F.setActiveDocument(Fname)
fc_root = F.getDocument(Fname)

obj_names = set( [ i.Name for i in fc_root.Objects] )

part_name += '_sv_' #->suffix added to avoid deleting erroneusly freecad objects

# SEARCH the freecad project for previous writed parts from this node

if part_name in obj_names: #if the part name is numberless is detected as single
fc_root.removeObject(part_name)

else:
for name in obj_names: #if not, check the fc project if there are parts with same root name
if part_name in name:
fc_root.removeObject(name)

############### if there, previous writed parts are removed ####################
############### so then write them again...

if mod == 'solid': #EXPORT SOLID

#if len(solid)==1:
#new_part = F.ActiveDocument.addObject("Part::Feature",part_name) #single: give numberless name
#new_part.Shape = solid[0]

#else:
for i,s in enumerate(solid):
new_part = F.ActiveDocument.addObject("Part::Feature",part_name+str(i)) #multiple: give numbered name
new_part.Shape = s

else: #EXPORT MESH

import Mesh

for i in range(len(verts)):

temp_faces=faces[i]
temp_verts=verts[i]

meshdata=[]

for f in temp_faces:
v1,v2,v3 = f[0],f[1],f[2]
meshdata.append( temp_verts[v1] )
meshdata.append( temp_verts[v2] )
meshdata.append( temp_verts[v3] )

mesh = Mesh.Mesh(meshdata)
obj = F.ActiveDocument.addObject("Mesh::Feature", part_name+str(i))
obj.Mesh = mesh


F.ActiveDocument.recompute()
F.getDocument(Fname).save()
F.closeDocument(Fname)


def register():
bpy.utils.register_class(SvWriteFCStdNode)

def unregister():
bpy.utils.unregister_class(SvWriteFCStdNode)