Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    DrawLine Obscured by objects

    Cinema 4D SDK
    python
    2
    5
    887
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • chuanzhenC
      chuanzhen
      last edited by chuanzhen

      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
      

      drawline_test.png

      Thanks for any help!

      相信我,可以的!

      1 Reply Last reply Reply Quote 0
      • ManuelM
        Manuel
        last edited by Manuel

        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

        MAXON SDK Specialist

        MAXON Registered Developer

        chuanzhenC 1 Reply Last reply Reply Quote 2
        • chuanzhenC
          chuanzhen @Manuel
          last edited by

          @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
            bug.png

          相信我,可以的!

          1 Reply Last reply Reply Quote 0
          • ManuelM
            Manuel
            last edited by Manuel

            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

            MAXON SDK Specialist

            MAXON Registered Developer

            chuanzhenC 1 Reply Last reply Reply Quote 1
            • chuanzhenC
              chuanzhen @Manuel
              last edited by chuanzhen

              @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

              相信我,可以的!

              1 Reply Last reply Reply Quote 0
              • First post
                Last post