How to render polylines
I've been experimenting with the "Convert Ribbons to Lines" and "Convert Tubes to Lines" options under the Edit - Object - Geometry menu.
The commands execute correctly and the viewport displays the converted lines. Line width settings are added under the surfaces pane. However no line settings are added under the parameters pane, and the lines don't render in either the iray viewport render or a full render.
I had a look at the Generate_Polyline_Wireframe.dsa sample script availble here: http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/samples/geometry/generate_polyline_wireframe/start
I see that a Line Tesselation modifier is able to be added through scripting, so I tweaked the script to the following:
/********************************************************************** Copyright (C) 2002-2020 Daz 3D, Inc. All Rights Reserved. This script is provided as part of the Daz Script Documentation. The contents of this script, and\or any portion thereof, may only be used in accordance with the following license: Creative Commons Attribution 3.0 Unported (CC BY 3.0) - http://creativecommons.org/licenses/by/3.0 To contact Daz 3D or for more information about Daz Script visit the Daz 3D website: - http://www.daz3d.com **********************************************************************/// Source: http://docs.daz3d.com/doku.php/public/software/dazstudio/4/referenceguide/scripting/api_reference/samples/geometry/generate_polyline_wireframe/start// DAZ Studio version 4.11.0.36 filetype DAZ Script// Define an anonymous function;// serves as our main loop,// limits the scope of variables(function(){ // Initialize 'static' variables that hold modifier key state var s_bShiftPressed = false; var s_bControlPressed = false; var s_bAltPressed = false; var s_bMetaPressed = false; // If the "Action" global transient is defined, and its the correct type if( typeof( Action ) != "undefined" && Action.inherits( "DzScriptAction" ) ){ // If the current key sequence for the action is not pressed if( !App.isKeySequenceDown( Action.shortcut ) ){ updateModifierKeyState(); } // If the "Action" global transient is not defined } else if( typeof( Action ) == "undefined" ) { updateModifierKeyState(); } /*********************************************************************/ // void : A function for updating the keyboard modifier state function updateModifierKeyState() { // Get the current modifier key state var nModifierState = App.modifierKeyState(); // Update variables that hold modifier key state s_bShiftPressed = (nModifierState & 0x02000000) != 0; s_bControlPressed = (nModifierState & 0x04000000) != 0; s_bAltPressed = (nModifierState & 0x08000000) != 0; s_bMetaPressed = (nModifierState & 0x10000000) != 0; }; /*********************************************************************/ // void : A function for printing only if debugging function debug() { // If we are not debugging if( !s_bAltPressed ){ // We are done... return; } // Convert the arguments object into an array var aArguments = [].slice.call( arguments ); // Print the array print( aArguments.join(" ") ); }; /*********************************************************************/ // Boolean : A function for testing whether or not a QObject instance // inherits one of a list of types function inheritsType( oObject, aTypeNames ) { // If the object does not define the 'inherits' function if( !oObject || typeof( oObject.inherits ) != "function" ){ // We are done... it is not a QObject return false; } // Iterate over the list of type names for( var i = 0, nTypes = aTypeNames.length; i < nTypes; i += 1 ){ // If the object does not inherit the 'current' type if( !oObject.inherits( aTypeNames[i] ) ){ // Next!! continue; } // Return the result return true; } // Return the result return false; }; /*********************************************************************/ // DzNode : A function for getting the root of a node function getRootNode( oNode ) { // If we have a node and it is a bone if( oNode && inheritsType( oNode, ["DzBone"] ) ){ // We want the skeleton return oNode.getSkeleton(); } // Return the original node return oNode; }; /*********************************************************************/ // DzObject : A function for getting the object for a node function getObjectForNode( oNode, bRoot ) { // Get the node var oContextNode = bRoot ? getRootNode( oNode ) : oNode; // If we do not have a root node if( !oContextNode ){ // We are done... return null; } // Get the object of the root node var oObject = oContextNode.getObject(); // If we do not have an object if( !oObject ){ // We are done... return null; } // Return the object return oObject; }; /*********************************************************************/ // DzShape : A function for getting the shape for a node function getShapeForNode( oNode, bRoot ) { // Get the object of the node var oObject = getObjectForNode( oNode, bRoot ); // If we do not have an object if( !oObject ){ // We are done... return null; } // Get the shape of the root node var oShape = oObject.getCurrentShape(); // If we do not have a shape if( !oShape ){ // We are done... return null; } // Return the shape return oShape; }; /*********************************************************************/ // DzGeometry : A function for getting the geometry for the root of a node function getGeometryForNode( oNode, bRoot, bCached ) { // Get the shape of the root node var oShape = getShapeForNode( oNode, bRoot ); // If we do not have a shape if( !oShape ){ // We are done... return null; } // If we are getting the cached geometry if( bCached ){ // Update the working mesh //oShape.invalidateWorkingMesh(); // Get the object of the root node var oObject = getObjectForNode( oNode, bRoot ); // Return the geometry return oObject.getCachedGeom(); } // Get the geometry of the root node var oGeometry = oShape.getGeometry(); // If we do not have a geometry if( !oGeometry ){ // We are done... return null; } // Return the geometry return oGeometry; }; /*********************************************************************/ // DzFacetMesh : A function for getting the facet mesh for a node function getFacetMeshForNode( oNode, bRoot, bCached ) { // Get the geometry of the node var oGeometry = getGeometryForNode( oNode, bRoot, bCached ); // If we do not have a facet mesh if( !inheritsType( oGeometry, ["DzFacetMesh"] ) ){ // We are done... return null; } // Return the geometry return oGeometry; }; /*********************************************************************/ // Get the primary selection var oSrcNode = Scene.getPrimarySelection(); // If nothing is selected if( !oSrcNode ){ // We are done... return; } // Get the base mesh of the root node var oSrcBaseMesh = getFacetMeshForNode( oSrcNode, true, false ); // If we do not have a base mesh if( !oSrcBaseMesh ){ // We are done... return; } // Let the user know we are busy setBusyCursor(); // Get the source object var oSrcObject = getObjectForNode( oSrcNode, true ); // Create a "Line Tessellation" modifier var oTgtModifier = new DzLineTessellationModifier(); // Define the wireframe attributes var nSides = 3; var nWidth = 5; // Add the modifier to the target object oSrcObject.addModifier( oTgtModifier ); // Let the user know we are done clearBusyCursor(); // Finalize the function and invoke})();
This does add the Viewport Line and Render Line Tessellation Sides properties to the converted lines, but they still don't show up in renders. I'm not suprised, because my scripting skills are very basic so the edits I did are a complete hack job.
Any ideas what I'm missing?
I have tested in both the last 4.11 release, as well as the last 4.12 beta.
TLDR: How do you get lines to be renderable in Iray when using the "Convert Ribbons to Lines" and "Convert Tubes to Lines" options under the Edit - Object - Geometry menu?
Cheers,
Daniel
Comments
Are the too thin? Maybe make the material glow (brightly) and see if it produces light.
I'm trying to do something similar. It's been a year, but maybe we can put our heads together.
I think either you were a bit overzealous in ripping things out of the script or the script has been updated because nSides and nWidth are being defined and initialized, but the script as you presented it never actually does anything with these values. The original script has 4 stanzas in between where you declare nSides and nWidth and where you add the modifier that got deleted and they look like they were the lines that would have honoured the sides/width you wanted.
@InTheFlesh forgot to tag you.
@InTheFlesh - your email is exposed See: https://www.daz3d.com/forums/discussion/681551/why-is-daz-exposing-user-email-addresses
@TheMysteryIsThePoint - Any luck? It would be nice if we could import renderable Blender hair.
This is somewhat fixed, at least to thee xtent of not showing the email.
@UncannyValet No, sorry, I am focused on the opposite direction, i.e getting content out of DS, not into it.
Thanks for the heads up, fixed it now!
I did end up making some progress, but I lost a hardrive recently and been out of the scene working on other projects for a while now. Hopefully I'll get back to it eventually.