How to set name from copyobject

Need help, or want to share a macro? Post here!
Forum rules
Be nice to others! Respect the FreeCAD code of conduct!
Post Reply
grog
Posts: 3
Joined: Fri Jun 07, 2019 4:29 am

How to set name from copyobject

Post by grog »

I have a freecad script which creates a template object, then executes a copyObject -> getSelection object. This works great for multiple objects where I can create an object, specifying the name to use. It fails in the case of one object, which won't let me change the copyObject's name.
NOTE: FreeCAD versions tested: 0.19 and 0.20.
At line 298 I copy the templateobject

Code: Select all

usb = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_USB, "USBs" )

At line 339 I try to reference USBs but that fails. It turns out 'usb' is referenced by name="SHAPE_USB001", and label="USBs". The next commented line is a substitute, but it's clumsy.

Code: Select all

    App.getDocument(documentName).addObject("Part::Cut","tray003")
    App.getDocument(documentName).tray003.Base = App.getDocument(documentName).tray002
[b]    App.getDocument(documentName).tray002.Tool = App.getDocument(documentName).USBs[/b]
    #App.getDocument(documentName).tray003.Tool = App.getDocument(documentName).getObjectsByLabel("USBs")[0]
    #In the case of only one instance of USB, the name was already created during copyObject and cannot be changed. So using label
So is there a method of setting the 'usb' object's name or assigning it's name as 'USBs' by some other function?

The script generates a tray with slots for an SD, SDmini, and USB adapters. I've tried attaching as well but there's an error. It only wants FCStd and screenshots as attachments.

Cheers,
GROG

The full python code:

Code: Select all

#### INSTRUCTIONS #############################################################
# 1. open me as a file from within FreeCAD 
# 2. set desired rows and columns
# 3. run me by clicking the play icon  
#
#   RESOURCES:
#   http://free-cad.sourceforge.net/SrcDocu/d8/d3e/classApp_1_1Document.html
#





#### VARIABLES ################################################################
freecadFolder="D:/Program Files/FreeCAD 0.19/bin"
documentName='sd_scripted4'
gap='0.20'
space_x='3.00'
space_y='9.00'
floor='.50'
wall='2.40'
micro_x='0.8'
micro_y='11.0'
micro_z='13.0'
sd_x='2.1'
sd_y='24.0'
sd_z='32.0'
usb_x='4.5'
usb_y='12.0'
usb_z=micro_z
rows='2.'
micro_cols='6.'
sd_cols='6.'
usb_cols='1.'
base_x= '=2*wall + (micro_cols*(micro_x + 2*gap )+(micro_cols-1)*space_x+space_x) + (sd_cols*(sd_x+2*gap)+(sd_cols-1)*space_x+space_x) + (usb_cols*(usb_x+2*gap)+(usb_cols-1)*space_x)'
base_y= '=2*wall + rows*(micro_y + 2*gap) + (rows-1) * space_y'
base_z= '=micro_z + floor'

#### IMPORT MODULES ############################################################
import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *
import FreeCAD
import Draft
import FreeCADGui
import math
import sys

#### FUNCTIONS ################################################################
from PySide import QtGui
from PySide.QtCore import *
mw=Gui.getMainWindow()
c=mw.findChild(QtGui.QPlainTextEdit, "Python console")
c.clear()
r=mw.findChild(QtGui.QTextEdit, "Report view")
r.clear()

def clear_views():
    #Clear Report View and Python Console.  Cleans up old run information
    mw=Gui.getMainWindow()
    c=mw.findChild(QtGui.QPlainTextEdit, "Python console")
    c.clear()
    r=mw.findChild(QtGui.QTextEdit, "Report view")
    r.clear()

def setup_environment(freecadFolder,documentName):
    # add folder containing FreeCAD.pyd, FreeCADGui.pyd to sys.path
    sys.path.append(freecadFolder) # example for Windows
    doc = App.newDocument(documentName)
    #App.setActiveDocument(documentName)
    #App.ActiveDocument=App.getDocument(documentName)
    #Gui.ActiveDocument=Gui.getDocument(documentName)
    #Gui.activeDocument().activeView().viewDefaultOrientation()
    App.getDocument(documentName).recompute() # updates GUI
    return(doc)

