ah got it, thanks for the quick explanation!
so without super i would call SetFloat in an endless loop, because it returns itself.
Best posts made by datamilch
-
RE: set only the value of a dialog gadget
-
how to track if the document has changed?
hi there,
i have a command plugin that is dependent on the state of the active document. so i want to track if the document has changed.
there seems to be no dedicated core message. so i tried the following. but it gives me "basedocument is not alive", which makes senes in a way. but how can i make it work?
class MyDialog( ... doc_old = None ... def CoreMessage(self, cid, msg): doc = c4d.documents.GetActiveDocument() if cid == c4d.EVMSG_CHANGE: if doc != self.doc_old: print ("doc changed") self.doc_old = doc
thanks,
sebastian
Latest posts made by datamilch
-
RE: use thicken generator inside a python generator
hi @i_mazlov,
ok, good to know.
i also tried to insert the thicken generator into a temp_doc, activating the selections and executing passes. but that didn't work either. -
RE: MCOMMAND_SELECTALL and MCOMMAND_SELECTINVERSE not working?
@i_mazlov Thanks!
makes sens. seems i only used the forgiving commands until now.the code is run in a python generator. so by returning the object, it will be inserted into the scene.
-
MCOMMAND_SELECTALL and MCOMMAND_SELECTINVERSE not working?
hi there,
i was shifting around some selections and noticed that some modeling commands seem to have no effect.
MCOMMAND_SELECTALL
MCOMMAND_SELECTINVERSE
i realize i can use SelectAll on the BaseSelect. and i could surely build a loop, to invert the selection. but why are these commands there? they even return true, despite doing nothing.this is my code and a demo file:
import c4d doc: c4d.documents.BaseDocument op: c4d.BaseObject def main() -> c4d.BaseObject: obj = op[c4d.ID_USERDATA,1].GetClone() bs_points = obj.GetPointS() #bs_points.SelectAll( obj.GetPointCount()-1 ) # will select all points c4d.utils.SendModelingCommand( c4d.MCOMMAND_SELECTALL, [ obj ], c4d.MODELINGCOMMANDMODE_POINTSELECTION, doc=doc) # not working c4d.utils.SendModelingCommand( c4d.MCOMMAND_SELECTSHRINK, [ obj ], c4d.MODELINGCOMMANDMODE_POINTSELECTION, doc=doc) c4d.utils.SendModelingCommand( c4d.MCOMMAND_SELECTINVERSE, [ obj ], c4d.MODELINGCOMMANDMODE_POINTSELECTION, doc=doc) # not working bc = c4d.BaseContainer() bc[c4d.MDATA_CONVERTSELECTION_LEFT] = 0 # 0 = points bc[c4d.MDATA_CONVERTSELECTION_RIGHT] = 1 # 1 = edges bc[c4d.MDATA_CONVERTSELECTION_TOLERANT] = False # tolerant conversion res = c4d.utils.SendModelingCommand( c4d.MCOMMAND_CONVERTSELECTION, [ obj ], bc=bc, doc=doc) res = c4d.utils.SendModelingCommand( c4d.MCOMMAND_EDGE_TO_SPLINE, [ obj ], doc=doc) return obj
-
RE: use thicken generator inside a python generator
circumvented the problem by generating 3 thicken objects - one for each surface part (shell, start cap, end cap). then created selection tags and stitched everything together with a connector object.
-
use thicken generator inside a python generator
hi there,
the thicken generator object is a super cool and powerful tool. i'd like to use it inside of a python generator object, to create some more complex geometry. for this i need some of the selection options of the thicken generator. but activating e.g. 'shell' selection from within the python generator will mess up the output geometry of the thicken object and not generate any polygon selection tag. see attached c4d file.
after converting the python generator you have access to the built hierarchy and the generated thicken generator. when you select it and then try to activate some selection options ther will be no selection tags created. so it looks like something in the thicken generator is broken/uncomplete, when it is created within a python generator object.
is there any way to make this work, or is this a special case/limitation?def main() -> c4d.BaseObject: source_obj = c4d.BaseObject( 5170 ) source_obj[c4d.PRIM_CYLINDER_CAPS] = False thicken = c4d.BaseObject( 1060179 ) source_obj.InsertUnder( thicken ) thicken[c4d.SOLIDIFYGENERATOR_SELECTION_POLYGON_BOUNDARY] = 1 # does not create tag, will mess up (delete) geo of the selected polys return thicken
-
RE: issue with inserting fieldlayers in r2024
hi ilia @i_mazlov,
thaks for the advice about threading and the dummy document and the fishy part.I continued testing the last days and noticed that it seems to work, when i insert a clone of the fieldlayer.
-
issue with inserting fieldlayers in r2024
hi there,
I'm having a weird issue with fieldlayers in r2024.
I want to add a layer to a fieldlist. In r2023 it worked quite fine. Now I get a reference Error.
But when I print anything, the error is not raised.
In my example I use a python generator, but it seems to happen with a python tag, too.
Or am I using/inserting the fieldlayers wrong?cheers sebastian
python generator :
import c4d def main() -> c4d.BaseObject: obj = c4d.BaseObject(c4d.Ocube) res = c4d.utils.SendModelingCommand( c4d.MCOMMAND_MAKEEDITABLE, [obj], c4d.MODELINGCOMMANDMODE_ALL, doc = doc ) if not res: print("error") else: obj = res[0].GetClone() vertex_tag = obj.MakeVariableTag( c4d.Tvertexmap, len(obj.GetAllPoints()) ) vertex_tag.SetName( "vertex_highlight_reinforce" ) vertex_tag[c4d.ID_TAGFIELD_ENABLE] = 1 fields = vertex_tag[c4d.ID_TAGFIELDS] f_layer_1 = c4d.modules.mograph.FieldLayer( c4d.FLquantize ) fields.InsertLayer( f_layer_1 ) vertex_tag[c4d.ID_TAGFIELDS] = fields #print ("") # with print active, no error will be raised return obj
results in the following error:
ReferenceError: the object 'c4d.modules.mograph.FieldLayer' is not alive -
RE: Create folder in Volume Builder
hi @i_mazlov,
thanks for the answer. good to know about this status / limitation.
for my current case I found a solution without folders.. -
RE: fieldlayer with variable tag
found the solution ... the corresponding type is called: FLweight
-
fieldlayer with variable tag
hi there,
I'm trying to achieve the following:
A python generator that creates an object with a vertex map (A). vertex map (A) is then inserted in a second vertex map (B) to be able to blur (A) with the mode 'average'. (If there is another way to blur a vertex map directly in (A) this would be great, too) You can see my test-setup without the python generator in the screenshot and it works so far.Now with python I have to create fieldlayers with the correct type to make it work. But it looks like the Variable Tag is missing in the list of types. I hope it's not a limitation of of the api.
My test-file is attached. Here is the code of the generator:
from typing import Optional import c4d doc: c4d.documents.BaseDocument # The document evaluating this python generator op: c4d.BaseObject # The python generator hh: Optional["PyCapsule"] # A HierarchyHelp object, only defined when main is executed def main() -> c4d.BaseObject: null = c4d.BaseObject( c4d.Onull ) circle = c4d.BaseObject( c4d.Osplinecircle ) circle[c4d.PRIM_CIRCLE_RADIUS] = 150 cube = c4d.BaseObject( c4d.Ocube ) cube[c4d.PRIM_CUBE_SUBX] = cube[c4d.PRIM_CUBE_SUBY] = cube[c4d.PRIM_CUBE_SUBZ] = 40 vertex_tag = cube.MakeTag( c4d.Tvertexmap ) vertex_tag[c4d.ID_TAGFIELD_ENABLE] = 1 fields = c4d.FieldList() fields.Flush() f_layer_1 = c4d.modules.mograph.FieldLayer( c4d.FLspline ) f_layer_1.SetLinkedObject( circle ) f_layer_1[1009] = 1 # distance mode = radius f_layer_1[1003] = 50 # radius f_layer_1[1005007] = 99 # inner offset fields.InsertLayer( f_layer_1 ) vertex_tag[c4d.ID_TAGFIELDS] = fields displacer = c4d.BaseObject( c4d.Odisplacer ) shader = c4d.BaseShader( c4d.Xcolor ) displacer.InsertShader( shader ) displacer[c4d.ID_MG_SHADER_SHADER] = shader fields_displace = c4d.FieldList() fields_displace.Flush() f_layer_2 = c4d.modules.mograph.FieldLayer( c4d.FLpolygonobject ) # should be type variable tag f_layer_2.SetLinkedObject( vertex_tag ) fields_displace.InsertLayer( f_layer_2 ) displacer[c4d.FIELDS] = fields_displace circle.InsertUnderLast( null ) cube.InsertUnderLast( null ) displacer.InsertUnder( cube ) return null