Creating Cube Using Python
-
On 07/03/2018 at 17:37, xxxxxxxx wrote:
Hi,
I'm trying to create a simple gui to create a cube. Currently, it looks like this
https://www.dropbox.com/s/upcc1wykyall32a/c4d057_createCube02.jpg?dl=0Based on the image above, my current problem is adding the labels in the side. And adding a cm to the number boxes.
Is there a way I can do that?
I tried using the .AddStaticText but it breaks the code and removes all the input boxes in the GUI.
Here is the working script:
import c4d from c4d import gui #Welcome to the world of Python nameBox = 1001 sliderBox = 1002 numberBox = 1003 Create = 1004 class CreateCube(gui.GeDialog) : def CreateLayout(self) : self.SetTitle('Create Cube') self.AddEditText(nameBox, c4d.BFH_SCALEFIT) self.AddEditSlider(sliderBox, c4d.BFH_SCALEFIT) self.AddEditNumber(numberBox, c4d.BFH_SCALEFIT) self.AddButton( Create, c4d.BFH_SCALEFIT , name='Create Cube') self.GroupEnd() return True def Command (self, id, msg) : if id==Create: cube = c4d.BaseObject(c4d.Ocube) text_value = self.GetString(nameBox) slider_value = self.GetInt32(sliderBox) number_value = self.GetInt32(numberBox) cube[c4d.ID_BASELIST_NAME]=text_value cube[c4d.PRIM_CUBE_LEN,c4d.VECTOR_X]=slider_value cube[c4d.PRIM_CUBE_LEN,c4d.VECTOR_Y]=slider_value cube[c4d.PRIM_CUBE_LEN,c4d.VECTOR_Z]=slider_value cube[c4d.PRIM_CUBE_SUBX]=number_value cube[c4d.PRIM_CUBE_SUBY]=number_value cube[c4d.PRIM_CUBE_SUBZ]=number_value self.cube = cube self.Close() return True def main() : dialog = CreateCube() dialog.Open(c4d.DLG_TYPE_MODAL_RESIZEABLE, defaultw=200,defaulth=200) cube = dialog.cube doc.InsertObject(cube) c4d.EventAdd() if __name__=='__main__': main()
Thank you for your time.
-
On 08/03/2018 at 02:46, xxxxxxxx wrote:
Hey Ben,
You can use AddStaticText like this below, also and example of setting floats as types:
import c4d from c4d import gui nameBox = 1001 sliderBox = 1002 numberBox = 1003 Create = 1004 name_TextID = 1005 slider_TextID = 1006 number_TextID = 1007 class CreateCube(gui.GeDialog) : def CreateLayout(self) : self.SetTitle('Create Cube') self.AddStaticText(name_TextID , c4d.BFH_LEFT ,initw=200, name="Input cube name : ", borderstyle=c4d.BORDER_NONE) self.AddEditText (nameBox , c4d.BFH_SCALEFIT) self.AddStaticText(slider_TextID, c4d.BFH_LEFT ,initw=200, name="Cube size: ", borderstyle=c4d.BORDER_NONE) self.AddEditSlider(sliderBox , c4d.BFH_SCALEFIT) self.AddStaticText(number_TextID, c4d.BFH_LEFT ,initw=200, name="Cube subdivisions : ", borderstyle=c4d.BORDER_NONE) self.AddEditNumber(numberBox , c4d.BFH_SCALEFIT) self.AddButton (Create , c4d.BFH_SCALEFIT ,name='Create Cube') self.cube = None # This is so we can check it's existance later on so we don't get an error if we close the window without pressing the create button self.GroupEnd() return True def InitValues(self) : self.SetString(nameBox,'Enter cube name here') self.SetFloat(sliderBox,200,format=c4d.FORMAT_METER)#Or you can use .SetMeter() instead of SetFloat self.SetInt32(numberBox,1,min=1) return True def Command (self, id, msg) : if id==Create: text_value = self.GetString(nameBox) slider_value = self.GetInt32(sliderBox) number_value = self.GetInt32(numberBox) cube = c4d.BaseObject(c4d.Ocube) cube[c4d.ID_BASELIST_NAME]=text_value cube[c4d.PRIM_CUBE_LEN,c4d.VECTOR_X]=slider_value cube[c4d.PRIM_CUBE_LEN,c4d.VECTOR_Y]=slider_value cube[c4d.PRIM_CUBE_LEN,c4d.VECTOR_Z]=slider_value cube[c4d.PRIM_CUBE_SUBX]=number_value cube[c4d.PRIM_CUBE_SUBY]=number_value cube[c4d.PRIM_CUBE_SUBZ]=number_value self.cube = cube # Changing self.cube from None to the cube we just made self.Close() return True def main() : dialog = CreateCube() dialog.Open(c4d.DLG_TYPE_MODAL_RESIZEABLE, defaultw=200,defaulth=200) if not dialog.cube: return cube = dialog.cube doc.InsertObject(cube) c4d.EventAdd() if __name__=='__main__': main()
Cheers,
Adam
-
On 08/03/2018 at 08:55, xxxxxxxx wrote:
Hi,
welcome to the Plugin Café forums (or are you just using another account and are actually btbentraje?)
Anyway, Adam already answered your questions.
In CreateLayout() you are calling GroupEnd() without actually having begun a group. That's redundant and might (at least) lead to confusing situations, when extending the code later on.
I'd rather handle both the slider and the edit field completely as float (also using GetFloat() on read) and then round later on. Also Adam accidentally just set the unit for the slider, you will want that for the numberBox as well.
Links to the docs: SetFloat(), SetMeter()
And although in our C++ documentation, the GeDialog manual might be an interesting read, too. -
On 08/03/2018 at 20:01, xxxxxxxx wrote:
Thanks Adam and Andreas for the response!
It works as expected.Yes, I am also btbentraje. At that time I forgot this account. Hahaha You can delete the btbentraje account if you want.
Thank you again.