def set_spreadsheet():
    Gui.activateWorkbench("SpreadsheetWorkbench")
    App.activeDocument().addObject('Spreadsheet::Sheet','s1')
    #Unit Dimensions
    cell = 1
    App.getDocument(documentName).s1.set(     'A'+str(cell), 'gap')
    App.getDocument(documentName).s1.set(     'B'+str(cell), gap)
    App.getDocument(documentName).s1.setAlias('B'+str(cell), 'gap')
    cell+=1
    App.getDocument(documentName).s1.set(     'A'+str(cell), 'floor')
    App.getDocument(documentName).s1.set(     'B'+str(cell), floor)
    App.getDocument(documentName).s1.setAlias('B'+str(cell), 'floor')
    cell+=1
    App.getDocument(documentName).s1.set(     'A'+str(cell), 'wall')
    App.getDocument(documentName).s1.set(     'B'+str(cell), wall)
    App.getDocument(documentName).s1.setAlias('B'+str(cell), 'wall')
    cell+=1
    App.getDocument(documentName).s1.set(     'A'+str(cell),'space_x')
    App.getDocument(documentName).s1.set(     'B'+str(cell), space_x)
    App.getDocument(documentName).s1.setAlias('B'+str(cell),'space_x')
    cell+=1
    App.getDocument(documentName).s1.set(     'A'+str(cell),'space_y')
    App.getDocument(documentName).s1.set(     'B'+str(cell), space_y)
    App.getDocument(documentName).s1.setAlias('B'+str(cell),'space_y')
    cell+=1
    App.getDocument(documentName).s1.set(     'A'+str(cell), 'rows')
    App.getDocument(documentName).s1.set(     'B'+str(cell), rows)
    App.getDocument(documentName).s1.setAlias('B'+str(cell), 'rows')
    cell+=1
    App.getDocument(documentName).s1.set(     'A'+str(cell), 'micro_cols')
    App.getDocument(documentName).s1.set(     'B'+str(cell), micro_cols)
    App.getDocument(documentName).s1.setAlias('B'+str(cell), 'micro_cols')
    cell+=1
    App.getDocument(documentName).s1.set(     'A'+str(cell), 'sd_cols')
    App.getDocument(documentName).s1.set(     'B'+str(cell), sd_cols)
    App.getDocument(documentName).s1.setAlias('B'+str(cell), 'sd_cols')
    cell+=1
    App.getDocument(documentName).s1.set(     'A'+str(cell), 'usb_cols')
    App.getDocument(documentName).s1.set(     'B'+str(cell), usb_cols)
    App.getDocument(documentName).s1.setAlias('B'+str(cell), 'usb_cols')

    #Rectangular Dimensions
    #Set column names
    cell+=1
    cell+=1
    App.getDocument(documentName).s1.set(     'B'+str(cell), 'x')
    App.getDocument(documentName).s1.set(     'C'+str(cell), 'y')
    App.getDocument(documentName).s1.set(     'D'+str(cell), 'z')
    App.getDocument(documentName).s1.set(     'E'+str(cell), 'dx')
    App.getDocument(documentName).s1.set(     'F'+str(cell), 'dy')
    App.getDocument(documentName).s1.set(     'G'+str(cell), 'dz')
    #The base
    cell+=1
    App.getDocument(documentName).s1.set(       'A'+str(cell), 'base_')
    App.getDocument(documentName).s1.set(       'B'+str(cell), base_x)
    App.getDocument(documentName).s1.setAlias('B'+str(cell),'base_x')
    App.getDocument(documentName).s1.set(       'C'+str(cell), base_y)
    App.getDocument(documentName).s1.setAlias('C'+str(cell),'base_y')
    App.getDocument(documentName).s1.set(       'D'+str(cell), base_z)
    App.getDocument(documentName).s1.setAlias('D'+str(cell),'base_z')
    #micro SD card
    cell+=1
    App.getDocument(documentName).s1.set(       'A'+str(cell), 'micro_')
    App.getDocument(documentName).s1.set(       'B'+str(cell), micro_x )
    App.getDocument(documentName).s1.setAlias('B'+str(cell),'micro_x')
    App.getDocument(documentName).s1.set(       'C'+str(cell), micro_y )
    App.getDocument(documentName).s1.setAlias('C'+str(cell),'micro_y')
    App.getDocument(documentName).s1.set(       'D'+str(cell), micro_z )
    App.getDocument(documentName).s1.setAlias('D'+str(cell),'micro_z')
    App.getDocument(documentName).s1.set(       'G'+str(cell), floor )
    App.getDocument(documentName).s1.setAlias('G'+str(cell),'micro_dz')
    #SD_
    cell+=1
    App.getDocument(documentName).s1.set(       'A'+str(cell), 'sd_')
    App.getDocument(documentName).s1.set(       'B'+str(cell), sd_x )
    App.getDocument(documentName).s1.setAlias('B'+str(cell),'sd_x')
    App.getDocument(documentName).s1.set(       'C'+str(cell), sd_y )
    App.getDocument(documentName).s1.setAlias('C'+str(cell),'sd_y')
    App.getDocument(documentName).s1.set(       'D'+str(cell), sd_z )
    App.getDocument(documentName).s1.setAlias('D'+str(cell),'sd_z')
    App.getDocument(documentName).s1.set(       'G'+str(cell), floor )
    App.getDocument(documentName).s1.setAlias('G'+str(cell),'sd_dy')
    App.getDocument(documentName).s1.set(       'G'+str(cell), floor )
    App.getDocument(documentName).s1.setAlias('G'+str(cell),'sd_dz')
    #USB
    cell+=1
    App.getDocument(documentName).s1.set(       'A'+str(cell), 'usb_')
    App.getDocument(documentName).s1.set(       'B'+str(cell), usb_x )
    App.getDocument(documentName).s1.setAlias('B'+str(cell),'usb_x')
    App.getDocument(documentName).s1.set(       'C'+str(cell), usb_y )
    App.getDocument(documentName).s1.setAlias('C'+str(cell),'usb_y')
    App.getDocument(documentName).s1.set(       'D'+str(cell), usb_z )
    App.getDocument(documentName).s1.setAlias('D'+str(cell),'usb_z')
    App.getDocument(documentName).s1.set(       'G'+str(cell), floor )
    App.getDocument(documentName).s1.setAlias('G'+str(cell),'usb_dz')
    #Circular dimensions
    cell+=1
    cell+=1
    App.getDocument(documentName).s1.set(     'B'+str(cell), 'd')
    App.getDocument(documentName).s1.set(     'C'+str(cell), 'r')
    App.getDocument(documentName).s1.set(     'D'+str(cell), 'h')
    App.getDocument(documentName).s1.set(     'E'+str(cell), 'dx')
    App.getDocument(documentName).s1.set(     'F'+str(cell), 'dy')
    App.getDocument(documentName).s1.set(     'G'+str(cell), 'dz')
    
    App.getDocument(documentName).recompute() # updates GUI

