{
  "id": "project",
  "name": "Project",
  "displayName": "Project",
  "category": "SOP",
  "subcategory": "Generators",
  "version": "",
  "lastUpdated": "2025-08-08T00:37:51.536Z",
  "sourceFile": "C:\\Program Files\\Derivative\\TouchDesigner\\Samples\\Learn\\OfflineHelp\\https.docs.derivative.ca\\Project_SOP.htm",
  "url": "",
  "description": "The Project SOP creates curves on surface (also known as trim or profile curves) by projecting a 3D face onto a spline surface, much like a light casts a 2D shadow onto a 3D surface. There are two projection methods: along a vector, or by mapping the face directly onto the parametric space of the surface.",
  "summary": "The Project SOP creates curves on surface (also known as trim or profile curves) by projecting a 3D face onto a spline surface, much like a light casts a 2D shadow onto a 3D surface. There are two pro",
  "details": "",
  "usage": "",
  "tips": [],
  "warnings": [],
  "parameters": [
    {
      "id": null,
      "name": "Face Group",
      "label": "Face Group",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "From Derivative\n\t\t\n\t\t\n\t\t\n\t\t\n\t\tJump to navigation\n\t\tJump to search\n\t\t\nThe Project  creates curves on surface (also known as trim or profile curves) by projecting a 3D face onto a spline surface, much like a light casts a 2D shadow onto a 3D surface. There are two projection methods: along a vector, or by mapping the face directly onto the parametric space of the surface.\t\t\nYou will usually need a Trim SOP, Bridge SOP, or Profile SOP after a Project . For example, in the case of a Trim  we might have:\t\t\t\n\t\t\t\nUse a Trim  to cut a hole in the projected surface (as shown above).\t\t\t\nUse a Bridge  to skin the profile curve to another profile curve.\t\t\t\nUse a Profile  to extract the curve on surface or remap its position.\t\t\t\nIf you end up with a profile curve that is not visible, it may still exist. Confirm a profile curve's existence by clicking on the 's info pop-up (using middle-mouse button).\t\t\t\n\n\nTo delete a projected curve, use a Delete SOP, and enter the profile number (e.g. 1.4 returns the fifth profile on the second primitive (counting starts at 0) ). You can visualise the number of the profiles by enabling the Profile Number icon in the Viewport Display options.\t\t\t\nYou can group the profile curves with a Group SOP. Do this by typing the profile numbers in the Pattern field. You can use all regular expressions.\t\t\t\nYou can apply parametric affine transformations to the profile by using a Primitive SOP. You can also use the   to open, close, reverse, and cycle the profile curves.\t\t\t\nNote: When applying transformations to a profile in the  , you can only rotate about the Z axis because the projected curve is a planar curve that lives in the domain of the surface. Therefore it wouldn't make any sense to allow rotations in X or Y for profiles.\nprojectSOP_Class\n\nContents\n \n \n\n \n \n \n \n\n \n \n \n \n \n\n\n\n\n\n  facegroup - The group of faces to be projected onto the spline surfaces. Accepts patterns, as described in Pattern Matching.\n\n\n\t\t\t\n  surfgroup - The group of surfaces to project faces onto. Accepts patterns, as described in Pattern Matching.\n\n\n\t\t\t\n  cycle -  - Select the method use to project the 3D faces onto the 3D spline surfaces.\n\n allseq - If projected parametrically, the spatial relationship between the faces will be preserved. For example, if the text \"hello\" is projected parametrically and in sequence, the letters will appear on the surface naturally, side by side. Sequence is not applicable if projecting along a vector. allover - If projected parametrically, the spatial relationship between the faces is not preserved, so they will appear overlapped in the area of the domain chosen for projection. Overlapping is not applicable if projecting along a vector. oneeach - Each face is projected onto a surface in the order in which the face and the surface appear in the input or in their respective groups. cycled - This is the same as One Per Surface, above, but starts the faces again if there are surfaces left.\n\n\n\n  method -  - Select between projecting along a vector or parametrically using the parameters below.\n\n vector - The face is projected along a 3D vector and its image on the surface is converted into a curve on the surface. One spatial curve may generate several profiles depending on its position relative to the surface, the shape of the surface, and the chosen projection side. If the projected face does not intersect the surface at all, no profile curve will be generated. parametric - The spatial size of the faces is mapped directly onto the domain of the spline surface. The resulting projection is sensitive to the parameterization of the surface and is likely to appear distorted. It is, however, the fastest of the two projection types and tends to behave well on surfaces with regular shapes and chord-length parameterizations.\n\n  axis -  - The axis along which the four corners of the feature are projected onto the base. When adding the feature from the outside as a Vector paste.\n\n xaxis - Cartesian axis X, Y, or Z. yaxis - Cartesian axis X, Y, or Z. zaxis - Cartesian axis X, Y, or Z. fnorm - Projection axis occurs along each face's normal. Thus, each face could potentially have a different projection direction than the others. The option also works well for non-planar faces. mindist - Projects the entire 3D face along the vectors of minimum distance to the surface. The projection resolution is given by the  value. other - Enables the Vector fields immediately below to specify the X, Y, and Z components of the vector.Note: When the Minimum Distance option is selected, the Side button becomes disabled because it's irrelevant for this projection type.\n\n\n\t\t\n  vector -  - The X, Y, and Z components of the projection vector if none of the main axes is chosen in the Axis parameter above.\n\nvector1 -vector2 -vector3 -\n\t\t\n  projside -  - Select which sides of the geometry to project on, closest or farthest.\n\n closest - Will project the face onto the closest part of the surface in either direction of projection vector. For example, if a curve being projected onto a tube is inside the tube, it will yield two profiles, one on each side of the tube; if the curve is outside the tube, it will project onto the side closest to it. farthest - The reverse of Closest. In the example above, Farthest would also yield two images if the curve is inside the tube, but it will choose the farthest side if the curve is outside the tube.\n\t\t\n  sdivs - The number of points to be computed on the spatial face between successive spans. A span is the line connecting two consecutive CVs on a polygon, or the arc between two breakpoints on a spline curve. The projection tends to become more accurate as the number of divisions increases.\n\n\n\t\t\n  rtolerance - Controls the precision of the ray intersection with the surface. The ray is cast along the projection vector from every point of the 3-D curve.\n\n\n\t\t\n  ftolerance - Controls the 2-D fitting precision and is typically less than 0.01.\n\n\n\t\t\n  uvgap - This specifies what percentage of the size of the surface domain is acceptable for two separate profiles to be joined into a single curve.\n\n\n\t\t\n  order - The spline order of the resulting profile curve. The type of curve (Bzier or NURBS) is inherited from the spatial curve. The order, however, is not inherited because the spline order provides useful control over the quality of the fit. If the spatial face is a polygon, the profile will be a NURBS curve.\n\n\n\t\t\n  csharp - Controls the precision with which sharp corners in the projection curve are interpolated. It should be on when the projection has areas of high changes in curvature.\n\n\n\t\t\n  accurate - Use a very accurate yet expensive algebraic pruning algorithm to determine the intersection of the vector with the surface.\n\n\n\t\t\n  ufrom -  - Specifies which of the spatial coordinates - X, Y, or Z - must be mapped to the U parametric direction of the surface.\n\n uvx - uvy - uvz -\n\t\t\n  vfrom -  - Specifies which of the spatial coordinates - X, Y, or Z - must be mapped to the V parametric direction of the surface.\n\n uvx - uvy - uvz -\n\t\t\n  userange - This option is on by default. It causes the profile to be scaled and translated to fit within the surface's domain ranges described below. If this option is off, the profile's coordinates are mapped onto the surface domain without any transformation; consequently, the profile will not be visible if its points are not inside the domain of the target surface.\nTypically, the projected face should not be mapped to the U/V range if it was previously extracted from the same surface using the Profile SOP with the Parametrically to XY option selected.\t\t\t\nThe extraction and re-projection tandem can be very useful in achieving the modeling goals currently attainable only with 3D curves. Such tasks include the ability to edit the points of a profile, joining, stitching, or filleting profiles together, carving or refining profiles, etc. By extracting a profile parametrically to XY, Touch creates a 3D face that is identical to the 2D profile but has an additional (constant) Z component.\t\t\t\nThe resulting 3D curve can be modeled using all the 3D tools available. Finally, the modeled 3D face can be reapplied onto the surface parametrically, making sure that the range mapping option is off.\n\n\n\t\t\n  urange -  - Indicates in percentages what part of the U surface domain is the mapping area. A full range of 0-1 will cause the profiles to be mapped to the entire domain in the U parametric direction. The range is not restricted to the 0-1 interval.\n\nurange1 -urange2 -\n\t\t\n  vrange -  - Indicates in percentages what part of the V surface domain is the mapping area. A full range of 0-1 will cause the profiles to be mapped to the entire domain in the V parametric direction. The range is not restricted to the 0-1 interval.\n\nvrange1 -vrange2 -\n\t\t\n  maptype -  - Select how to reposition and scale an existing profile to fit within the specified domain range.\n\n unif - Mapping converts the spatial coordinates of the projection faces to (U,V) points in the domain of the surface without taking into account the parameterization of the surface. chordlen - Mapping takes into account the surface parameterization and attempts to compute a projection best suited to the spatial and parametric determinants of the model.If the face is not mapped to range, it's vertices will be transferred to the profile without any transformation. Use this technique together with the parametric extraction in the Profile  to edit the points of a profile generated by a  other than Project: extract, edit the points, then project again.\n\n\n\n\n\n\nThe: Along Vector > Axis > Minimum Distance option is extremely useful, say in the following situation: You have a NURBS surface of a head, and you want to obtain a NURBS patch by projecting a hairline onto the head's surface. You could:\nTemplate the NURBS head.\nEnter a Model SOP.\nEnable the Snap to Template option in the Model Editor (Snap options).\nDraw a NURBS curve along the surface of the head where you want the hairline. Then, with the Project , you select the Minimum Distance option, and you have a profile curve with which you can trim the surface of the head to obtain the patch.\nThus having obtained a NURBS patch for the scalp, you could use it as the base for hair.\n\n\nPlace a Circle SOP - Type: NURBS, Radius: 0.3, 0.3; then place a Tube SOP - Type: NURBS.\nConnect them into a Project  - Circle to Input1; Tube to Input2.\nAppend a Trim SOP to the Project  - it trims the surface according to the projection provided by the Project . You need to append a Trim  to a Project  in order to realise this trimming action.\nEnable the template flags on the Circle and Tube SOPs; make the Project  the display .\n\n\n -\n -\n\nExtra Information for the Project  can be accessed via an Info CHOP.\n\n\n\n - Number of points in this . - Number of primitives in this . - Number of particles in this . - Time spent in another thread updating geometry data on the  from the 's CPU data. As it is part of another thread, this time is not part of the usual frame time. - Time spent in another thread updating meta surface geometry data (such as metaballs or nurbs) on the  from the 's CPU data. As it is part of another thread, this time is not part of the usual frame time.\n - Number of times the operator has cooked since the process started. - Duration of the last cook in milliseconds. - Frame number when this operator was last cooked relative to the component timeline. - Frame number when this operator was last cooked relative to the absolute time. - Time in milliseconds at which the operator started cooking in the frame it was cooked. - Time in milliseconds at which the operator finished cooking in the frame it was cooked. - 1 if operator was cooked this frame. - Number of warnings in this operator if any. - Number of errors in this operator if any.\nTouchDesigner Build: Latest\\n2021.100002018.28070before 2018.28070\nSOPs\n• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • \n\nA Operator Family that reads, creates and modifies 3D points, polygons, lines, particles, surfaces, spheres and meatballs. Particles and point clouds are now done primarily on the GPU using TOPs.\n\n\n\nA surface type in SOPs that includes polygon, curve (NURBS and Bezier), patch (NURBS and Bezier) and other basic shapes like sphere, tube and metaball. Points and Primitives are part of the Geometry Detail, which is a part of a SOP.\n\n\n\nAn Operator Family which operate on Channels (a sequence of numbers (Samples)) which are used for animation, audio, mathematics, simulation, logic, UI construction, and data streamed from/to devices and protocols.\n\n\n\nThe Graphics Processing Unit. This is the high-speed, many-core processor of the graphics card/chip that takes geometry, images and data from the CPU and creates images and processed data.\n\n\n\n\n\n\n\n\nRetrieved from \"https://docs.derivative.ca/index.php?title=Project_SOP&oldid=24222\"\n\t\tCategory: SOPs",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.531Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Face Group",
      "label": "Face Group",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "From Derivative\n\t\t\n\t\t\n\t\t\n\t\t\n\t\tJump to navigation\n\t\tJump to search\n\t\t\nThe Project  creates curves on surface (also known as trim or profile curves) by projecting a 3D face onto a spline surface, much like a light casts a 2D shadow onto a 3D surface. There are two projection methods: along a vector, or by mapping the face directly onto the parametric space of the surface.\t\t\nYou will usually need a Trim SOP, Bridge SOP, or Profile SOP after a Project . For example, in the case of a Trim  we might have:\t\t\t\n\t\t\t\nUse a Trim  to cut a hole in the projected surface (as shown above).\t\t\t\nUse a Bridge  to skin the profile curve to another profile curve.\t\t\t\nUse a Profile  to extract the curve on surface or remap its position.\t\t\t\nIf you end up with a profile curve that is not visible, it may still exist. Confirm a profile curve's existence by clicking on the 's info pop-up (using middle-mouse button).\t\t\t\n\n\nTo delete a projected curve, use a Delete SOP, and enter the profile number (e.g. 1.4 returns the fifth profile on the second primitive (counting starts at 0) ). You can visualise the number of the profiles by enabling the Profile Number icon in the Viewport Display options.\t\t\t\nYou can group the profile curves with a Group SOP. Do this by typing the profile numbers in the Pattern field. You can use all regular expressions.\t\t\t\nYou can apply parametric affine transformations to the profile by using a Primitive SOP. You can also use the   to open, close, reverse, and cycle the profile curves.\t\t\t\nNote: When applying transformations to a profile in the  , you can only rotate about the Z axis because the projected curve is a planar curve that lives in the domain of the surface. Therefore it wouldn't make any sense to allow rotations in X or Y for profiles.\nprojectSOP_Class\n\nContents\n \n \n\n \n \n \n \n\n \n \n \n \n \n\n\n\n\n\n  facegroup - The group of faces to be projected onto the spline surfaces. Accepts patterns, as described in Pattern Matching.\n\n\n\t\t\t\n  surfgroup - The group of surfaces to project faces onto. Accepts patterns, as described in Pattern Matching.\n\n\n\t\t\t\n  cycle -  - Select the method use to project the 3D faces onto the 3D spline surfaces.\n\n allseq - If projected parametrically, the spatial relationship between the faces will be preserved. For example, if the text \"hello\" is projected parametrically and in sequence, the letters will appear on the surface naturally, side by side. Sequence is not applicable if projecting along a vector. allover - If projected parametrically, the spatial relationship between the faces is not preserved, so they will appear overlapped in the area of the domain chosen for projection. Overlapping is not applicable if projecting along a vector. oneeach - Each face is projected onto a surface in the order in which the face and the surface appear in the input or in their respective groups. cycled - This is the same as One Per Surface, above, but starts the faces again if there are surfaces left.\n\n\n\n  method -  - Select between projecting along a vector or parametrically using the parameters below.\n\n vector - The face is projected along a 3D vector and its image on the surface is converted into a curve on the surface. One spatial curve may generate several profiles depending on its position relative to the surface, the shape of the surface, and the chosen projection side. If the projected face does not intersect the surface at all, no profile curve will be generated. parametric - The spatial size of the faces is mapped directly onto the domain of the spline surface. The resulting projection is sensitive to the parameterization of the surface and is likely to appear distorted. It is, however, the fastest of the two projection types and tends to behave well on surfaces with regular shapes and chord-length parameterizations.\n\n  axis -  - The axis along which the four corners of the feature are projected onto the base. When adding the feature from the outside as a Vector paste.\n\n xaxis - Cartesian axis X, Y, or Z. yaxis - Cartesian axis X, Y, or Z. zaxis - Cartesian axis X, Y, or Z. fnorm - Projection axis occurs along each face's normal. Thus, each face could potentially have a different projection direction than the others. The option also works well for non-planar faces. mindist - Projects the entire 3D face along the vectors of minimum distance to the surface. The projection resolution is given by the  value. other - Enables the Vector fields immediately below to specify the X, Y, and Z components of the vector.Note: When the Minimum Distance option is selected, the Side button becomes disabled because it's irrelevant for this projection type.\n\n\n\t\t\n  vector -  - The X, Y, and Z components of the projection vector if none of the main axes is chosen in the Axis parameter above.\n\nvector1 -vector2 -vector3 -\n\t\t\n  projside -  - Select which sides of the geometry to project on, closest or farthest.\n\n closest - Will project the face onto the closest part of the surface in either direction of projection vector. For example, if a curve being projected onto a tube is inside the tube, it will yield two profiles, one on each side of the tube; if the curve is outside the tube, it will project onto the side closest to it. farthest - The reverse of Closest. In the example above, Farthest would also yield two images if the curve is inside the tube, but it will choose the farthest side if the curve is outside the tube.\n\t\t\n  sdivs - The number of points to be computed on the spatial face between successive spans. A span is the line connecting two consecutive CVs on a polygon, or the arc between two breakpoints on a spline curve. The projection tends to become more accurate as the number of divisions increases.\n\n\n\t\t\n  rtolerance - Controls the precision of the ray intersection with the surface. The ray is cast along the projection vector from every point of the 3-D curve.\n\n\n\t\t\n  ftolerance - Controls the 2-D fitting precision and is typically less than 0.01.\n\n\n\t\t\n  uvgap - This specifies what percentage of the size of the surface domain is acceptable for two separate profiles to be joined into a single curve.\n\n\n\t\t\n  order - The spline order of the resulting profile curve. The type of curve (Bzier or NURBS) is inherited from the spatial curve. The order, however, is not inherited because the spline order provides useful control over the quality of the fit. If the spatial face is a polygon, the profile will be a NURBS curve.\n\n\n\t\t\n  csharp - Controls the precision with which sharp corners in the projection curve are interpolated. It should be on when the projection has areas of high changes in curvature.\n\n\n\t\t\n  accurate - Use a very accurate yet expensive algebraic pruning algorithm to determine the intersection of the vector with the surface.\n\n\n\t\t\n  ufrom -  - Specifies which of the spatial coordinates - X, Y, or Z - must be mapped to the U parametric direction of the surface.\n\n uvx - uvy - uvz -\n\t\t\n  vfrom -  - Specifies which of the spatial coordinates - X, Y, or Z - must be mapped to the V parametric direction of the surface.\n\n uvx - uvy - uvz -\n\t\t\n  userange - This option is on by default. It causes the profile to be scaled and translated to fit within the surface's domain ranges described below. If this option is off, the profile's coordinates are mapped onto the surface domain without any transformation; consequently, the profile will not be visible if its points are not inside the domain of the target surface.\nTypically, the projected face should not be mapped to the U/V range if it was previously extracted from the same surface using the Profile SOP with the Parametrically to XY option selected.\t\t\t\nThe extraction and re-projection tandem can be very useful in achieving the modeling goals currently attainable only with 3D curves. Such tasks include the ability to edit the points of a profile, joining, stitching, or filleting profiles together, carving or refining profiles, etc. By extracting a profile parametrically to XY, Touch creates a 3D face that is identical to the 2D profile but has an additional (constant) Z component.\t\t\t\nThe resulting 3D curve can be modeled using all the 3D tools available. Finally, the modeled 3D face can be reapplied onto the surface parametrically, making sure that the range mapping option is off.\n\n\n\t\t\n  urange -  - Indicates in percentages what part of the U surface domain is the mapping area. A full range of 0-1 will cause the profiles to be mapped to the entire domain in the U parametric direction. The range is not restricted to the 0-1 interval.\n\nurange1 -urange2 -\n\t\t\n  vrange -  - Indicates in percentages what part of the V surface domain is the mapping area. A full range of 0-1 will cause the profiles to be mapped to the entire domain in the V parametric direction. The range is not restricted to the 0-1 interval.\n\nvrange1 -vrange2 -\n\t\t\n  maptype -  - Select how to reposition and scale an existing profile to fit within the specified domain range.\n\n unif - Mapping converts the spatial coordinates of the projection faces to (U,V) points in the domain of the surface without taking into account the parameterization of the surface. chordlen - Mapping takes into account the surface parameterization and attempts to compute a projection best suited to the spatial and parametric determinants of the model.If the face is not mapped to range, it's vertices will be transferred to the profile without any transformation. Use this technique together with the parametric extraction in the Profile  to edit the points of a profile generated by a  other than Project: extract, edit the points, then project again.\n\n\n\n\n\n\nThe: Along Vector > Axis > Minimum Distance option is extremely useful, say in the following situation: You have a NURBS surface of a head, and you want to obtain a NURBS patch by projecting a hairline onto the head's surface. You could:\nTemplate the NURBS head.\nEnter a Model SOP.\nEnable the Snap to Template option in the Model Editor (Snap options).\nDraw a NURBS curve along the surface of the head where you want the hairline. Then, with the Project , you select the Minimum Distance option, and you have a profile curve with which you can trim the surface of the head to obtain the patch.\nThus having obtained a NURBS patch for the scalp, you could use it as the base for hair.\n\n\nPlace a Circle SOP - Type: NURBS, Radius: 0.3, 0.3; then place a Tube SOP - Type: NURBS.\nConnect them into a Project  - Circle to Input1; Tube to Input2.\nAppend a Trim SOP to the Project  - it trims the surface according to the projection provided by the Project . You need to append a Trim  to a Project  in order to realise this trimming action.\nEnable the template flags on the Circle and Tube SOPs; make the Project  the display .\n\n\n -\n -\n\nExtra Information for the Project  can be accessed via an Info CHOP.\n\n\n\n - Number of points in this . - Number of primitives in this . - Number of particles in this . - Time spent in another thread updating geometry data on the  from the 's CPU data. As it is part of another thread, this time is not part of the usual frame time. - Time spent in another thread updating meta surface geometry data (such as metaballs or nurbs) on the  from the 's CPU data. As it is part of another thread, this time is not part of the usual frame time.\n - Number of times the operator has cooked since the process started. - Duration of the last cook in milliseconds. - Frame number when this operator was last cooked relative to the component timeline. - Frame number when this operator was last cooked relative to the absolute time. - Time in milliseconds at which the operator started cooking in the frame it was cooked. - Time in milliseconds at which the operator finished cooking in the frame it was cooked. - 1 if operator was cooked this frame. - Number of warnings in this operator if any. - Number of errors in this operator if any.\nTouchDesigner Build: Latest\\n2021.100002018.28070before 2018.28070\nSOPs\n• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • \n\nA Operator Family that reads, creates and modifies 3D points, polygons, lines, particles, surfaces, spheres and meatballs. Particles and point clouds are now done primarily on the GPU using TOPs.\n\n\n\nA surface type in SOPs that includes polygon, curve (NURBS and Bezier), patch (NURBS and Bezier) and other basic shapes like sphere, tube and metaball. Points and Primitives are part of the Geometry Detail, which is a part of a SOP.\n\n\n\nAn Operator Family which operate on Channels (a sequence of numbers (Samples)) which are used for animation, audio, mathematics, simulation, logic, UI construction, and data streamed from/to devices and protocols.\n\n\n\nThe Graphics Processing Unit. This is the high-speed, many-core processor of the graphics card/chip that takes geometry, images and data from the CPU and creates images and processed data.\n\n\n\n\n\n\n\n\nRetrieved from \"https://docs.derivative.ca/index.php?title=Project_SOP&oldid=24222\"\n\t\tCategory: SOPs",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.533Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Face Group",
      "label": "Face Group",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "The Project  creates curves on surface (also known as trim or profile curves) by projecting a 3D face onto a spline surface, much like a light casts a 2D shadow onto a 3D surface. There are two projection methods: along a vector, or by mapping the face directly onto the parametric space of the surface.\t\t\nYou will usually need a Trim SOP, Bridge SOP, or Profile SOP after a Project . For example, in the case of a Trim  we might have:\t\t\t\n\t\t\t\nUse a Trim  to cut a hole in the projected surface (as shown above).\t\t\t\nUse a Bridge  to skin the profile curve to another profile curve.\t\t\t\nUse a Profile  to extract the curve on surface or remap its position.\t\t\t\nIf you end up with a profile curve that is not visible, it may still exist. Confirm a profile curve's existence by clicking on the 's info pop-up (using middle-mouse button).\t\t\t\n\n\nTo delete a projected curve, use a Delete SOP, and enter the profile number (e.g. 1.4 returns the fifth profile on the second primitive (counting starts at 0) ). You can visualise the number of the profiles by enabling the Profile Number icon in the Viewport Display options.\t\t\t\nYou can group the profile curves with a Group SOP. Do this by typing the profile numbers in the Pattern field. You can use all regular expressions.\t\t\t\nYou can apply parametric affine transformations to the profile by using a Primitive SOP. You can also use the   to open, close, reverse, and cycle the profile curves.\t\t\t\nNote: When applying transformations to a profile in the  , you can only rotate about the Z axis because the projected curve is a planar curve that lives in the domain of the surface. Therefore it wouldn't make any sense to allow rotations in X or Y for profiles.\nprojectSOP_Class\n\nContents\n \n \n\n \n \n \n \n\n \n \n \n \n \n\n\n\n\n\n  facegroup - The group of faces to be projected onto the spline surfaces. Accepts patterns, as described in Pattern Matching.\n\n\n\t\t\t\n  surfgroup - The group of surfaces to project faces onto. Accepts patterns, as described in Pattern Matching.\n\n\n\t\t\t\n  cycle -  - Select the method use to project the 3D faces onto the 3D spline surfaces.\n\n allseq - If projected parametrically, the spatial relationship between the faces will be preserved. For example, if the text \"hello\" is projected parametrically and in sequence, the letters will appear on the surface naturally, side by side. Sequence is not applicable if projecting along a vector. allover - If projected parametrically, the spatial relationship between the faces is not preserved, so they will appear overlapped in the area of the domain chosen for projection. Overlapping is not applicable if projecting along a vector. oneeach - Each face is projected onto a surface in the order in which the face and the surface appear in the input or in their respective groups. cycled - This is the same as One Per Surface, above, but starts the faces again if there are surfaces left.\n\n\n\n  method -  - Select between projecting along a vector or parametrically using the parameters below.\n\n vector - The face is projected along a 3D vector and its image on the surface is converted into a curve on the surface. One spatial curve may generate several profiles depending on its position relative to the surface, the shape of the surface, and the chosen projection side. If the projected face does not intersect the surface at all, no profile curve will be generated. parametric - The spatial size of the faces is mapped directly onto the domain of the spline surface. The resulting projection is sensitive to the parameterization of the surface and is likely to appear distorted. It is, however, the fastest of the two projection types and tends to behave well on surfaces with regular shapes and chord-length parameterizations.\n\n  axis -  - The axis along which the four corners of the feature are projected onto the base. When adding the feature from the outside as a Vector paste.\n\n xaxis - Cartesian axis X, Y, or Z. yaxis - Cartesian axis X, Y, or Z. zaxis - Cartesian axis X, Y, or Z. fnorm - Projection axis occurs along each face's normal. Thus, each face could potentially have a different projection direction than the others. The option also works well for non-planar faces. mindist - Projects the entire 3D face along the vectors of minimum distance to the surface. The projection resolution is given by the  value. other - Enables the Vector fields immediately below to specify the X, Y, and Z components of the vector.Note: When the Minimum Distance option is selected, the Side button becomes disabled because it's irrelevant for this projection type.\n\n\n\t\t\n  vector -  - The X, Y, and Z components of the projection vector if none of the main axes is chosen in the Axis parameter above.\n\nvector1 -vector2 -vector3 -\n\t\t\n  projside -  - Select which sides of the geometry to project on, closest or farthest.\n\n closest - Will project the face onto the closest part of the surface in either direction of projection vector. For example, if a curve being projected onto a tube is inside the tube, it will yield two profiles, one on each side of the tube; if the curve is outside the tube, it will project onto the side closest to it. farthest - The reverse of Closest. In the example above, Farthest would also yield two images if the curve is inside the tube, but it will choose the farthest side if the curve is outside the tube.\n\t\t\n  sdivs - The number of points to be computed on the spatial face between successive spans. A span is the line connecting two consecutive CVs on a polygon, or the arc between two breakpoints on a spline curve. The projection tends to become more accurate as the number of divisions increases.\n\n\n\t\t\n  rtolerance - Controls the precision of the ray intersection with the surface. The ray is cast along the projection vector from every point of the 3-D curve.\n\n\n\t\t\n  ftolerance - Controls the 2-D fitting precision and is typically less than 0.01.\n\n\n\t\t\n  uvgap - This specifies what percentage of the size of the surface domain is acceptable for two separate profiles to be joined into a single curve.\n\n\n\t\t\n  order - The spline order of the resulting profile curve. The type of curve (Bzier or NURBS) is inherited from the spatial curve. The order, however, is not inherited because the spline order provides useful control over the quality of the fit. If the spatial face is a polygon, the profile will be a NURBS curve.\n\n\n\t\t\n  csharp - Controls the precision with which sharp corners in the projection curve are interpolated. It should be on when the projection has areas of high changes in curvature.\n\n\n\t\t\n  accurate - Use a very accurate yet expensive algebraic pruning algorithm to determine the intersection of the vector with the surface.\n\n\n\t\t\n  ufrom -  - Specifies which of the spatial coordinates - X, Y, or Z - must be mapped to the U parametric direction of the surface.\n\n uvx - uvy - uvz -\n\t\t\n  vfrom -  - Specifies which of the spatial coordinates - X, Y, or Z - must be mapped to the V parametric direction of the surface.\n\n uvx - uvy - uvz -\n\t\t\n  userange - This option is on by default. It causes the profile to be scaled and translated to fit within the surface's domain ranges described below. If this option is off, the profile's coordinates are mapped onto the surface domain without any transformation; consequently, the profile will not be visible if its points are not inside the domain of the target surface.\nTypically, the projected face should not be mapped to the U/V range if it was previously extracted from the same surface using the Profile SOP with the Parametrically to XY option selected.\t\t\t\nThe extraction and re-projection tandem can be very useful in achieving the modeling goals currently attainable only with 3D curves. Such tasks include the ability to edit the points of a profile, joining, stitching, or filleting profiles together, carving or refining profiles, etc. By extracting a profile parametrically to XY, Touch creates a 3D face that is identical to the 2D profile but has an additional (constant) Z component.\t\t\t\nThe resulting 3D curve can be modeled using all the 3D tools available. Finally, the modeled 3D face can be reapplied onto the surface parametrically, making sure that the range mapping option is off.\n\n\n\t\t\n  urange -  - Indicates in percentages what part of the U surface domain is the mapping area. A full range of 0-1 will cause the profiles to be mapped to the entire domain in the U parametric direction. The range is not restricted to the 0-1 interval.\n\nurange1 -urange2 -\n\t\t\n  vrange -  - Indicates in percentages what part of the V surface domain is the mapping area. A full range of 0-1 will cause the profiles to be mapped to the entire domain in the V parametric direction. The range is not restricted to the 0-1 interval.\n\nvrange1 -vrange2 -\n\t\t\n  maptype -  - Select how to reposition and scale an existing profile to fit within the specified domain range.\n\n unif - Mapping converts the spatial coordinates of the projection faces to (U,V) points in the domain of the surface without taking into account the parameterization of the surface. chordlen - Mapping takes into account the surface parameterization and attempts to compute a projection best suited to the spatial and parametric determinants of the model.If the face is not mapped to range, it's vertices will be transferred to the profile without any transformation. Use this technique together with the parametric extraction in the Profile  to edit the points of a profile generated by a  other than Project: extract, edit the points, then project again.\n\n\n\n\n\n\nThe: Along Vector > Axis > Minimum Distance option is extremely useful, say in the following situation: You have a NURBS surface of a head, and you want to obtain a NURBS patch by projecting a hairline onto the head's surface. You could:\nTemplate the NURBS head.\nEnter a Model SOP.\nEnable the Snap to Template option in the Model Editor (Snap options).\nDraw a NURBS curve along the surface of the head where you want the hairline. Then, with the Project , you select the Minimum Distance option, and you have a profile curve with which you can trim the surface of the head to obtain the patch.\nThus having obtained a NURBS patch for the scalp, you could use it as the base for hair.\n\n\nPlace a Circle SOP - Type: NURBS, Radius: 0.3, 0.3; then place a Tube SOP - Type: NURBS.\nConnect them into a Project  - Circle to Input1; Tube to Input2.\nAppend a Trim SOP to the Project  - it trims the surface according to the projection provided by the Project . You need to append a Trim  to a Project  in order to realise this trimming action.\nEnable the template flags on the Circle and Tube SOPs; make the Project  the display .\n\n\n -\n -\n\nExtra Information for the Project  can be accessed via an Info CHOP.\n\n\n\n - Number of points in this . - Number of primitives in this . - Number of particles in this . - Time spent in another thread updating geometry data on the  from the 's CPU data. As it is part of another thread, this time is not part of the usual frame time. - Time spent in another thread updating meta surface geometry data (such as metaballs or nurbs) on the  from the 's CPU data. As it is part of another thread, this time is not part of the usual frame time.\n - Number of times the operator has cooked since the process started. - Duration of the last cook in milliseconds. - Frame number when this operator was last cooked relative to the component timeline. - Frame number when this operator was last cooked relative to the absolute time. - Time in milliseconds at which the operator started cooking in the frame it was cooked. - Time in milliseconds at which the operator finished cooking in the frame it was cooked. - 1 if operator was cooked this frame. - Number of warnings in this operator if any. - Number of errors in this operator if any.\nTouchDesigner Build: Latest\\n2021.100002018.28070before 2018.28070\nSOPs\n• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • \n\nA Operator Family that reads, creates and modifies 3D points, polygons, lines, particles, surfaces, spheres and meatballs. Particles and point clouds are now done primarily on the GPU using TOPs.\n\n\n\nA surface type in SOPs that includes polygon, curve (NURBS and Bezier), patch (NURBS and Bezier) and other basic shapes like sphere, tube and metaball. Points and Primitives are part of the Geometry Detail, which is a part of a SOP.\n\n\n\nAn Operator Family which operate on Channels (a sequence of numbers (Samples)) which are used for animation, audio, mathematics, simulation, logic, UI construction, and data streamed from/to devices and protocols.\n\n\n\nThe Graphics Processing Unit. This is the high-speed, many-core processor of the graphics card/chip that takes geometry, images and data from the CPU and creates images and processed data.\n\n\n\n\n\n\n\n\nRetrieved from \"https://docs.derivative.ca/index.php?title=Project_SOP&oldid=24222\"",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.534Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Face Group",
      "label": "Face Group",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "facegroup - The group of faces to be projected onto the spline surfaces. Accepts patterns, as described in Pattern Matching.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Surface Group",
      "label": "Surface Group",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "surfgroup - The group of surfaces to project faces onto. Accepts patterns, as described in Pattern Matching.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Cycle Type",
      "label": "Cycle Type",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "cycle -  - Select the method use to project the 3D faces onto the 3D spline surfaces.\n\n allseq - If projected parametrically, the spatial relationship between the faces will be preserved. For example, if the text \"hello\" is projected parametrically and in sequence, the letters will appear on the surface naturally, side by side. Sequence is not applicable if projecting along a vector. allover - If projected parametrically, the spatial relationship between the faces is not preserved, so they will appear overlapped in the area of the domain chosen for projection. Overlapping is not applicable if projecting along a vector. oneeach - Each face is projected onto a surface in the order in which the face and the surface appear in the input or in their respective groups. cycled - This is the same as One Per Surface, above, but starts the faces again if there are surfaces left.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "All on Each Surface in Sequence",
      "label": "All on Each Surface in Sequence",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "allseq - If projected parametrically, the spatial relationship between the faces will be preserved. For example, if the text \"hello\" is projected parametrically and in sequence, the letters will appear on the surface naturally, side by side. Sequence is not applicable if projecting along a vector. allover - If projected parametrically, the spatial relationship between the faces is not preserved, so they will appear overlapped in the area of the domain chosen for projection. Overlapping is not applicable if projecting along a vector. oneeach - Each face is projected onto a surface in the order in which the face and the surface appear in the input or in their respective groups. cycled - This is the same as One Per Surface, above, but starts the faces again if there are surfaces left.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Method",
      "label": "Method",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "method -  - Select between projecting along a vector or parametrically using the parameters below.\n\n vector - The face is projected along a 3D vector and its image on the surface is converted into a curve on the surface. One spatial curve may generate several profiles depending on its position relative to the surface, the shape of the surface, and the chosen projection side. If the projected face does not intersect the surface at all, no profile curve will be generated. parametric - The spatial size of the faces is mapped directly onto the domain of the spline surface. The resulting projection is sensitive to the parameterization of the surface and is likely to appear distorted. It is, however, the fastest of the two projection types and tends to behave well on surfaces with regular shapes and chord-length parameterizations.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Along Vector",
      "label": "Along Vector",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "vector - The face is projected along a 3D vector and its image on the surface is converted into a curve on the surface. One spatial curve may generate several profiles depending on its position relative to the surface, the shape of the surface, and the chosen projection side. If the projected face does not intersect the surface at all, no profile curve will be generated. parametric - The spatial size of the faces is mapped directly onto the domain of the spline surface. The resulting projection is sensitive to the parameterization of the surface and is likely to appear distorted. It is, however, the fastest of the two projection types and tends to behave well on surfaces with regular shapes and chord-length parameterizations.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Axis",
      "label": "Axis",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "axis -  - The axis along which the four corners of the feature are projected onto the base. When adding the feature from the outside as a Vector paste.\n\n xaxis - Cartesian axis X, Y, or Z. yaxis - Cartesian axis X, Y, or Z. zaxis - Cartesian axis X, Y, or Z. fnorm - Projection axis occurs along each face's normal. Thus, each face could potentially have a different projection direction than the others. The option also works well for non-planar faces. mindist - Projects the entire 3D face along the vectors of minimum distance to the surface. The projection resolution is given by the  value. other - Enables the Vector fields immediately below to specify the X, Y, and Z components of the vector.Note: When the Minimum Distance option is selected, the Side button becomes disabled because it's irrelevant for this projection type.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "X",
      "label": "X",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "xaxis - Cartesian axis X, Y, or Z. yaxis - Cartesian axis X, Y, or Z. zaxis - Cartesian axis X, Y, or Z. fnorm - Projection axis occurs along each face's normal. Thus, each face could potentially have a different projection direction than the others. The option also works well for non-planar faces. mindist - Projects the entire 3D face along the vectors of minimum distance to the surface. The projection resolution is given by the  value. other - Enables the Vector fields immediately below to specify the X, Y, and Z components of the vector.Note: When the Minimum Distance option is selected, the Side button becomes disabled because it's irrelevant for this projection type.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Vector",
      "label": "Vector",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "vector -  - The X, Y, and Z components of the projection vector if none of the main axes is chosen in the Axis parameter above.\n\nvector1 -vector2 -vector3 -",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Side",
      "label": "Side",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "projside -  - Select which sides of the geometry to project on, closest or farthest.\n\n closest - Will project the face onto the closest part of the surface in either direction of projection vector. For example, if a curve being projected onto a tube is inside the tube, it will yield two profiles, one on each side of the tube; if the curve is outside the tube, it will project onto the side closest to it. farthest - The reverse of Closest. In the example above, Farthest would also yield two images if the curve is inside the tube, but it will choose the farthest side if the curve is outside the tube.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Closest",
      "label": "Closest",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "closest - Will project the face onto the closest part of the surface in either direction of projection vector. For example, if a curve being projected onto a tube is inside the tube, it will yield two profiles, one on each side of the tube; if the curve is outside the tube, it will project onto the side closest to it. farthest - The reverse of Closest. In the example above, Farthest would also yield two images if the curve is inside the tube, but it will choose the farthest side if the curve is outside the tube.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Divisions per Span",
      "label": "Divisions per Span",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "sdivs - The number of points to be computed on the spatial face between successive spans. A span is the line connecting two consecutive CVs on a polygon, or the arc between two breakpoints on a spline curve. The projection tends to become more accurate as the number of divisions increases.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Ray Tolerance",
      "label": "Ray Tolerance",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "rtolerance - Controls the precision of the ray intersection with the surface. The ray is cast along the projection vector from every point of the 3-D curve.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Fit Tolerance",
      "label": "Fit Tolerance",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "ftolerance - Controls the 2-D fitting precision and is typically less than 0.01.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Max UV Gap (%)",
      "label": "Max UV Gap (%)",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "uvgap - This specifies what percentage of the size of the surface domain is acceptable for two separate profiles to be joined into a single curve.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Order",
      "label": "Order",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "order - The spline order of the resulting profile curve. The type of curve (Bzier or NURBS) is inherited from the spatial curve. The order, however, is not inherited because the spline order provides useful control over the quality of the fit. If the spatial face is a polygon, the profile will be a NURBS curve.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Preserve Sharp Corners",
      "label": "Preserve Sharp Corners",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "csharp - Controls the precision with which sharp corners in the projection curve are interpolated. It should be on when the projection has areas of high changes in curvature.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Super Accurate Projection",
      "label": "Super Accurate Projection",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "accurate - Use a very accurate yet expensive algebraic pruning algorithm to determine the intersection of the vector with the surface.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "U from",
      "label": "U from",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "ufrom -  - Specifies which of the spatial coordinates - X, Y, or Z - must be mapped to the U parametric direction of the surface.\n\n uvx - uvy - uvz -",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "X Coordinate",
      "label": "X Coordinate",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "uvx - uvy - uvz -",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.535Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "V from",
      "label": "V from",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "vfrom -  - Specifies which of the spatial coordinates - X, Y, or Z - must be mapped to the V parametric direction of the surface.\n\n uvx - uvy - uvz -",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.536Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "X Coordinate",
      "label": "X Coordinate",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "uvx - uvy - uvz -",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.536Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Map Profile to Range:",
      "label": "Map Profile to Range:",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "userange - This option is on by default. It causes the profile to be scaled and translated to fit within the surface's domain ranges described below. If this option is off, the profile's coordinates are mapped onto the surface domain without any transformation; consequently, the profile will not be visible if its points are not inside the domain of the target surface.\nTypically, the projected face should not be mapped to the U/V range if it was previously extracted from the same surface using the Profile SOP with the Parametrically to XY option selected.\t\t\t\nThe extraction and re-projection tandem can be very useful in achieving the modeling goals currently attainable only with 3D curves. Such tasks include the ability to edit the points of a profile, joining, stitching, or filleting profiles together, carving or refining profiles, etc. By extracting a profile parametrically to XY, Touch creates a 3D face that is identical to the 2D profile but has an additional (constant) Z component.\t\t\t\nThe resulting 3D curve can be modeled using all the 3D tools available. Finally, the modeled 3D face can be reapplied onto the surface parametrically, making sure that the range mapping option is off.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.536Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "U Range",
      "label": "U Range",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "urange -  - Indicates in percentages what part of the U surface domain is the mapping area. A full range of 0-1 will cause the profiles to be mapped to the entire domain in the U parametric direction. The range is not restricted to the 0-1 interval.\n\nurange1 -urange2 -",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.536Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "V Range",
      "label": "V Range",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "vrange -  - Indicates in percentages what part of the V surface domain is the mapping area. A full range of 0-1 will cause the profiles to be mapped to the entire domain in the V parametric direction. The range is not restricted to the 0-1 interval.\n\nvrange1 -vrange2 -",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.536Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Mapping Type",
      "label": "Mapping Type",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "maptype -  - Select how to reposition and scale an existing profile to fit within the specified domain range.\n\n unif - Mapping converts the spatial coordinates of the projection faces to (U,V) points in the domain of the surface without taking into account the parameterization of the surface. chordlen - Mapping takes into account the surface parameterization and attempts to compute a projection best suited to the spatial and parametric determinants of the model.If the face is not mapped to range, it's vertices will be transferred to the profile without any transformation. Use this technique together with the parametric extraction in the Profile  to edit the points of a profile generated by a  other than Project: extract, edit the points, then project again.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.536Z",
      "rawData": {},
      "sourceElement": null
    },
    {
      "id": null,
      "name": "Uniform",
      "label": "Uniform",
      "group": "General",
      "page": "",
      "type": "float",
      "dataType": "number",
      "style": "",
      "defaultValue": null,
      "minValue": null,
      "maxValue": null,
      "step": null,
      "menuItems": [],
      "menuLabels": [],
      "allowCustom": false,
      "maxLength": null,
      "pattern": null,
      "isArray": false,
      "arraySize": 1,
      "dimensions": 1,
      "description": "unif - Mapping converts the spatial coordinates of the projection faces to (U,V) points in the domain of the surface without taking into account the parameterization of the surface. chordlen - Mapping takes into account the surface parameterization and attempts to compute a projection best suited to the spatial and parametric determinants of the model.If the face is not mapped to range, it's vertices will be transferred to the profile without any transformation. Use this technique together with the parametric extraction in the Profile  to edit the points of a profile generated by a  other than Project: extract, edit the points, then project again.",
      "tooltip": "",
      "help": "",
      "units": "",
      "examples": [],
      "isReadOnly": false,
      "isAdvanced": false,
      "isHidden": false,
      "isAnimatable": true,
      "isExpression": false,
      "isPython": false,
      "dependsOn": [],
      "affects": [],
      "linkedTo": [],
      "expressionLanguage": "",
      "defaultExpression": "",
      "commonExpressions": [],
      "order": 0,
      "isVisible": true,
      "conditionalDisplay": null,
      "isValid": true,
      "validationErrors": [],
      "lastUpdated": "2025-08-08T00:37:51.536Z",
      "rawData": {},
      "sourceElement": null
    }
  ],
  "parameterGroups": {},
  "codeExamples": [],
  "pythonExamples": [],
  "expressions": [],
  "commonInputs": [],
  "commonOutputs": [],
  "relatedOperators": [],
  "workflowPatterns": [],
  "images": [],
  "videos": [],
  "assets": [],
  "keywords": [
    "project",
    "creates",
    "curves",
    "surface",
    "(also",
    "known",
    "trim",
    "profile",
    "curves)",
    "projecting"
  ],
  "tags": [
    "SOP",
    "TouchDesigner",
    "Project"
  ],
  "searchWeight": 1,
  "contentHash": "",
  "processingDate": "2025-08-08T00:37:51.536Z",
  "processingVersion": "1.0.0",
  "isValid": true,
  "validationErrors": []
}