Jump to content

C4DS

Gold Supporter
  • Content Count

    761
  • Joined

  • Last visited

  • Days Won

    23

C4DS last won the day on December 29 2018

C4DS had the most liked content!

Community Reputation

268 Good

About C4DS

  • Rank
    Cafe Regular
  • Birthday 06/04/1970

Profile Information

  • First Name
    Daniel
  • Last Name
    Sterckx
  • C4D Ver
    R20.026 Studio
  • Location
    Belgium
  • Interests
    Electric guitars, Virtual Instruments, Radio controlled electric airplanes, 3D animation story telling, Video editing, C4D plugin development

Recent Profile Visitors

8,385 profile views
  1. OK, got it. As I thought, the input ports are "Position" and "Rotation", both of type vector, while the output port is "NewMatrix" of type matrix. So, when replacing the COFFEE node with a Python Node you should create the appropriate input and output ports. With the first scripts the input and output ports are floating point values. By default, when you create a Python node in Xpresso you get 2 input ports ... of type Real (or floating point), and an output port, again of type Real. What you need to do for the second script is create a Python node, remove the input and output ports, and create new ones of the appropriate types. I don't think you can change the port type (at least you could not in the past), therefore you need to remove the existing ports and create new ones. Name them accordingly and you'll be set!
  2. You could google this and find a better answer, but I'll try my best at explaining it. The "->" you see in COFFEE and other programming languages (C++), is a way to access an object's member or function. In the second script there is this "InMatrix" variable which refers to a matrix object, an instance of a matrix class. Be careful with "object". In this context it isn't a Cinema 4D mesh object or null object, nor deformer, nor generator, ... The object here is a "container" which holds some data and functions (members and methods in C++). The matrix class has a GetClone function which allows to create a copy of itself and pass it along. InMatrix->GetClone() thus means that from our InMatrix object, we call its internal function called GetClone, and the resulting copy is assigned to NewMatrix, a new object instantiated from the matrix class. EDIT: Well, for completeness. In C++ (other languages probably as well, but I am most familiar with C++) to access members and methods of an instantiated class or structure one can use "->" or sometimes just a dot. myObject->member myObject->method() - or - myOtherObject.member myOtherObject.method() It all depends how the object was instantiated, as a pointer or not. But I guess this all is getting beyond the scope of this forum.
  3. I can't seem to find the second COFFEE node you are referring to. All I see are 7 COFFEE nodes with the first script.
  4. Here is the first # Get the "shortest" angle between two vectors, provided via input ports Input1 and Input2, # The result is sent to output port Output1 import c4d def main(): global Output1 Output1 = c4d.utils.GetOptimalAngle(Input1, Input2, c4d.ROTATIONORDER_DEFAULT) And the second one As far as I can see this script is meant to create a matrix from a rotation and position, provided via input ports called Rotation and Position. The output port is then NewMatrix. I am not 100% sure this is what it is supposed to be, but without the actual scene file where the Xpresso and nodes can be investigated from, it is hard to tell. So, I'll go with my first assumption. The code for this is then # construct a matrix from Position and Rotation, # input ports are Position and Rotation, output prt is NewMatrix import c4d def main(): NewMatrix = c4d.utils.HPBToMatrix(Rotation, order=ROTATIONORDER_DEFAULT) NewMatrix.off = Position
  5. I will contact you when I get a release version ready. And will provide you with a link from a gmail account ... no blocking out anymore.
  6. It's Sunday morning, 6 AM. I just woke up with a possible solution to your request. I still need to see if I can get this solution implemented. But I guess I will have to get rid of the sticky key code as it kind of interferes with this new multi toolset shortcut solution. Since the sticky key didn't behave as expected on every version of Cinema 4D or OS platform, I was already more or less inclined to remove this anyway. Will report back when I have more news ... Edit: OK, the concept does work, but I had some trouble with the assignment of the different shortcuts. Basically what needs to be done is for the user to create a script per wanted toolset shortcut. Then assign a shortcut to each of these scripts ... and that's where Cinema didn't cooperate. It would allow me to assign a shortcut only to the last script of the set I had created. But restarting Cinema 4D after having created all the scripts does seem to do the trick. The script is simply passing the toolset number to Dials, so all scripts are equal except for the toolset number # Dials - toolset shortcut helper # 'TOOLSET' refers to the toolset number you would want to activate # Any number between 1 and N, where N is the total number of toolsets available. # Using toolset number 0 will activate the last used one. # When a toolset number is provided out of range the plugin will revert to using 0 # # Assign a shortcut to this script to activate the required Dials toolset # (for this to work you'll need Dials v1.2) import c4d TOOLSET = 1 if __name__=='__main__': c4d.CallCommand(1041321, TOOLSET) The above script uses TOOLSET = 1 to activate the first toolset, simply create different of these scripts, replacing the '1' with the required toolset number. @RobertLLet my know if you want to test this new version.
  7. Short answer: you can't. Cinema 4D is designed (as far as I know) to use a single shortcut for a single plugin. Before implementing the current toolsets via the middle ring, I researched possible solutions to provide multiple dials. One solution was to provide a command plugin per dial, which would allow users to define separate keyboard shortcuts per dial. This would also mean that the number of dials was predefined, as each dial would require a unique plugin ID obtained from MAXON. Furthermore, this would mean that the number of dials (thus toolsets) could not be created dynamically At that point, I assumed people would prefer having a single plugin, instead of one entry per dial, and be able to dynamically create the number of dials they wanted. As mentioned above, for each dial a separate plugin ID is required. I could provide 5, 10, 20 entries. Then someone comes along and requests 21 ;-) I would thus much more prefer a dynamic solution ... which I currently do not have. Let me sleep over it for a few nights, and I might come up with something. Nothing promised.
  8. There already are many tutorials available on the web related to UV unwrapping. Some are short, others more elaborate. Barely touching the subject or digging deep into the technical details. This cub, however, is aimed at the beginners who might have questions, how and when to apply particular seams ... and why. Tutorials are fine, they show you how to get things done. But when you have this particular mesh object, not matching any of the subjects handled in any tutorial ... how do you begin? With this club I hope to provide a starting point for those beginners, taking their first step into the world of UV unwrapping. Seasoned users are still welcome ... please share your knowledge. What this place is NOT meant to be: a simple collection of links to tutorials available on the web. Additionally, while I have written a few plugins and script related to UV editing, I don't consider myself an UV expert. But I will try to do my best at helping out, where possible.
  9. The free version of the plugin, available to download here at the C4DCafe, is not a demo version but has limited features. The fading in of the icons one by one is a limitation of this free 1.0 version. When you purchase the paid version (updated to 1.1), next to support you also obtain additional features such as the possibility to create multiple dials, as well as favorites per tool. This version does not have the limitation of fading in icons one by one. Features of the paid version are available in the demonstration video I provided a few posts back (https://www.c4dcafe.com/ipb/forums/topic/103440-dials-was-wheel-of-tools/?do=findComment&comment=687595)
  10. C4DS

    EasyUV

    Here is a quick demonstration video I made. It shows most of the available tools in action, hoping it provides an idea of the features available. I don't have demo versions of my plugins, except for Dials. While I understand people would like to try out to see if a plugin does fit one's workflow, it isn't always manageable to make a demo version without crippling the plugin.
  11. C4DS

    EasyUV

    I am planning to create some videos to demonstrate the available features of this plugin. Intended for beginners, as this is whom this plugin was focused for. However, since EasyUV is heavily based on Seamilar, the basic UV editing (move/rotate/scale) of points, edges, polygons and island is similar. You could thus check out the video created for Seamilar to get an idea how these tools are used. The original move, rotate and scale philosophy from the native core UV tools was kept. As such, these 3 operations use 3 different tools, each with their icon and Attribute Manager settings. In a future update I intend to merge these 3 tools into a single tool, as I myself have encountered scenarios where it would optimize the workflow in a great way having this single transform tool instead of the current separate actions. As said, this is future, so this should not be taken into account for your current decision making to use this plugin or not. As for the EasyUV tag versus the regular UVW tag: note that the EasyUV tag only stores the information related to seams and UV islands, the actual UV editing does happen on the regular UVW tag.
  12. C4DS

    EasyUV

    All I really needed was a way to render each separate icon with the same render settings, to the same folder, but with different filenames. In the end I only figured out a solution by creating a Take for each icon, manually naming the Take by the icon name it represents, and then using the Take name in the render settings. But then I figured I could step it up a little, as some icons were created using a perspective camera, while others with a simple top-down camera. With the Takes system, I could easily specify which camera to use. In the "old" days, I would have manually selected the appropriate camera, select the appropriate objects, hide the not-needed objects, change the output name in the render settings ... and press render. Rinse and repeat for all icons. It was a quick set up with Takes, but I need to use it more often in order to create some "muscle memory", as I already have forgotten how to do it. OK ... back on topic now.
  13. C4DS

    EasyUV

    EasyUV is ready and finalized. Available for Cinema 4D R16 upto R20, Windows and macOS. Available at Tools & Pixels For a limited period of time: introductory price of 15 euros.
  14. C4DS

    Python not backwards compatible in C4D

    Yes, the Python itself isn't the issue here. So the actual Python code could be shared to version before R17 ... when you copy/paste the entire code. Files containing Python code seem to be problematic when loaded into older versions. Although I haven't checked if Python scripts created in R17+ do have the same issue as the Python nodes in Xpresso or the Python tag. The hex editor was just a way to visualize the text data. Newline and carriage returns (ASCII characters 10 and 13, or 0a and 0d in hex) aren't visible in a regular text editor.
  15. C4DS

    Python not backwards compatible in C4D

    I understand you might think so, but NO, definitely not. From the start I assumed it was something related to how R16 did read or interpret the Python text data, triggered by the fact that you resolved the issue by retyping the first line of code. I went a little further, and just randomly added an empty line or a comment line anywhere in the Python code. This also - surprisingly - fixed the issue. I mean "surprisingly" in the sense that it is not code related. Went even further and saved the working version in R16 and compared both original and resaved text data (using Winmerge utility). This mentioned that both files used different carriage returns ... so I looked at both data in an hex viewer. This shows all characters in the text data, even the non-readable ones. Apparently, the R16 Python editor does use a different carriage return than R20. I assume that the switch between carriage return types was done at time of R17, since I can load the R20 Python in R19, R18 and R17 without issues. It's only R16 (and probably earlier versions) that show this problem. Anyway, there's not really something you can do about all this ... unfortunately. The only thing the user with an older version needs to do, is to force the Python editor to modify the carriage return by slightly modifying the content.

×