def draw_base():
    print("draw_base()")
    App.getDocument(documentName).addObject("Part::Box","Base")
    App.getDocument(documentName).ActiveObject.Label = "Base" # Give it a name
    App.getDocument(documentName).getObject("Base").setExpression('Length', u's1.base_x')
    App.getDocument(documentName).getObject("Base").setExpression('Width',  u's1.base_y')
    App.getDocument(documentName).getObject("Base").setExpression('Height', u's1.base_z')
    Gui.ActiveDocument.ActiveView.viewIsometric()
    Gui.ActiveDocument.ActiveView.getViewDirection()
    Gui.SendMsgToActiveView("ViewSelection")
    Gui.SendMsgToActiveView("ViewFit")
    
    App.getDocument(documentName).recompute() # updates GUI

##### Make a grid of rounds #################################################
def draw_shape_object_micro():
    #Gui.ActivateWorkbench("PartWorkbench")
    print("draw_shape_object_micro()")
    App.getDocument(documentName).addObject("Part::Box","SHAPE_MICRO")
    App.getDocument(documentName).ActiveObject.Label = "SHAPE_MICRO"  # Give it a name
    App.getDocument(documentName).getObject("SHAPE_MICRO").setExpression('Length', u's1.micro_x + s1.gap * 2')
    App.getDocument(documentName).getObject("SHAPE_MICRO").setExpression('Width',  u's1.micro_y + s1.gap * 2')
    App.getDocument(documentName).getObject("SHAPE_MICRO").setExpression('Height', u's1.micro_z')
    
    App.getDocument(documentName).recompute() # updates GUI
    # Hide micro template shape 
    App.getDocument(documentName).getObject("SHAPE_MICRO").ViewObject.Visibility = False

def draw_shape_object_sd():
    #Gui.ActivateWorkbench("PartWorkbench")
    print("draw_shape_object_sd()")
    App.getDocument(documentName).addObject("Part::Box","SHAPE_SD")
    App.getDocument(documentName).ActiveObject.Label = "SHAPE_SD"  # Give it a name
    App.getDocument(documentName).getObject("SHAPE_SD").setExpression('Length', u's1.sd_x + s1.gap * 2')
    App.getDocument(documentName).getObject("SHAPE_SD").setExpression('Width',  u's1.sd_y + s1.gap * 2')
    App.getDocument(documentName).getObject("SHAPE_SD").setExpression('Height', u's1.sd_z')
    
    App.getDocument(documentName).recompute() # updates GUI
    # Hide micro template shape 
    App.getDocument(documentName).getObject("SHAPE_SD").ViewObject.Visibility = False

