DrawLine Obscured by objects
-
I used DrawLine2D() to draw the "line", but it was blocked by the other objects. I hope "line" not obscured by any objects. (it's Tool_Plugin)
this is code:
def MouseInput(self, doc, data, bd, win, msg): mx = msg[c4d.BFM_INPUT_X] my = msg[c4d.BFM_INPUT_Y] device = 0 if msg[c4d.BFM_INPUT_CHANNEL]==c4d.BFM_INPUT_MOUSELEFT: device = c4d.KEY_MLEFT elif msg[c4d.BFM_INPUT_CHANNEL]==c4d.BFM_INPUT_MOUSERIGHT: device = c4d.KEY_MRIGHT else: return True dx = 0.0 dy = 0.0 win.MouseDragStart(button=device, mx=int(mx), my=int(my), flags=c4d.MOUSEDRAGFLAGS_DONTHIDEMOUSE|c4d.MOUSEDRAGFLAGS_NOMOVE) result, dx, dy, channel = win.MouseDrag() ####Add code front_v = [c4d.Vector(mx,my,0)] current_v = [c4d.Vector(mx,my,0)] num = 0 bd.SetPen(c4d.Vector(0,0,1.0)) #### while result==c4d.MOUSEDRAGRESULT_CONTINUE: mx += dx my += dy ####Add code current_v[num] = c4d.Vector(mx,my,0) num += 1 #### #continue if user doesnt move the mouse anymore if dx==0.0 and dy==0.0: result, dx, dy, channel = win.MouseDrag() num -= 1 continue c4d.DrawViews(c4d.DA_ONLY_ACTIVE_VIEW|c4d.DA_NO_THREAD|c4d.DA_NO_ANIMATION) result, dx, dy, channel = win.MouseDrag() ####Add code for index in xrange(num): bd.DrawLine2D(front_v[index],current_v[index]) front_v.append(c4d.Vector(mx,my,0)) current_v.append(c4d.Vector(mx,my,0)) #### c4d.DrawViews(c4d.DA_ONLY_ACTIVE_VIEW|c4d.DA_NO_THREAD|c4d.DA_NO_ANIMATION) return True
Thanks for any help!
-
Hello,
You have to use the Draw function from the tooldata
You can store the points in an array and than use that array in your draw function.
try to check if the mouse have move "enough" instead of 0 to avoid creating too much points in the array.
if dx < 1.0 and dy < 1.0: result, dx, dy, channel = win.MouseDrag() continue
and once you have your array of points you can juste iterate it and draw lines
def Draw(self, doc, data, bd, bh, bt, flags): if not flags: # Sets the pen color bd.SetPen(c4d.Vector(0, 0, 1.0)) # Iterates through the array getting columns 1_2, 2_3, ... n-1_n for pa,pb in zip(self.data,self.data[1:]): # Draw a line point by point bd.DrawLine2D(pa, pb) return c4d.TOOLDRAW_NONE
Cheers
Manuel -
@m_magalhaes Thanks for your help, I tried to store and then draw, but the result of this is that the lines are visible after drawing. My goal is to draw lines in real time, so I use DrawLine2D() and DrawView() in the While,make the view continuously draw the line.
But my main problem has not been solved yet.
-
1 (the main problem), how to make the lines I draw are not obscured by the cube. as pic above
-
2 (minor problem), close Horizon in the window filter, the line will be abnormal, is this a bug or do I have to open Horizon? as pic below
-
-
ok,
1 - you can call c4d.DrawViews in your while routine in mouseInput and i've change my code in my Draw function so it check for flags to draw the line.
2 - can you share your mouseInput() and Draw() function so i have a chance to reproduce this bug ?
cheers
Manuel -
@m_magalhaes Thanks ,it works well,I modified the code according to your answer.
-
1 draw line not obscured by any object.solved
-
2 before i just draw line in MouseImput() (not add Draw() funtion),as above pic/code, Now i draw line in Draw(),it works well.solved
-