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
            device = c4d.KEY_MLEFT
        elif msg[c4d.BFM_INPUT_CHANNEL]==c4d.BFM_INPUT_MOUSERIGHT:
             device = c4d.KEY_MRIGHT
            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
        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
            result, dx, dy, channel = win.MouseDrag()
            ####Add code
            for index in xrange(num):
        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()

    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


  • @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 ?


  • @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

Log in to reply