def draw_shape_object_usb():
    #Gui.ActivateWorkbench("PartWorkbench")
    print("draw_shape_object_usb()")
    App.getDocument(documentName).addObject("Part::Box","SHAPE_USB")
    App.getDocument(documentName).ActiveObject.Label = "SHAPE_USB"  # Give it a name
    App.getDocument(documentName).getObject("SHAPE_USB").setExpression('Length', u's1.usb_x + s1.gap * 2')
    App.getDocument(documentName).getObject("SHAPE_USB").setExpression('Width',  u's1.usb_y + s1.gap * 2')
    App.getDocument(documentName).getObject("SHAPE_USB").setExpression('Height', u's1.usb_z')
    App.getDocument(documentName).recompute() # updates GUI
    #App.getDocument(documentName).getObject("SHAPE_USB").ViewObject.Visibility = False
    # Hide micro template shape 
    

def create_shape_matrix_micro():
    # https://www.freecadweb.org/wiki/Draft_PointArray
    print("create_shape_matrix_micro()")
    merge = FreeCADGui.Selection.getSelection()
    App.getDocument(documentName).recompute()
    #These Commented lines get numerical values from expressions
    #micro_x = App.getDocument(documentName).s1.get("micro_x")
    #micro_y = App.getDocument(documentName).s1.get("micro_y")
    #micro_z = App.getDocument(documentName).s1.get("micro_z")
    #micro_dz= App.getDocument(documentName).s1.get("micro_dz")
    #space_x = App.getDocument(documentName).s1.get('space_x')
    #space_y = App.getDocument(documentName).s1.get('space_y')
    #wall = App.getDocument(documentName).s1.get('wall')
    #gap  = App.getDocument(documentName).s1.get('gap')
    rows = App.getDocument(documentName).s1.get('rows')
    micro_cols = App.getDocument(documentName).s1.get('micro_cols')
    for r in range ( 1 , math.floor(rows) + 1 ):
        for c in range ( 1 , math.floor(micro_cols) + 1 ):
            micro = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_MICRO );
            dxStr = ('s1.wall + (%s - 1) * (s1.micro_x + 2 * s1.gap + s1.space_x)' % c)
            dyStr = ('s1.wall + (%s - 1) * (s1.micro_y + 2 * s1.gap + s1.space_y)' % r)
            #This commented line will set placement but as fixed numbers, not expressions
            #dx = wall + (c - 1) * (micro_x + 2 * gap + space_x);
            #dy = wall + (r - 1) * (micro_y + 2 * gap + space_y);
            #micro.Placement = App.Placement(App.Vector(dx,dy,micro_dz),App.Rotation(App.Vector(1,0,0),0));
            micro.setExpression('.Placement.Base.x' , dxStr ) 
            micro.setExpression('.Placement.Base.y' , dyStr ) 
            micro.setExpression('.Placement.Base.z' , u's1.micro_dz' ) 
            merge.append(micro)
    App.getDocument(documentName).recompute()
    App.getDocument(documentName).addObject("Part::MultiFuse","MICROs")
    App.getDocument(documentName).MICROs.Shapes = merge
 
def create_shape_matrix_sd ():
    print("create_shape_matrix_sd()")
    merge = FreeCADGui.Selection.getSelection()
    App.getDocument(documentName).recompute()
    sd_cols = App.getDocument(documentName).s1.get('sd_cols')
    for c in range ( 1 , math.floor(sd_cols) + 1 ):
        sd = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_SD );
        dxStr = ('s1.wall + s1.micro_cols*(s1.micro_x + s1.space_x) + s1.space_x + (%s - 1) * (s1.sd_x + s1.space_x)' % c)
        dyStr = ('(s1.base_y - s1.sd_y) / 2')
        sd.setExpression('.Placement.Base.x' , dxStr ) 
        sd.setExpression('.Placement.Base.y' , dyStr ) 
        sd.setExpression('.Placement.Base.z' , u's1.sd_dz' ) 
        merge.append(sd)
    App.getDocument(documentName).recompute()
    App.getDocument(documentName).addObject("Part::MultiFuse","SDs")
    App.getDocument(documentName).SDs.Shapes = merge
    return App.getDocument(documentName).SDs

