I need to convert Python C4D Script to Plug-In

On 15/04/2017 at 11:52, xxxxxxxx wrote:

Hi, everyone!

Recently I build a script that create one null with one layer assigned for the c4d and now I'm trying convert this in plugin. The script runs perfect in my script manager but I have some problems when I try to convert it in plug in.

You can view the plug in code here:
----------------
Code:

import os
import sys

import c4d
from c4d import *

Plugin IDs 1000001-1000010 are reserved for development

PLUGIN_ID = 1000001

class AddNull(c4d.plugins.CommandData) :

def \__init\_\_(self) :
	color_Layer=c4d.Vector(1,1,1) # Layer Color




def add_divider(self,name, color) :


	root = doc.GetLayerObjectRoot()
	LayersList = root.GetChildren() 


	names=[]    
	layers=[]
	for l in LayersList:
		n=l.GetName()
		names.append(n)
		layers.append((n,l))




	if not name in names:




		c4d.CallCommand(100004738) # New Layer
		LayersList = root.GetChildren() 
		layer=LayersList[-1]
		layer.SetName(name)  


		layer[c4d.ID_LAYER_COLOR] =color 


	else:
		for n, l in layers:
			if n ==name:
				layer=l
				break 


	Null = c4d.BaseObject(5140)
	Null[c4d.ID_BASELIST_NAME] = "Null_01" #Name of null
	Null[c4d.ID_LAYER_LINK] = layer
	Null[c4d.NULLOBJECT_DISPLAY] = 14
	doc.InsertObject(Null)


	c4d.EventAdd()




def Execute(self, doc) :
	dialog = None

if self.dialog is None:
    self.dialog = add_divider("_Layer01_", color_Layer)

self.add_divider("_Layer01_", color_Layer)

if __name__ == "__main__":

icon = c4d.bitmaps.BaseBitmap()
    icon.InitWith(os.path.join(os.path.dirname(__file__), "res", "Icon.tif"))    
    c4d.plugins.RegisterCommandPlugin(PLUGIN_ID, "Add_Null", 0, icon, "Add_Null", AddNull())

----------------
You can download the script and the plug in here:

https://www.dropbox.com/s/2q3sru0gfg4s6o4/Create%20a%20Null%20and%20Layer%20%28Script%20%26%20Python%29.zip?dl=0

I've been seeing some examples and the python SDK but I don't understand where is the issue because I saw different codes structures in examples and work well. It's necessary the "execute" function? Are there other ways to execute the function?

What I'm doing wrong?

I hope you can help me and thanks in advance!.

Cheers.

On 17/04/2017 at 08:43, xxxxxxxx wrote:

Hi and Welcome to the Plugin Cafe!

I tried the plugin and there are several minor errors related to the implementation of the script's code inside the context of a class.
Here are the issues:
- Execute() must return a boolean value i.e. True or False
- add_divider() should be passed doc variable from  Execute()
- add_divider() call in  Execute() missing self prefix
- color_Layer variables missing self prefix
- self.dialog really really useful?

On 03/05/2017 at 11:40, xxxxxxxx wrote:

You may have figured this out already, but if not, here you go. I commented out your old stuff and then added corrected code. I want to expand on what @yannick mentioned with his issues he saw. You were not actually registering the plugin either. Hope this helps you figure out where you went wrong.

files: https://dl.dropboxusercontent.com/u/13668972/c4d/addlayer_for_cybor09.zip

here is the code, it's also in that zip file packaged as a plugin

import os
import sys
import c4d
from c4d import *
  
# Plugin IDs 1000001-1000010 are reserved for development
PLUGIN_ID = 1000001
  
  
class AddNull(c4d.plugins.CommandData) :
  
	def __init__(self) :
		self.color_Layer=c4d.Vector(1,1,1) # Layer Color
  
  
	def add_divider(self, doc, name, color) :
		root = doc.GetLayerObjectRoot()
		LayersList = root.GetChildren() 
  
		names=[]    
		layers=[]
		for l in LayersList:
			n = l.GetName()
			names.append(n)
			layers.append((n,l))
  
  
		if not name in names:
			# *****************
			# don't use CallCommand
			# c4d.CallCommand(100004738) # New Layer
  
			# *****************
			# make a new layer
			layer = c4d.documents.LayerObject()
  
			# *****************
			# set the layer name
			layer.SetName(name)
  
			# *****************
			# set the layers properties here if needed
			# layer_settings = {'solo': False, 'view': False, 'render': False, 'manager': False, 'locked': False, 'generators': False, 'deformers': False, 'expressions': False, 'animation': False}
			# layer.SetLayerData(doc, layer_settings)
  
			layer[c4d.ID_LAYER_COLOR] = color 
  
			#insert the new layer as a child of the layer root
			layer.InsertUnder(root)
  
		else:
			for n, l in layers:
				if n == name:
					layer = l
  
		# user lower case for variables
		# you should avoid using the actual ID and use the object type instead
		# https://developers.maxon.net/docs/Cinema4DPythonSDK/html/types/objects.html
		# Null = c4d.BaseObject(5140)
		null = c4d.BaseObject(c4d.Onull)
		null[c4d.ID_BASELIST_NAME] = "Null_01" #Name of null
		null[c4d.ID_LAYER_LINK] = layer
		null[c4d.NULLOBJECT_DISPLAY] = 14
		
		# insert the null object
		doc.InsertObject(null)
  
		c4d.EventAdd()
  
		return True
  
  
	def Execute(self, doc) :
		# you are not using a dialog so you do not need this; it's doing absolutely nothing.
		"""
		dialog = None
  
		if self.dialog is None:
			self.dialog = add_divider("_Layer01_", color_Layer)
		"""
  
		# you have to return a True or False result. This result will come from the add_divider function
		name = "_Layer01_"
		return self.add_divider(name=name, doc=doc, color=self.color_Layer)
  
  
if __name__ == '__main__':
    bmp = bitmaps.BaseBitmap()
    dir, file = os.path.split(__file__)
    fn = os.path.join(dir, "res", "Icon.tif")
    bmp.InitWith(fn)
  
    # you were not actually registering the plugin
    # https://developers.maxon.net/docs/Cinema4DPythonSDK/html/modules/c4d.plugins/index.html?highlight=register#c4d.plugins.RegisterCommandPlugin
    result = plugins.RegisterCommandPlugin(PLUGIN_ID, "Add Null", 0, bmp, "adds a null to a new layer", AddNull())

On 23/05/2017 at 10:22, xxxxxxxx wrote:

Thanks a lot guys! Sorry for my delay to answer.

I'm starting to learn Python and I'm making a bunch of bugs yet. I'll learn a lot to how to do this correctly with your files @charlesR. I want to learn the correct structure for python classes and c4d plugins.

Thanks again, cheers!