in my assebly I have a component “NioAblage” (not ok storage)
a componet named “Kundenteil” (customer part)
the “nioAblage” has a link “Drawer1”
and there are frames by the name of “Frame_Px” where x is a number
and ComponentContainers by the name “Container_Partx” where x is a number
The containers positions are set to the frames
I want to add “Kundenteil” to the containers.
I created a script to achive this:
from vcScript import * comp = getComponent() # GLOBAL _app = getApplication() def insertPartIntoContainer(containing_component, part_name, frame_name="Frame", container_name="ComponentContainer"): ''' iserts a part into a container to be transferred on a WPC 'containing_component': the component where the part is to be added 'part_name': the name of the part to be added to the containing_component 'frame_name': the name of the frame/position where the part is to be added (if multiple), usually only 'Frame' 'container_name': The name of the container the part is to be added to (if multiple), usually only 'ComponentContainer' ''' print("containing component: "+ str(containing_component)+ " " + containing_component.Name) part = _app.findComponent(part_name) newPart = _app.cloneComponent(part) print("new part: "+ str(newPart)+ " " + newPart.Name) frame = containing_component.findFeature(frame_name) print("frame: "+ str(frame)+ " " + frame.Name) pos = frame.PositionMatrix newPart.PositionMatrix = pos #node=containing_component.findNode("UpperDrawer") #print("upper drawer: " + str(node) + " " + node.Name) targetContainer = containing_component.getBehaviour(container_name) #node.getBehaviour(container_name) print("container: "+ str(targetContainer)+ " " + targetContainer.Name) targetContainer.grab(newPart) partName = "Kundenteil" targetFrameName = "Frame_P1" containerName = "Container_Part1" # remove excess parts for num in range(1,10): delete_name = partName +" #"+str(num) delete_component= _app.findComponent(delete_name) if (delete_component is not None): print("found component to delete:" +delete_component.Name) _app.deleteComponent(delete_component) insertPartIntoContainer(comp, partName, targetFrameName, containerName) comp.rebuild()
When the script is run, everything works as expected up to the point there it should actually place the new part into the container.
found component to delete:Kundenteil #2 containing component: <vcComponent object at 0x000001C702117658> NioAblage new part: <vcComponent object at 0x000001C702117A48> Kundenteil #2 frame: <vcFrameFeature object at 0x000001C71C162238> Frame_P1 container: <vcComponentContainer object at 0x000001C7021178F8> Container_Part1 Traceback (most recent call last): File "NioAblage::ProvidePartsScript", line 46, in <module> File "NioAblage::ProvidePartsScript", line 31, in insertPartIntoContainer RuntimeError: Exception occurred during method execution: Attempted to change node hierarchy when hierarchy is locked.
I moved the script and components and Frames around from the root component (“NioAblage”) to the drawer (using the commented node instead of the conating_component) and back, but I always get the “hierarchy is locked”
Can someone tell me why that is and to get the parts to be finally placed into the containers?
I use a similar script with the Python Feeder Template, where I add parts to a work piece carrier. I get no exception there.