[Bf-committers] help needed to cleanup bezier code "makeCyclic()"

Dietrich Bollmann diresu at web.de
Sun Jun 29 10:51:29 CEST 2008


Hi,

...just to connect the thread of my former email with the patch on the
patch tracker...

I was asked to put the code for 'makeCyclic()' on the blender patch
tracker.  Here it is:
https://projects.blender.org/tracker/index.php?func=detail&aid=16656&group_id=9&atid=127

Regards, Dietrich


On Sat, 2008-06-21 at 20:38 +0900, Dietrich Bollmann wrote:
> Hi,
> 
> I wrote a python function makeCyclic() for bezier curves using the
> function makecyclicNurb() from file source/blender/src/editcurve.c
> with only minimal changes.
> 
> It works - but I have to admit, that I do not really understand the
> copy-and-pasted code in all its details :)
> 
> As the original code was written for the Blender gui I am quite sure
> that not all of it is needed in the Python version of the original
> function.
> 
> Is there anybody who could help me to clean up the function from all
> things not necessary in the python version so that I could make it a
> useful patch?
> 
> Another problem is that the code is duplicated in the sources: 
> once in source/blender/src/editcurve.c
> once more in source/blender/python/api2_2x/CurNurb.c .
> 
> Probably it would be nicer to write some general function, add it to
> source/blender/blenkernel/intern/curve.c and make the code in
> editcurve.c and CurNurb.c rely on it rather than having everything
> twice.
> 
> Any idea how to separate out a general function?
> 
> Thanks, Dietrich
> 
> PS: I send this code to bf-committers rather than to bf-python
> as it deals to 95% with the bezier code and only to a small
> percentage with the python API.
> 
> Here an example of how to use the function makeCyclic():
> 
> dietrich at pippi:~/blendev/working/branches/pyg/blender $ blender --bcp
> 5555 --geometry 500x400+0+500 &
> dietrich at pippi:~/blendev/working/branches/pyg/blender $ blash --port
> 5555
> This is Blash - the GNU BLender-Again SHell :)
> Handling client 127.0.0.1
> Connection to Blender Server established.   (IP address: 127.0.0.1,
> port: 5555)
> >>> 
> >>> from Blender import *
> >>> 
> >>> def makeBezTriple(p): 
> ...         bt = BezTriple.New(p[0], p[1], p[2])
> ...         bt.handleTypes = (BezTriple.HandleTypes.AUTO,
> BezTriple.HandleTypes.AUTO) 
> ...         return bt
> ... 
> >>> def makeBezier(points, scene):
> ...         cu = Curve.New()
> ...         bt = makeBezTriple(points[0])
> ...         cu.appendNurb(bt)
> ...         for p in points[1:]:
> ...                 bt = makeBezTriple(p)
> ...                 cu[0].append(bt)
> ...         cu.update()
> ...         obj = scene.objects.new(cu)
> ...         return obj
> ... 
> >>> # making the bezier curve
> >>> scene = Scene.GetCurrent()
> >>> points = [(1, 1, 0), (-1, 1, 0), (-1, -1, 0), (1, -1, 0)]
> >>> b = makeBezier(points, scene)
> >>> Redraw()
> >>> 
> >>> # making it cyclic
> >>> b.data[0].isCyclic()
> False
> >>> b.data[0].makeCyclic()
> >>> b.data.update()
> >>> Redraw()
> >>> b.data[0].isCyclic()
> True
> >>> 
> 
> Here is the code - Note that I also appended a path to this email:
> 
> /**
>  * CurNurb_makeCyclic()
>  * 
>  * Make this spline cyclic (closed)
>  * 
>  * Reusing the code from function `makecyclicNurb()'
>  * file source/blender/src/editcurve.c
>  * 
>  * Dietrich Bollmann (dietrich)
>  */
> static PyObject *CurNurb_makeCyclic( BPy_CurNurb * self )
> {
> 	printf("hi dietrich :)");
> 
> 	// make the curve cyclic
> 	makecyclicNurb2(self->nurb);
> 
> 	return Py_None;
> }
> 
> /**
>  * makecyclicNurb2()
>  * 
>  * make this spline cyclic (closed)
>  * 
>  * An adapted copy of function `makecyclicNurb()'
>  * file source/blender/src/editcurve.c
>  * 
>  * Dietrich Bollmann (dietrich)
>  */
> void makecyclicNurb2(Nurb *nu)
> {
> 	BezTriple *bezt;
> 	BPoint *bp;
> 	float *fp;
> 	int a, b, cyclmode=0;
> 
> 	if( nu->pntsu>1 || nu->pntsv>1) {
> 		if( (nu->type & 7)==0 ) {
> 			a= nu->pntsu;
> 			bp= nu->bp;
> 			while(a--) {
> 				if( bp->f1 & SELECT ) {
> 					if(nu->flagu & CU_CYCLIC) nu->flagu--;
> 					else nu->flagu++;
> 					break;
> 				}
> 				bp++;
> 			}
> 		}
> 		else if( (nu->type & 7)==CU_BEZIER ) {
> 			a= nu->pntsu;
> 			bezt= nu->bezt;
> 			while(a--) {
> 				if( BEZSELECTED_HIDDENHANDLES(bezt) ) {
> 					if(nu->flagu & CU_CYCLIC) nu->flagu--;
> 					else nu->flagu++;
> 					break;
> 				}
> 				bezt++;
> 			}
> 			calchandlesNurb(nu);
> 		}
> 		else if(nu->pntsv==1 && (nu->type & 7)==CU_NURBS) {
> 			a= nu->pntsu;
> 			bp= nu->bp;
> 			while(a--) {
> 				if( bp->f1 & SELECT ) {
> 					if(nu->flagu & CU_CYCLIC) nu->flagu--;
> 					else {
> 						nu->flagu++;
> 						nu->flagu &= ~2;	/* endpoint flag, fixme */
> 						fp= MEM_mallocN(sizeof(float)*KNOTSU(nu), "makecyclicN");
> 						b= (nu->orderu+nu->pntsu);
> 						memcpy(fp, nu->knotsu, sizeof(float)*b);
> 						MEM_freeN(nu->knotsu);
> 						nu->knotsu= fp;
> 							
> 						makeknots(nu, 1, 0);	/* 1==u  0==uniform */
> 							
> 					}
> 					break;
> 				}
> 				bp++;
> 			}
> 		}
> 		else if(nu->type==CU_NURBS) {
> 			a= nu->pntsu*nu->pntsv;
> 			bp= nu->bp;
> 			while(a--) {
> 	
> 				if( bp->f1 & SELECT) {
> 					if(cyclmode==1 && nu->pntsu>1) {
> 						if(nu->flagu & CU_CYCLIC) nu->flagu--;
> 						else {
> 							nu->flagu++;
> 							fp= MEM_mallocN(sizeof(float)*KNOTSU(nu), "makecyclicN");
> 							b= (nu->orderu+nu->pntsu);
> 							memcpy(fp, nu->knotsu, sizeof(float)*b);
> 							MEM_freeN(nu->knotsu);
> 							nu->knotsu= fp;
> 								
> 							makeknots(nu, 1, 0);	/* 1==u  0==uniform */
> 						}
> 					}
> 					if(cyclmode==2 && nu->pntsv>1) {
> 						if(nu->flagv & 1) nu->flagv--;
> 						else {
> 							nu->flagv++;
> 							fp= MEM_mallocN(sizeof(float)*KNOTSV(nu), "makecyclicN");
> 							b= (nu->orderv+nu->pntsv);
> 							memcpy(fp, nu->knotsv, sizeof(float)*b);
> 							MEM_freeN(nu->knotsv);
> 							nu->knotsv= fp;
> 								
> 							makeknots(nu, 2, 0);	/* 2==v  0==uniform */
> 						}
> 					}
> 					break;
> 				}
> 				bp++;
> 			}
> 		}
> 	}
> }
> 
> 
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers



More information about the Bf-committers mailing list