Navigation

    • Register
    • Login
    • Search
    • Categories
    1. Home
    2. kisaf
    K
    • Profile
    • Following
    • Followers
    • Topics
    • Posts
    • Best
    • Groups

    kisaf

    @kisaf

    5
    Reputation
    15
    Posts
    110
    Profile views
    1
    Followers
    1
    Following
    Joined Last Online

    kisaf Follow

    Posts made by kisaf

    • RE: Mirror without duplicate using `MCOMMAND_MIRROR`

      @m_magalhaes
      Got it, thanks :)

      posted in Cinema 4D Development
      K
      kisaf
    • RE: Mirror without duplicate using `MCOMMAND_MIRROR`

      Hi, I've just tested this script in R23. It doesn't work :(
      One of my own scripts cannot work without this function.
      Guys, you're really awesome! I love C4D, and hope you can fix it :D

      May be I can help somehow? I can upload the example scene, if you need it.

      posted in Cinema 4D Development
      K
      kisaf
    • RE: Script : Harden edges of all UV borders (break Phong shading)

      Hello guys,
      I rewritten script UV2PhongEdges (weird name, I know :D) from scratch. Now it should works much faster. Also UNDO finally works, yyyeeeey!

      You can download it here
      https://github.com/rocketjump4d/UV2PhongEdges

      And here is an example
      https://vimeo.com/447775062

      Also, if you just need to get edges indexes of all UV borders you can use this code:

      import c4d
      from c4d import utils
      
      def GetUVBorders(obj):
          edgesIndexes = set()
          abcd = tuple("abcd")
      
          tuvw = obj.GetTag(c4d.Tuvw)
          nbr = utils.Neighbor()
          nbr.Init(obj)
      
          # Create empty set for `edgesVV`
          # In this case `edgeVV` means `Edge between Vertex0 and Vertex1 (edgeVertexVertex)`
          # edgeVV is just a tuple(v0, v1), where v0 is index of the first vertex
          # and v1 is the second one
          allEdgesVV = set()
      
          for i in xrange(obj.GetPointCount()):
              # Find neighbor vertex for this one
              neighborIndexes = nbr.GetPointOneRingPoints(i)
      
              for ni in neighborIndexes:
                  edgeTuple = (i, ni)
                  allEdgesVV.add(edgeTuple)
      
          # At this point I've got a set of all `edgesVV` of the object
          # Something like this:
          # (0, 3)
          # (0, 5)
          # (5, 1)
      
          for edgeVV in allEdgesVV:
              # Find neighbour polygons for this edge
              # I called them polyA and polyB
              polyAIndex, polyBIndex = nbr.GetEdgePolys(edgeVV[0], edgeVV[1])
              polyA = obj.GetPolygon(polyAIndex)
      
              if polyBIndex is c4d.NOTOK:
                  # There is no polyB. It means that this edge is border of the object
      
                  # eiA stands for `Edge Index in polyA for current edgeVV`
                  eiA = polyAIndex * 4 + polyA.FindEdge(edgeVV[0], edgeVV[1])
                  edgesIndexes.add(eiA)
                  continue
      
              polyB = obj.GetPolygon(polyBIndex)
      
              # piA0 stands for `Point Index in polyA for vertex edgeVV[0]`
              # the same for others
              piA0 = polyA.Find(edgeVV[0])
              piA1 = polyA.Find(edgeVV[1])
              piB0 = polyB.Find(edgeVV[0])
              piB1 = polyB.Find(edgeVV[1])
      
              # Replace "d" (3) to "c" (2) if polygon is triangle
              if polyA.IsTriangle() and piA0 == 3:
                  piA0 = 2
              if polyA.IsTriangle() and piA1 == 3:
                  piA1 = 2
              if polyB.IsTriangle() and piB0 == 3:
                  piB0 = 2
              if polyB.IsTriangle() and piB1 == 3:
                  piB1 = 2
      
              # Get UV coordinates for each point in each polygon
              uvCoordA0 = tuvw.GetSlow(polyAIndex)[abcd[piA0]]
              uvCoordA1 = tuvw.GetSlow(polyAIndex)[abcd[piA1]]
              uvCoordB0 = tuvw.GetSlow(polyBIndex)[abcd[piB0]]
              uvCoordB1 = tuvw.GetSlow(polyBIndex)[abcd[piB1]]
      
              if uvCoordA0 != uvCoordB0 or uvCoordA1 != uvCoordB1:
                  eiA = polyAIndex * 4 + polyA.FindEdge(edgeVV[0], edgeVV[1])
                  eiB = polyBIndex * 4 + polyB.FindEdge(edgeVV[0], edgeVV[1])
                  edgesIndexes.add(eiA)
                  edgesIndexes.add(eiB)
      
          return edgesIndexes
      

      Let me know if you find bugs.
      Btw, sorry any mistakes. My English is... meh

      posted in General Programming & Plugin Discussions
      K
      kisaf
    • Mirror without duplicate using `MCOMMAND_MIRROR`

      Hello guys,
      It's something weird with MCOMMAND_MIRROR in S22.

      This script (thanks to m_adam) duplicates and mirrors the object.

      import c4d
      
      
      def main():
          # Checks if selected object is valid
          if op is None:
              raise ValueError("op is none, please select one object.")
      
          # Defines some general settings, take care MDATA_MIRROR_VALUE, MDATA_MIRROR_SYSTEM and MDATA_MIRROR_PLANE
          settings = c4d.BaseContainer()
          settings[c4d.MDATA_MIRROR_DUPLICATE] = True
          settings[c4d.MDATA_MIRROR_SELECTIONS] = True
          settings[c4d.MDATA_MIRROR_ONPLANE] = True
          settings[c4d.MDATA_MIRROR_WELD] = True
          settings[c4d.MDATA_MIRROR_TOLERANCE] = 0.01
      
          # Corresponds to MDATA_MIRROR_VALUE, MDATA_MIRROR_SYSTEM and MDATA_MIRROR_PLANE
          value = 1000.0
          system = 0 # 0 = Object, 1 = World
          plane = 1 # 0 = XY, 1 = ZY, 2 = XZ
      
          if not 0 <= system < 2:
              raise ValueError("System can only be 0 or 1")
      
          # Buffer position vector
          pos = c4d.Vector()
      
          # Calculates Local (Object) coordinates
          if system == 0:
              globalMatrix = op.GetMg()
              if plane == 0:
                  pos = globalMatrix.v3
              elif plane == 1:
                  pos = globalMatrix.v1
              elif plane == 2:
                  pos = globalMatrix.v2
      
              settings[c4d.MDATA_MIRROR_POINT] = globalMatrix.off + pos * value
              settings[c4d.MDATA_MIRROR_VECTOR] = pos
      
          # Calculates World coordinates
          elif system == 1:
              if plane == 0:
                  pos = c4d.Vector(0.0, 0.0, 1.0)
              elif plane == 1:
                  pos = c4d.Vector(1.0, 0.0, 0.0)
              elif plane == 2:
                  pos = c4d.Vector(0.0, 1.0, 0.0)
      
              settings[c4d.MDATA_MIRROR_POINT] = pos * value
              settings[c4d.MDATA_MIRROR_VECTOR] = pos
      
          # Send the Modeling Operation
          res = c4d.utils.SendModelingCommand(c4d.MCOMMAND_MIRROR,
                                              [op],
                                              c4d.MODELINGCOMMANDMODE_ALL,
                                              settings,
                                              doc)
      
          c4d.EventAdd()
      
      
      if __name__ == "__main__":
          main()
      
      
      

      However, if I change

      settings[c4d.MDATA_MIRROR_DUPLICATE] = True
      

      to

      settings[c4d.MDATA_MIRROR_DUPLICATE] = False
      

      Script doesn't make anything.
      In R20 it works.
      Is it ok? Is there any way to just mirror the object without duplicate it?

      P.S. Also, if I use Mirror (https://help.maxon.net/index.html#5633) with unchecked Duplicate Points everything works (in S22).

      Cinema 4D S22.118 Windows 10

      posted in Cinema 4D Development
      K
      kisaf
    • RE: Setting `coordinate system` using `MCOMMAND_MIRROR`

      Hi @m_adam
      Thank you for your reply. It works perfectly!

      posted in Cinema 4D Development
      K
      kisaf
    • Setting `coordinate system` using `MCOMMAND_MIRROR`

      Hi there, I'm trying to mirror object via SendModelingCommand(c4d.MCOMMAND_MIRROR, ..)
      But I cann't understand how to change a coordinate system.
      According to the documentation this options is called MDATA_MIRROR_SYSTEM and it's int type.
      Its description says Coordinate system. (See dialog.)
      I believe it is the dialog:
      0_1551264099400_mirror.PNG

      It seems like 0 means Object, 1 - World, 2 - Screen.
      I tried different values from 0 to 30, but it didn't take any effect.

      The code I'm using:

      settings = c4d.BaseContainer()
      settings[c4d.MDATA_MIRROR_SYSTEM] = 0
      
      res = utils.SendModelingCommand(c4d.MCOMMAND_MIRROR,
                                [obj],
                                c4d.MODELINGCOMMANDMODE_ALL,
                                settings,
                                doc)
      

      I cannot change MDATA_MIRROR_PLANE either.
      There is no additional information in the documentation.
      Drag'n'drop for these fields doesn't work. It's strange, because it works perfectly for other tools.

      I found this post (from 2011) https://plugincafe.maxon.net/topic/5497/5516_mirror-tool-bug
      It seems that bug is still alive :(

      Version: R20
      Platform: Windows

      Cheers

      posted in Cinema 4D Development
      K
      kisaf
    • To grow selection in UVPolygon mode

      Hi everyone!

      When C4D is in Polygon mode Grow selection can be done using SendModelingCommand e.g.

      utils.SendModelingCommand(
              c4d.MCOMMAND_SELECTGROW,
              [op],
              c4d.MODELINGCOMMANDMODE_POLYGONSELECTION,
              c4d.BaseContainer(),
              doc
          )
      

      After that, selection grows to neighbour polygons. Everithing is ok.
      However, when active mode is UV Polygon then code above select neighbour polygons the same way how it was in previous case. Sometime it's ok, but not always.

      The second way to grow selection is to use CallCommand

      c4d.CallCommand(12558, 12558) # Grow Selection
      

      In this case selection grows correctly in both modes.
      I'll show an example. There is a simple sphere that separated by UVs in the middle. So it has 2 UV islands.

      0_1550175526500_original.png

      0_1550175544700_result-1.png

      0_1550175550200_result-2.png

      From 1 selected polygon (the first image) I want to get the result which is shown on the last image.
      But I don't know how to get it without CallCommand
      Sorry for mistakes. English is not my szcznek language
      Cheers

      posted in Cinema 4D Development
      K
      kisaf
    • RE: Save variables during current session (until C4D is closed)

      Thank you very much guys!
      I think that plugin will be better solution then script in this case.
      Cheers

      posted in Cinema 4D Development
      K
      kisaf
    • RE: Script : Harden edges of all UV borders (break Phong shading)

      Hi @mp5gosu, thank you for your feedback!
      Yep, it has Undo problem. I assume, it's because the script uses CallCommand. And there are 2 places where I still don't understand how to avoid this :(

      the selection should be restored after the process
      Thank you for this remark. I'm gonna fix it asap.
      Cheers.

      EDIT: I've fixed the script. Now it restores the selection after the process.

      posted in General Programming & Plugin Discussions
      K
      kisaf
    • RE: Is there a script/plugin for converting UV borders to Phong Edges?

      I've wrote it by myself :)
      Its presentation is here: https://plugincafe.maxon.net/topic/11336/script-harden-edges-of-all-uv-borders-break-phong-shading
      May be it'll be useful for someone
      Cheers

      posted in General Programming & Plugin Discussions
      K
      kisaf