Knife Tool Control via Python

On 31/12/2016 at 16:07, xxxxxxxx wrote:

I am trying to develop a python script that will allow me to make a single knife cut across an individual polygon surface. 
I am able to do this manually using the knife tool set to Line mode with "Restrict to Selection" enabled.
I am able to make a knife cut across the surface using a Python script, however I am unable to select any of the specific knife parameters that would allow me to restrict the cut to a single polygon surface (for example the knife mode and restrict to selection option). 
The code below makes a cut across a cube. This is adapted from the very helpful code example provided by Yannick Puech

import c4d  
from c4d import utils
def SplineCutter(doc, op, bd, x1, y1, x2, y2, bSelect) :    
	p1 = c4d.Vector(-50,200,-100)  
	v1 = c4d.Vector(-50,200,-400)  
	p2 = c4d.Vector(-50,-200,-100)  
	v2 = c4d.Vector(-50,-200,-400)     
	bc = c4d.BaseContainer()  
	bc.SetVector(c4d.MDATA_KNIFE_P1, p1)  
	bc.SetVector(c4d.MDATA_KNIFE_P2, p2)  
	bc.SetVector(c4d.MDATA_KNIFE_V1, v1)  
	bc.SetVector(c4d.MDATA_KNIFE_V2, v2)  
	bc.SetBool(c4d.MDATA_KNIFE_NGONS, True)  
        if op is not None :  
		utils.SendModelingCommand(command = c4d.MCOMMAND_KNIFE,  
			list = [op],  
			bc = bc,  
			doc = doc,  
def main() :  
	frame = doc.GetTime().GetFrame(doc.GetFps())
    	if frame == 10:  
		bd = doc.GetActiveBaseDraw()  
		frame = bd.GetFrame()  
		middleX = (frame['cr']-frame['cl'])/2  
		spline = op.GetObject()      
		SplineCutter(doc, spline, bd, middleX, frame['ct'], middleX, frame['cb'], True)
if __name__=='__main__':

However the below lines of code don't actually seem to have any effect:

    bc.SetBool(c4d.MDATA_KNIFE_NGONS, True)

There is no effect when I change MDATA_KNIFE_RESTRICT from True to False. Either way the cut is not restricted to the polygon surface.
There is no effect when I set c4d.MDATA_KNIFE_MODE to c4d.MDATA_KNIFE_MODE_SINGLE or c4d.MDATA_KNIFE_MODE_PATH or c4d.MDATA_KNIFE_MODE_LOOP. The cut mode always remains the same. 
As a separate, but related question, setting "command = c4d.ID_MODELING_KNIFE_TOOL" instead of "command=c4d.MCOMMAND_KNIFE" (a format that works with other modeling commands such as c4d.ID_MODELING_EXTRUDE_TOOL) makes the knife cut stop working all together. 
I am using c4D R2017

Any ideas about how to actually set KNIFE_RESTRICT to True and actually set MDATA_KNIFE_MODE to Single would be helpful!

On 02/01/2017 at 07:47, xxxxxxxx wrote:

Hi and Welcome to the Plugin Cafe forums!

Which version of Cinema 4D are you using? R17 or R18? R2017 version doesn't exist.

Are you sure manually cutting really works as expected with "Restrict to Selection" and "Create N-gons" set?
I get the same behavior with both the script and mouse interaction in the view: additional edges are created even on unselected polygon.

c4d.ID_MODELING_KNIFE_TOOL is meant to be used with c4d.CallCommand() to activate the Knife tool in the UI.

On 02/01/2017 at 16:25, xxxxxxxx wrote:

Hi Yannick,

I am using R17 (so the knife tool has multiple modes of line, path, loop, etc. rather than r18 where the functionality seems to be divided into different tools).

If I have selected a specific face of a cube and use the settings I described I am able to get a cut in the face that is restricted to that face. 
Here is a screenshot:

And this is what it looks like when I use the script:

Thanks for the clarification about c4d.ID_MODELING_KNIFE TOOL

On 04/01/2017 at 02:55, xxxxxxxx wrote:


In fact the Knife tool (ID_MODELING_KNIFE TOOL) and Knife modeling command (MCOMMAND_KNIFE) are different in their implementation and parameter support.
The Knife modeling command only supports the following parameters:

For these reasons the same results can't be obtained with both the interactive tool and modeling command.