Scripted Plugin with spline for clipping


#1

Hi everyone, i got stuck in my code and maybe someone can give me a hint or has a solution for a simular task.

I wrote a scripted plugin that generates a wall of bricks and i want to have a picked spline to work as clipping line, projected from the side.
The splines will be simple, but not just a single line from left to right. Any shape should be possible, the image just gives an example.
There is no need to cut the bricks, clipping entire bricks would be enough.

What would be the best solution in terms of performance ?

Critic and comments welcome.


#2

if you’re willing to test every mesh vert against the shape it probably wont be a quick process


t1=timestamp();hf = heapfree
(
	
	max create mode
	delete objects
	gc()
	p = plane lengthsegments:35 widthsegments:17 wirecolor:orange
	convertToPoly p
	select p
	max modify mode
	subObjectLevel = 2
	polyop.setEdgeSelection p #{3}
	PolyToolsTopology.Brick()
	max create mode
	polyop.splitEdges p #all
	polyop.setFaceSelection p #all
	p.outlineAmount = -0.1
	p.Outline()
	addModifier p (shell innerAmount:1 outerAmount:0)
	convertToPoly p
	format "1. Time: %sec. Mem: %\n" ((timestamp()-t1)/1000 as float) (hf-heapfree)
	t1=timestamp()
	
	move p [10,10,0]
	rotate p (EulerAngles 0 0 7)

	c = circle radius:10 wirecolor:yellow pos:[-3,7,0]
	convertToSplineShape c

	cc = copy c pos:[25,15,0] scale:[0.7,0.25,1]
	addAndWeld c cc -1
	updateShape c
	format "2. Time: %sec. Mem: %\n" ((timestamp()-t1)/1000 as float) (hf-heapfree)
	t1=timestamp()
	
	itm = inverse c.transform

	asuptr = fn asuptr val = dotNetObject "System.UIntPtr" val
	g = (dotNetClass "Autodesk.Max.GlobalInterface").Instance
	a = g.animatable.getanimbyhandle (asuptr (getHandleByAnim c))
	r = a.ObjectRef

	vsel = #{}
	p2 = g.point2.create()
	pGetVert = polyop.getVert
	for i=1 to numSplines c do
	(
		sp = r.Shape_.getspline (i-1)
		spSurroundsPoint = sp.SurroundsPoint
		
		for i=1 to polyop.getNumVerts p do
		(
			v = (pGetVert p i) * itm
			p2.x = v.x
			p2.y = v.y
			
			if spSurroundsPoint p2 do vsel[i] = true
			
		)
	)
	format "3. Time: %sec. Mem: %\n" ((timestamp()-t1)/1000 as float) (hf-heapfree)
	t1=timestamp()
	
	faces = polyop.getFacesUsingVert p vsel
	elem_faces = polyop.getElementsUsingFace p faces
	polyop.deleteFaces p elem_faces
	redrawViews()

)

format "4. Time: %sec. Mem: %\n" ((timestamp()-t1)/1000 as float) (hf-heapfree)

#3

generating bricks with an angled face in the right position… creating from scratch is always better than trying to edit/correct/fix/cut existing mesh… it’s “cleaner” easier to code and quicker.


#4

Yes correct, there for i try to find the intersecting lines of bricks and do the calculations just for the center of the quads.

Absolutely. The goal is to skip the generation of the clipped bricks, so they never been generated.

When using splines with only corner vertices, it seems to come down to a 2d intersection.