1"use strict";(globalThis.webpackChunkvrgs_docs_v_3_1=globalThis.webpackChunkvrgs_docs_v_3_1||[]).push([[636],{99333(e,s,n){n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>t,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"trees/data/triangular-meshes","title":"Triangular Meshes","description":"The Triangular Meshes branch of the Data tree \u2014 every right-click command on a mesh, a mesh folder and the branch header, and the seven nodes each mesh carries.","source":"@site/versioned_docs/version-3.4/trees/data/triangular-meshes.md","sourceDirName":"trees/data","slug":"/trees/data/triangular-meshes","permalink":"/docs/trees/data/triangular-meshes","draft":false,"unlisted":false,"editUrl":"https://github.com/vrgeoscience/vrgs_docs_v3/tree/master/versioned_docs/version-3.4/trees/data/triangular-meshes.md","tags":[],"version":"3.4","sidebarPosition":9,"frontMatter":{"id":"triangular-meshes","title":"Triangular Meshes","description":"The Triangular Meshes branch of the Data tree \u2014 every right-click command on a mesh, a mesh folder and the branch header, and the seven nodes each mesh carries.","sidebar_label":"Triangular Meshes","sidebar_position":9},"sidebar":"docs","previous":{"title":"Satellite Images","permalink":"/docs/trees/data/satellite-images"},"next":{"title":"Textures","permalink":"/docs/trees/data/texture-map"}}');var i=n(74848),l=n(28453);const t={id:"triangular-meshes",title:"Triangular Meshes",description:"The Triangular Meshes branch of the Data tree \u2014 every right-click command on a mesh, a mesh folder and the branch header, and the seven nodes each mesh carries.",sidebar_label:"Triangular Meshes",sidebar_position:9},c="Triangular Meshes",d={},h=[{value:"Item Context Menu",id:"item-context-menu",level:2},{value:"Actions",id:"actions",level:3},{value:"Surface Generator submenu",id:"surface-generator-submenu",level:3},{value:"Selection submenu",id:"selection-submenu",level:3},{value:"Quality & Cleanup submenu",id:"quality--cleanup-submenu",level:3},{value:"Transform submenu",id:"transform-submenu",level:3},{value:"Attributes & Analysis submenu",id:"attributes--analysis-submenu",level:3},{value:"Split & Merge submenu",id:"split--merge-submenu",level:3},{value:"Refinement submenu",id:"refinement-submenu",level:3},{value:"Extract submenu",id:"extract-submenu",level:3},{value:"Convert To submenu",id:"convert-to-submenu",level:3},{value:"Intersections submenu",id:"intersections-submenu",level:3},{value:"Textures submenu",id:"textures-submenu",level:3},{value:"Visualization submenu",id:"visualization-submenu",level:3},{value:"Optimization submenu",id:"optimization-submenu",level:3},{value:"Dynamic submenus",id:"dynamic-submenus",level:3},{value:"Experimental (Use With Caution) submenu",id:"experimental-use-with-caution-submenu",level:3},{value:"Group Context Menu",id:"group-context-menu",level:2},{value:"Actions",id:"actions-1",level:3},{value:"Import submenu",id:"import-submenu",level:3},{value:"Create Primitive submenu",id:"create-primitive-submenu",level:3}];function o(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"triangular-meshes",children:"Triangular Meshes"})}),"\n",(0,i.jsxs)(s.p,{children:["Right-click commands for the ",(0,i.jsx)(s.strong,{children:"Triangular Meshes"})," branch of the ",(0,i.jsx)(s.strong,{children:"Data Tree"})," \u2014 the branch header and its folders, and each mesh. Under each mesh are seven nodes with menus of their own: ",(0,i.jsx)(s.a,{href:"/docs/trees/data/mesh-attributes",children:"Attributes"}),", ",(0,i.jsx)(s.a,{href:"/docs/trees/data/graph-network",children:"Graph Networks"}),", ",(0,i.jsx)(s.a,{href:"/docs/trees/data/texture-map",children:"Textures"}),", ",(0,i.jsx)(s.a,{href:"/docs/trees/data/map-overlays",children:"Paint Overlay Layers"}),", ",(0,i.jsx)(s.a,{href:"/docs/trees/data/projective-images",children:"Projective Images"}),", ",(0,i.jsx)(s.a,{href:"/docs/trees/data/photogrammetric-images",children:"Photogrammetric Images"})," and ",(0,i.jsx)(s.a,{href:"/docs/trees/data/tie-points",children:"Tie Points"}),"."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.em,{children:["Source resources: ",(0,i.jsx)(s.code,{children:"IDR_DT_MESH_IT
1EM"}),", ",(0,i.jsx)(s.code,{children:"IDR_DT_MESHGROUP"}),"."]})}),"\n",(0,i.jsx)(s.h2,{id:"item-context-menu",children:"Item Context Menu"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"Right-click a mesh in the Data Tree."})}),"\n",(0,i.jsx)(s.h3,{id:"actions",children:"Actions"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Navigate To"})," \u2014 Navigate to the item in the 3D view ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_POPUP_ITEM_GOTO"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Set As Active"})," \u2014 Activate the current object to access its entended menu. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PCLPOPUP_MAKEACTIVE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Toggle Visibility"})," \u2014 Toggle visibility ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_VISIBILITY_HIDDEN"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Hide (Keep in Memory)"})," \u2014 Stop drawing the mesh without unloading it, so showing it again is instant. Ticked while hidden. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_TOGGLE_HIDDEN"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Re Link"})," \u2014 Re-point this mesh at its source file after the file has been moved or the project relocated. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_RELINKTOPROJECT"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Group"})," \u2014 Group the selected items into a single project tree entry. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PROJEXP_GROUP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Ungroup"})," \u2014 Ungroup the selected group, restoring its contents to the parent. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PROJEXP_UNGROUP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Create Seismic..."})," \u2014 Build a synthetic seismic volume from this surface. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_CREATE_SEISMIC"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Add Test Facies + Impedance..."})," \u2014 Add synthetic facies and acoustic-impedance attributes, for testing the seismic modelling workflow. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_CREATE_TEST_ATTRIBS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Drape Seismic onto Mesh..."})," \u2014 Sample a seismic volume onto this surface. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_DRAPE_SEISMIC"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"M3C2 Comparison..."})," \u2014 Compare this mesh against another with the M3C2 algorithm. See ",(0,i.jsx)(s.a,{href:"/docs/general/meshes-point-clouds/m3c2-comparison",children:"M3C2 Comparison"}),". ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_M3C2_COMPARE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Duplicate"})," \u2014 Create a duplicate copy of this mesh in the project. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_DUPLICATE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Export"})," \u2014 Export this mesh to a file in a chosen format. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_EXPORT"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Reload Original"})," \u2014 Reload the mesh from its original source file, discarding edits. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_RELOADMESH"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Mark As Modified"})," \u2014 Flag this mesh as modified so changes are tracked for saving. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_FLAGASEDITED"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Delete"})," \u2014 Delete this mesh from the project. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_POPUP_ITEM_DELETE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Refresh Object Tree"})," \u2014 Refresh this mesh's entry in the project tree. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_REFRESHTREE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Reveal In Explorer"})," \u2014 Open the folder containing the mesh's source file in Windows Explorer. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_REVEALINFILEEXPLORER"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cancel Operation"})," \u2014 Cancel the operation currently running on this mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_DEFAULTITEM_ENDPROCESS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Rename"})," \u2014 Rename this mesh in the project tree. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ITEM_RENAME"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"surface-generator-submenu",children:"Surface Generator submenu"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsxs)(s.em,{children:["Only shown for surfaces generated from interpretation data (see the\n",(0,i.jsx)(s.a,{href:"/docs/general/fractures-structure/surface-gridding",children:"Surface Gridding guide"}),")."]})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Regenerate"})," \u2014 Re-run the surface generator on the current source interpretation, whatever the ",(0,i.jsx)(s.strong,{children:"Auto Rebuild"})," setting says. Use it after a bulk edit, or after changing a parameter with automatic rebuilding switched off. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_GENERATOR_RUN"}),")"]})]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Paste Orentation"})," \u2014 Re-orient the gridding plane from an orientation on the clipboard (use ",(0,i.jsx)(s.strong,{children:"Copy Orientation"})," on a structural measurement first); useful for steeply dipping surfaces. Greyed out until an orientation is on the clipboard. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_GENERATOR_ORIENT"}),")"]})]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Edit Faults..."})," \u2014 Open the fault dialog to add, remove or re-type the surface's fault definitions, then rebuild. Each fault names its own traces, so a fault trace does not have to live in a particular polyline group. See ",(0,i.jsx)(s.a,{href:"/docs/general/fractures-structure/surface-gridding#faults--breaklines",children:"Faults & breaklines"}),". ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_GENERATOR_EDIT_FAULTS"}),")"]})]}),"\n",(0,i.jsxs)(s.p,{children:["Fault definitions belong to the ",(0,i.jsx)(s.strong,{children:"2.5D kriged grid"})," only, so this entry is\ngreyed out on an implicit (3D) surface \u2014 selecting it there reports ",(0,i.jsx)(s.em,{children:'"Fault\ndefinitions apply to kriged (2.5D grid) surfaces only."'})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["The generator's own parameters \u2014 the gridding method and its settings, ",(0,i.jsx)(s.strong,{children:"Auto\nRebuild"}),", and the read-only ",(0,i.jsx)(s.strong,{children:"Defined Faults"})," and ",(0,i.jsx)(s.strong,{children:"Blocks"})," counts \u2014 are in the\nmesh's property sheet, not on this menu. See the\n",(0,i.jsx)(s.a,{href:"/docs/general/fractures-structure/surface-gridding",children:"Surface Gridding guide"}),"\nand ",(0,i.jsx)(s.a,{href:"/docs/general/fractures-structure/implicit-surfaces",children:"Implicit Surfaces"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"selection-submenu",children:"Selection submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Isolated Triangles"})," \u2014 Select triangles that share no edges with any other triangle. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPE
1RATIONS_SELECTISOLATEDTRIANGLES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Progressive Component Select..."})," \u2014 Split the mesh into disconnected pieces and select them smallest-first with a slider, to delete the fragments a photogrammetric mesh leaves behind. The largest piece is always kept. See ",(0,i.jsx)(s.a,{href:"/docs/general/meshes-point-clouds/model-preparation#progressive-component-select",children:"Preparing a Model for Interpretation"}),". ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_PROGRESSIVE_SELECT"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Inside Visible Polylines"})," \u2014 Select triangles whose centroids fall inside the currently visible polylines. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_SELECTINSIDEVISIBLEPOLYLINES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Overlapping Triangles"})," \u2014 Select triangles that overlap others in the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_SELECTOVERLAP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Deselect All"})," \u2014 Deselect all currently selected triangles. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_DESELECTALL"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Delete Selected"})," \u2014 Delete the currently selected triangles from the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_DELETESELECTED"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Decimate Selected"})," \u2014 Decimate only the selected region of the mesh, preserving detail elsewhere. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_DECIMATESELECTED"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"quality--cleanup-submenu",children:"Quality & Cleanup submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Filters"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Voxel 2D"})," \u2014 Subsample vertices to one per 2D (X-Y) voxel cell. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_POINTCLOUD_FILTERS_VOXEL2D"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Voxel 3D"})," \u2014 Subsample vertices to one per 3D voxel cell. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_POINTCLOUD_FILTERS_VOXEL3D"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Smooth Surface"})," \u2014 Smooth the mesh surface to reduce noise and small irregularities. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_SMOOTH"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Decimate"})," \u2014 Reduce the triangle count using Quadric Error Metric (QEM) decimation. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_DECIMATE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Remove"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Edges Greater Than Length"})," \u2014 Remove triangles whose longest edge exceeds a specified length. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_REMOVEMAXEDGES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Edges Less Than Length"})," \u2014 Remove triangles whose longest edge is shorter than a specified length. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_REMOVEMAXEDGE_LESSTHAN"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Edges From Selected"})," \u2014 Remove long edges within the current selection only. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_REMOVEMAXEDGES_SELECTED"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Degenerate Triangles"})," \u2014 Remove triangles with zero area or coincident vertices. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPE
1RATIONS_REMOVEDEGENERATETRIANGLES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Unused Vertices"})," \u2014 Remove vertices that are not referenced by any triangle. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_REMOVEUNUSEDPOINTS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Duplicate Vertices"})," \u2014 Merge vertices that share the same position into a single vertex. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_REMOVEDUPLICATEPOINTS34111"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Restructure"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Optimize Triangle Angles"})," \u2014 Flip edges to make triangles more equilateral and improve mesh quality. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_CHECKINTERNALANGLES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Relink Connectivity"})," \u2014 Rebuild triangle connectivity from vertex positions. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_RELINKTRIANGLES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Check Orientations"})," \u2014 Check and report inconsistent triangle winding orientations. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_CHECKORIENTATIONS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Remesh Surface"})," \u2014 Remesh the surface to produce a more uniform triangulation. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_RE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Reverse Winding"})," \u2014 Reverse the winding order of all triangles, flipping their facing direction. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_REVERSETRIANGLES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Correct Winding"})," \u2014 Make triangle winding consistent across the whole mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_CORRECTWINDING"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Optimize Structure"})," \u2014 Reorganise the internal mesh layout for faster rendering and processing. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_OPTIMISE_STRUCTURE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Optimize For Textures"})," \u2014 Reorder mesh data to improve texture sampling efficiency. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_RESTRUCTURE_OPTIMISEFORTEXTURES"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Regenerate Vertex Normals"})," \u2014 Recalculate vertex normals from triangle geometry. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_REGENERATENORMALS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Upgrade Format"})," \u2014 Upgrade the mesh to the current internal storage format. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_UPGRADEMESH"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"transform-submenu",children:"Transform submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Scale"})," \u2014 Scale the mesh by a factor along one or more axes. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_SCALE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Rotate"})," \u2014 Rotate the mesh around a chosen axis and pivot point. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_OPERATIONS_ROTATE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Translate"})," \u2014 Translate the mesh by a specified offset. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PROJEXP_TRANSLATE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Remove Dip"})," \u2014 Rotate the mesh so its best-fit plane is horizontal (removes mean dip). ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPE
1RATIONS_REMOVEDIP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Clamp To Boundaries"})," \u2014 Clamp mesh vertices to a bounding box or surface limits. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_TRANSFORMS_CLAMPLIMITS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Swap X and Y Axes"})," \u2014 Swap the X and Y coordinates of all vertices. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_SWAPAXES_SWAPXANDY"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Swap X and Z Axes"})," \u2014 Swap the X and Z coordinates of all vertices. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_SWAPAXES_SWAPXANDZ"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Swap Y and Z Axes"})," \u2014 Swap the Y and Z coordinates of all vertices. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_SWAPAXES_SWAPYANDZ"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Coordinate Conversion"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Between Coordinate Systems (CRS)"})," \u2014 Reproject the mesh from one coordinate reference system to another. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_CONVERTCOORDINATES_CRSTOCRS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Meters to Feet"})," \u2014 Convert vertex coordinates from metres to feet. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PCLPOPUP_CONVERT_METRESTOFEET"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Feet to Meters"})," \u2014 Convert vertex coordinates from feet to metres. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PCLPOPUP_CONVERT_FEETTOMETRES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Suggest UTM Zone"})," \u2014 Suggest a suitable UTM zone for the mesh based on its position. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_CONVERTCOORDINATES_SUGGESTUTMZONE"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Selected Triangles"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Set Z Value"})," \u2014 Set a fixed Z value for the vertices of the selected triangles. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_SELECTEDTRIANGLES_SETZVALUE"}),")"]})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"attributes--analysis-submenu",children:"Attributes & Analysis submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Geometry"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Tensor Analysis"})," \u2014 Compute the moment tensor of triangle orientations to find principal directions. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_TR_TENSORANALYSIS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Coplanarity"})," \u2014 Compute how coplanar each triangle is with its neighbours. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_COPLANARITY"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Elevation"})," \u2014 Store the elevation (Z) of each triangle as a per-triangle attribute. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_TR_ELEVATION"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Range"})," \u2014 Compute the range (distance from a reference) of each triangle. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_TR_RANGE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Dip Angle"})," \u2014 Compute the dip angle of each triangle relative to horizontal. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_TR_DIP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Azimuth"})," \u2014 Compute the dip azimuth (direction of maximum dip) of each triangle. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_TR_AZIMUTH"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Directional Curvature"})," \u2014 Compute surface curvature along a specified direction. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_DIRECTIONALCURVAT"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Triangle Properties"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Area"})," \u2014 Compute the surface area of each triangle. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_TR_AREA"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Maximum Edge Length"})," \u2014 Compute the length of the longest edge of each triangle. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_MAXIMUMEDGELENGTH"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Centroids"})," \u2014 Compute the centroid (geometric centre) of each triangle. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_CENTROIDS"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Statistical"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Fisher K Value"})," \u2014 Compute the Fisher K concentration of triangle orientations over a moving neighbourhood. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_FISHERKVALUE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"P21 Map"})," \u2014 Compute fracture intensity over a search sphere: P21 (trace length per area), plus P32 (area per volume) and P33 (porosity). Prompts for radius, aperture, glyph shape and weighting kernel. See ",(0,i.jsx)(s.a,{href:"/docs/general/fractures-structure/fracture-intensity-mapping",children:"Fracture Intensity Mapping"}),". ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_P21MAP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Radial Basis Function (RBF) Area"})," \u2014 The quick path to the same intensity calculation, prompting only for the search radius (default kernel and glyph settings). See ",(0,i.jsx)(s.a,{href:"/docs/general/fractures-structure/fracture-intensity-mapping",children:"Fracture Intensity Mapping"}),". ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_RBFAREA"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Connected Components"})," \u2014 Identify and label connected components of the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_CONNECTEDCOMPONENTS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Binary Space Partition (BSP) Tree Index"})," \u2014 Assign a BSP tree node index to each triangle for spatial queries. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_BSPTREEINDEX"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Texture Coordinates"})," \u2014 Compute or assign texture (UV) coordinates for the mesh vertices. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_TEXTURECOORDINATES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"2D Convex Hull"})," \u2014 Compute the 2D convex hull of the mesh vertices in plan view. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPE
1RATIONS_CONVEXHULL2D"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Volume"})," \u2014 Compute the volume enclosed by the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_VOLUMECALCULATION"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Color Conversion"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"RGB to Greyscale"})," \u2014 Convert per-vertex RGB to a single greyscale attribute. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_GREYSCALEFROMRGB"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"RGB to XYZ Colorspace"})," \u2014 Convert per-vertex RGB to CIE XYZ colour space. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_COLOURSPACE_RGBCHANNELSTOXYZ"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"RGB to LAB Colorspace"})," \u2014 Convert per-vertex RGB to CIE LAB colour space. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_COLOURSPACE_RGBCHANNELSTOLAB"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"RGB to HSV Colorspace"})," \u2014 Convert per-vertex RGB to HSV colour space. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_COLOURSPACE_RGBCHANNELSTOHSV"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"RGB From Texture"})," \u2014 Sample the assigned texture to set a per-vertex RGB attribute. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_RGBFROMTEXTURE"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Classification"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Between Surfaces"})," \u2014 Classify triangles by their position between two reference surfaces. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_CLASSIFY_BETWEENSURFACES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Discrete From Filter"})," \u2014 Create a discrete (classified) attribute from a filter expression. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_DISCRETECLASSIFYFROMFILTER"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Calculator"})," \u2014 Open the attribute calculator to derive new attributes from expressions. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_CALCULATOR"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Inverse Distance Weighting (IDW)"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"From Visible Polylines"})," \u2014 Interpolate an attribute from the visible polylines onto the mesh using inverse distance weighting. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_IDW_FROMDISPLAYEDPOLYLINES"}),")"]})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"split--merge-submenu",children:"Split & Merge submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Split By Axis"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Along X"})," \u2014 Split the mesh into two parts along a plane perpendicular to X. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_SPLIT_ALONGX"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Along Y"})," \u2014 Split the mesh into two parts along a plane perpendicular to Y. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_SPLIT_ALONGY"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Along Z"})," \u2014 Split the mesh into two parts along a plane perpendicular to Z. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_SPLIT_ALONGZ"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Merge"})," \u2014 Merge this mesh with one or more selected meshes into a single object. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_MERGE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Conform Below Surface..."})," \u2014 Adjust the mesh elevation to conform below an underlying surface. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_CONFORM_ELEVATION"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"refinement-submenu",children:"Refinement submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Tessellate Inner"})," \u2014 Subdivide each triangle by inserting a vertex at its centroid. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_REFINEMESH_TESSELATEINNER"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Tessellate Outer"})," \u2014 Subdivide each triangle by inserting vertices on its edges. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_REFINEMESH_TESSELATEOUTER"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Tessellate Both"})," \u2014 Subdivide each triangle with both centroid and edge vertex insertion. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_REFINEMESH_TESSELATEBOTH"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"extract-submenu",children:"Extract submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Free Edge Vertices"})," \u2014 Extract vertices that lie on the free (open) boundary of the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPE
1RATIONS_EXTRACTFREEEDGEPOINTS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Free Edge Polylines"})," \u2014 Extract polylines tracing the free (open) boundary of the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_EXTRACTFREEEDGEPOLYLINES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Contour Lines"})," \u2014 Generate contour polylines from the mesh at specified elevations. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_CREATECONTOURSET"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Decompose Into Patches"})," \u2014 Decompose the mesh into approximately planar patches based on orientation. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_ATTRIBUTES_PATCHDECOMOSITION"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Smart Swarm"})," \u2014 Use AI-assisted swarm clustering to extract feature patches from the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_AI_SMARTSWARM"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Extract Polylines"})," \u2014 Use AI to extract polylines from features detected on the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_AI_EXTRACT_POLYLINES"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"convert-to-submenu",children:"Convert To submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Point Cloud"})," \u2014 Convert this mesh into a point cloud using its vertices. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_CONVERTTOPOINTCLOUD"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Tiles"})," \u2014 Convert this mesh into a tiled mesh for efficient streaming and rendering. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_CONVERTTOTILES"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Signed Distance Field (SDF)"})," \u2014 Build a signed distance field representation of the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_CREATESDFMAP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Metadata Grid"})," \u2014 Build a 2D grid of metadata attributes sampled from the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_METAGRID"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"intersections-submenu",children:"Intersections submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cut With Surface"})," \u2014 Cut this mesh along its intersection with another surface. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_INTERSECTIONS_CUT"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"textures-submenu",children:"Textures submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Bake to Vertices"})," \u2014 Bake the assigned texture colour into per-vertex RGB values. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPERATIONS_BAKETEXTURE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Import"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Texture Map"})," \u2014 Import a texture image and map it onto the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_IMPORT_TEXTUREMAP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Height Map"})," \u2014 Import a height map image to displace the mesh vertices. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_IMPORT_HEIGHTMAP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"OPF Project File"})," \u2014 Import a Pix4D OPF project file containing cameras and tie points. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_IMPORT_OPF"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cylindrical Projection (Planetocentric)"})," \u2014 Import a planetocentric cylindrical projection image as a texture. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_IMPORT_CYLINDRICALPROJECTION"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Pixel Size"})," \u2014 Compute the ground pixel size of the texture across the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_TEXTURES_PIXELSIZE"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"visualization-submenu",children:"Visualization submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"False Color"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"By Elevation"})," \u2014 Display the mesh with a false-colour ramp coloured by elevation. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_FALSECOLOUR_ELEVATION"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"By Attribute"})," \u2014 Display the mesh with a false-colour ramp coloured by a chosen attribute. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_FALSECOLOUR_ATTRIBUTE"}),")"]})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"optimization-submenu",children:"Optimization submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Level of Detail (LOD)"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Generate"})," \u2014 Generate level-of-detail layers for adaptive rendering at varying distances. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_MESH_CREATELODLAYERS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Remove"})," \u2014 Remove previously generated level-of-detail layers from the mesh. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_LEVELOFDETAIL_REMOVELOD"}),")"]})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Rebuild Partition Tree"})," \u2014 Rebuild the spatial partition tree used for fast queries and rendering. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OPE
1RATIONS_REGENERATEPARTITIONTREE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Load Into Memory"})," \u2014 Load the entire mesh into memory for faster access at the cost of RAM. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_OBJECTS_MAKERESIDENT"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"dynamic-submenus",children:"Dynamic submenus"}),"\n",(0,i.jsx)(s.p,{children:"These are built from what the project currently holds, so they appear only when\nthere is something for them to list."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Texture Map"})," \u2014 the ortho images near this mesh, by distance; pick one to texture the mesh with it."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Difference Map"})," \u2014 every other mesh currently in memory; pick one to compute a vertical difference map against it. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PCLPOPUP_MESHLIST_START\u2026"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cut Along"})," \u2014 the visible log picks; pick one to cut the mesh along it. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_INTERSECT_PL_LIST\u2026"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"transforms"})," \u2014 the project's saved coordinate transforms; pick one to apply it. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PCLPOPUP_TRANSFORMS_START\u2026"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Debug Menu"})," \u2014 developer diagnostics: Fractal Dimension, Cartesian to Spherical, Spherical To Cartesian, Node Position Attribute, Randomise Position, Un-Index, Texture Index 2 Attribute, Add Debug Shader."]}),"\n",(0,i.jsxs)(s.li,{children:["Any menu items contributed by installed ",(0,i.jsx)(s.strong,{children:"plugins"})," are appended at the end."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"experimental-use-with-caution-submenu",children:"Experimental (Use With Caution) submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Slip Potential Analysis"})," \u2014 Experimental: compute slip and dilation tendency on the surface relative to a stress field. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_EXPERIMENTAL_SLIPPOTENTIAL"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Gravity Effects"})," \u2014 Experimental: estimate gravity-related effects derived from the mesh geometry. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_DEVELOPMENT_GRAVITY"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Slope Stability"})," \u2014 Experimental: assess slope stability across the mesh surface. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_EXPERIMENTAL_SLOPESTABILITY"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"group-context-menu",children:"Group Context Menu"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.em,{children:"Right-click the Triangular Meshes parent group / list header in the Data Tree."})}),"\n",(0,i.jsx)(s.h3,{id:"actions-1",children:"Actions"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"New Group"})," \u2014 Create a new object based for this type ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_GROUPPOPUP_NEW"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Group"})," \u2014 Group the selected items into a single project tree entry. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PROJEXP_GROUP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Ungroup"})," \u2014 Ungroup the selected group, restoring its contents to the parent. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PROJEXP_UNGROUP"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Export"})," \u2014 Export ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_GROUPPOPUP_EXPORT"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Clear All Items"})," \u2014 Clear all items ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_GROUPPOPUP_EMPTYLIST"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Fix Tie Points"})," ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"UNUSED_ID_MESHGROUP_FIXTIEPOINTS"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Use Own Display Properties"})," \u2014 Let this group carry its own display settings instead of inheriting the parent's. ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_GROUP_USE_OWN_DISPLAY_PROPS"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"import-submenu",children:"Import submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"From File..."})," \u2014 From File ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_GROUPPOPUP_IMPORT"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Scan Folder (OBJ Files)"})," \u2014 Import scan folder (obj files) ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_IMPORT_SCANFOLDER"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"From Sketchfab"})," \u2014 Import from sketchfab ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_IMPORT_IMPORTFROMSKETCHFAB"}),")"]})]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"create-primitive-submenu",children:"Create Primitive submenu"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Sphere"})," \u2014 Sphere ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PRIMATIVES_SPHERE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Hemisphere"})," \u2014 Hemisphere ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PRIMATIVES_HEMISPHERE"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cylinder"})," \u2014 Cylinder ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_PRIMATIVES_CYLINDER"}),")"]})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Clipmap Mesh"})," \u2014 Clipmap Mesh ",(0,i.jsxs)(s.em,{children:["(",(0,i.jsx)(s.code,{children:"ID_DEBUG_CREATECLIPMAPMESH"}),")"]})]}),"\n"]})]})}function a(e={}){const{wrapper:s}={...(0,l.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},28453(e,s,n){n.d(s,{R:()=>t,x:()=>c});var r=n(96540);const i={},l=r.createContext(i);function t(e){const s=r.useContext(l);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(l.Provider,{value:s},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.