def create_shape_matrix_usb ():
    print("create_shape_matrix_usb()")
    merge = FreeCADGui.Selection.getSelection()
    App.getDocument(documentName).recompute()
    usb_cols = App.getDocument(documentName).s1.get('usb_cols')
    if (usb_cols == 1):
        usb = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_USB, "USBs" );
        #usb.Name = "USBs" # nope, this property is read only
        usb.Label = "USBs"
        # Set Location
        dxStr = ('s1.wall + (s1.micro_cols*(s1.micro_x+s1.space_x)+s1.space_x) + (s1.sd_cols*(s1.sd_x+s1.space_x)+s1.space_x)')
        dyStr = ('(s1.base_y - s1.usb_y) / 2')
        usb.setExpression('.Placement.Base.x' , dxStr ) 
        usb.setExpression('.Placement.Base.y' , dyStr ) 
        usb.setExpression('.Placement.Base.z' , u's1.sd_dz' ) 
        App.getDocument(documentName).recompute() # updates GUI
        App.getDocument(documentName).getObject("SHAPE_USB").ViewObject.Visibility = False
        #App.getDocument(documentName).getObject("USBs").ViewObject.Visibility = True
    else:
        for c in range ( 1 , math.floor(usb_cols) + 1 ):
            usb = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_USB );
            dxStr = ('s1.wall + (s1.micro_cols*(s1.micro_x+s1.space_x)+s1.space_x) + (s1.sd_cols*(s1.sd_x+s1.space_x)) + ((%s - 1) * (s1.usb_x+4))' % c)
            dyStr = ('(s1.base_y - s1.usb_y) / 2')
            print(dxStr)
            usb.setExpression('.Placement.Base.x' , dxStr ) 
            usb.setExpression('.Placement.Base.y' , dyStr ) 
            usb.setExpression('.Placement.Base.z' , u's1.sd_dz' ) 
            merge.append(usb)
        App.getDocument(documentName).recompute()
        App.getDocument(documentName).addObject("Part::MultiFuse","USBs")
        App.getDocument(documentName).USBs.Shapes = merge
   # return App.getDocument(documentName).USBs

#def create_base():
#    print("create_base()")
#    App.getDocument(documentName).tray001.Base = App.getDocument(documentName).Base

def cut_objects():
    print("cut_objects()")
    App.getDocument(documentName).addObject("Part::Cut","tray001")
    App.getDocument(documentName).tray001.Base = App.getDocument(documentName).Base
    App.getDocument(documentName).tray001.Tool = App.getDocument(documentName).MICROs
    App.getDocument(documentName).addObject("Part::Cut","tray002")
    App.getDocument(documentName).tray002.Base = App.getDocument(documentName).tray001
    App.getDocument(documentName).tray002.Tool = App.getDocument(documentName).SDs
    App.getDocument(documentName).addObject("Part::Cut","tray003")
    App.getDocument(documentName).tray003.Base = App.getDocument(documentName).tray002
    App.getDocument(documentName).tray002.Tool = App.getDocument(documentName).USBs
    #App.getDocument(documentName).tray003.Tool = App.getDocument(documentName).getObjectsByLabel("USBs")[0]
    #In the case of only one instance of USB, the name was already created during copyObject and cannot be changed. So using label

#### MAIN #########################################################
clear_views()
doc = setup_environment(freecadFolder,documentName)
set_spreadsheet()
draw_base()
draw_shape_object_micro()
draw_shape_object_sd()
draw_shape_object_usb()
create_shape_matrix_micro()
create_shape_matrix_sd()
create_shape_matrix_usb()
cut_objects()
App.getDocument(documentName).recompute() # updates GUI
Gui.ActiveDocument.ActiveView.viewIsometric()
#filename = documentName + '.FCStd' 
#doc.saveCopy(filename)
User avatar
onekk
Veteran
Posts: 6205
Joined: Sat Jan 17, 2015 7:48 am
Contact:

Re: How to set name from copyobject

Post by onekk »

Hello, python code is somewhat confused:

1) some duplicate imports.


2) why you have to use a lot of:

Code: Select all

App.getDocument(documentName)
only to refer this to the actual document?

Code: Select all


doc = None

def setup_environment(freecadFolder,documentName):
...
doc = FreeCAD.getDocument(documentName)
FreeCAD.ActiveDocument = doc
usually will suffice and you could refer to doc

Note: FreeCAD is App and FreeCADGui is Gui.

This way the code is far more readable, and probably it will be easier to find the problem.

Regards

Carlo D.
GitHub page: https://github.com/onekk/freecad-doc.
- In deep articles on FreeCAD.
- Learning how to model with scripting.
- Various other stuffs.

Blog: https://okkmkblog.wordpress.com/
Post Reply