home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / share / k3d / scripts / scripted_plugins / freeze_mesh_instance.py < prev    next >
Encoding:
Python Source  |  2008-07-28  |  4.7 KB  |  142 lines

  1. #python
  2. # k3d:plugin-class="application"
  3. # k3d:plugin-type="ActionScript"
  4. # k3d:plugin-name="Freeze Mesh Instance"
  5. # ngui:action=""
  6.  
  7. import k3d
  8.  
  9. class FreezeMeshInstance:
  10.     """
  11.         This class implements functions to Freeze Mesh Instances.
  12.         At the construction of the object the freeze is done, there is no need to call a method later.
  13.         (actually is just like calling a function
  14.         Usage:
  15.         FreezeMeshInstance(document, freeze_mode="reuse", freeze_scope="selected")
  16.         -The freeze_mode parameter means if the freezon object is a new Mesh Instance or it reuses the mesh instance
  17.         of the original object, thus deleting all the pipeline down.
  18.         -freeze_scope says if we are going to freeze the whole document or just selected nodes
  19.     """
  20.     def __init__(self, document, freeze_mode="reuse", freeze_scope="selected"):
  21.         self.doc = document
  22.         self.created_nodes = []
  23.         self.orphans = []
  24.         self.freeze_mode = freeze_mode
  25.         self.freeze_instances(freeze_scope)
  26.         
  27.     def freeze_instances(self,mode="all"):
  28.         id_msh_inst = self.get_factory_id("MeshInstance")
  29.         selection_node = Document.get_node_by_metadata("inode_selection", "ngui:unique_node", "node_selection")
  30.         if(mode == "all"):
  31.             for node in self.doc.nodes():
  32.                 if id_msh_inst == node.factory().factory_id():
  33.                     self.freeze_instance(node)
  34.         elif(mode == "selected"):
  35.             for node in self.doc.nodes():
  36.                 if id_msh_inst == node.factory().factory_id() and selection_node.selection_weight(node):
  37.                     self.freeze_instance(node) #There is an instance selected
  38.         self.delete_garbage()
  39.             
  40.     def freeze_instance(self,node): #choose mode method
  41.         if(self.freeze_mode == "reuse"):
  42.             self.freeze_reusing_instance(node)
  43.         elif(self.freeze_mode == "new"):
  44.             self.freeze_new_instance(node)
  45.         
  46.     def freeze_new_instance(self, node):
  47.         frozen_mesh = self.doc.new_node("FrozenMesh")
  48.         frozen_mesh.name = "Frozen "+node.name
  49.         self.doc.set_dependency(frozen_mesh.get_property("input_mesh"), node.get_property("output_mesh"))
  50.         temp_mesh  = frozen_mesh.output_mesh
  51.         self.doc.set_dependency(frozen_mesh.get_property("input_mesh"), None)
  52.         
  53.         frzmsh_instance = self.doc.new_node("MeshInstance")
  54.         frzmsh_instance.name = "Frozen Mesh Instance"
  55.         frzmsh_instance.gl_painter = self.doc.get_node("GL Default Painter")
  56.         frzmsh_instance.ri_painter = self.doc.get_node("RenderMan Default Painter")
  57.         self.doc.set_dependency(frzmsh_instance.get_property("input_mesh"), frozen_mesh.get_property("output_mesh"))
  58.         frzmsh_instance.input_matrix = node.output_matrix
  59.         
  60.         self.created_nodes.append(frozen_mesh.__hash__())
  61.         self.created_nodes.append(frzmsh_instance.__hash__())
  62.         
  63.     def freeze_reusing_instance(self, node):
  64.         frozen_mesh = self.doc.new_node("FrozenMesh")
  65.         frozen_mesh.name = "Frozen "+node.name
  66.         self.doc.set_dependency(frozen_mesh.get_property("input_mesh"), node.get_property("output_mesh"))
  67.         temp_mesh  = frozen_mesh.output_mesh
  68.         self.doc.set_dependency(frozen_mesh.get_property("input_mesh"), None) 
  69.         
  70.         self.orphans.append(self.get_child(node).__hash__())
  71.         
  72.         self.doc.set_dependency(node.get_property("input_mesh"), frozen_mesh.get_property("output_mesh"))
  73.         
  74.     def get_factory_id(self, name):
  75.         temp_msh_inst = self.doc.new_node(name)
  76.         id_msh_inst = temp_msh_inst.factory().factory_id()
  77.         self.doc.delete_node(temp_msh_inst)
  78.         return id_msh_inst
  79.         
  80.     def delete_all_the_rest(self):
  81.         for node in self.doc.nodes():
  82.             try:
  83.                 # Did we made this node?
  84.                 self.created_nodes.index(node.__hash__())
  85.             except:
  86.                 #Not on the list
  87.                 self.doc.delete_node(node)
  88.         
  89.     def delete_orphans(self):
  90.         for node in self.doc.nodes():
  91.             try:
  92.                 # Is an orphan?
  93.                 self.orphans.index(node.__hash__())
  94.                 self.delete_downstream(node)
  95.             except:
  96.                 #Not on the list
  97.                 pass
  98.         
  99.     def delete_garbage(self):
  100.         if(self.freeze_mode == "reuse"):
  101.             self.delete_orphans()
  102.         elif(self.freeze_mode == "new"):
  103.             #self.delete_all_the_rest()
  104.             pass
  105.         else:
  106.             pass
  107.         
  108.     def get_child(self, node):
  109.         return self.doc.get_dependency(node.get_property("input_mesh")).node()
  110.         
  111.     def delete_downstream(self, node):
  112.         while( node != None ):
  113.             try:
  114.                 node_tmp = self.get_child(node,doc)
  115.                 self.doc.delete_node(node)
  116.                 node = node_tmp
  117.             except:
  118.                 self.doc.delete_node(node)
  119.                 node = None
  120.         
  121.  
  122. freeze_scope = k3d.ui().query_message("Freeze Whole Document or Selected Instances?:", ["Whole", "Selected"])
  123. keep_original = k3d.ui().query_message("Keep the Original Instances?", ["No", "Yes"])
  124.  
  125. if freeze_scope == 1:
  126.     freeze_scope_string = "all"
  127. else:
  128.     freeze_scope_string = "selected"
  129.  
  130. if keep_original == 1: #dont keep
  131.     creation_mode = "reuse"
  132. else: #keep
  133.     creation_mode = "new"
  134.  
  135. Document.start_change_set()
  136. try:
  137.     FreezeMeshInstance(Document, creation_mode, freeze_scope_string)
  138.     Document.finish_change_set("Freeze Mesh Instance")
  139. except: #there was an error
  140.     Document.cancel_change_set()
  141.     raise
  142.