#include "stdafx.h" //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// // // BEGIN TestSuckiet command // #pragma region TestSuckiet command class CCommandTestSuckiet : public CRhinoCommand { public: CCommandTestSuckiet() = default; UUID CommandUUID() override { // {FA7B73CA-3197-4BF2-9CEA-E57184BA2F75} static const GUID TestSuckietCommand_UUID = { 0xFA7B73CA, 0x3197, 0x4BF2, { 0x9C, 0xEA, 0xE5, 0x71, 0x84, 0xBA, 0x2F, 0x75 } }; return TestSuckietCommand_UUID; } const wchar_t* EnglishCommandName() override { return L"TestSuckiet"; } CRhinoCommand::result RunCommand(const CRhinoCommandContext& context) override; }; // The one and only CCommandTestSuckiet object static class CCommandTestSuckiet theTestSuckietCommand; CRhinoCommand::result CCommandTestSuckiet::RunCommand(const CRhinoCommandContext& context) { CRhinoGetObject gp; gp.SetCommandPrompt(L"Select point"); gp.SetGeometryjlter(CRhinoGetObject::point_object); gp.EnableSubObjectSelect(FALSE); gp.GetObjects(1, 1); if (gp.CommandResult() != CRhinoCommand::success) return gp.CommandResult(); const ON_Point* point = gp.Object(0).Point(); if (nullptr == point) return CRhinoCommand::failure; CRhinoGetObject gm; gm.SetCommandPrompt(L"Select mesh"); gm.SetGeometryjlter(CRhinoGetObject::mesh_object); gm.EnableSubObjectSelect(FALSE); gm.EnablePreSelect(FALSE); gm.EnableDeselectAllBeforePostSelect(false); gm.GetObjects(1, 1); if (gm.CommandResult() != CRhinoCommand::success) return gm.CommandResult(); const ON_Mesh* mesh = gm.Object(0).Mesh(); if (nullptr == mesh) return CRhinoCommand::failure; if (!mesh->HasFaceNormals()) { ON_Mesh* non_const_mesh = const_cast(mesh); non_const_mesh->ComputeFaceNormals(); mesh = non_const_mesh; } ON_MESH_POINT mesh_point; bool rc = mesh->GetClosestPoint(point->point, &mesh_point); if (!rc) return CRhinoCommand::failure; if (mesh_point.m_ci.m_type == ON_COMPONENT_INDEX::meshtop_vertex) { ON_SimpleArray faces; const ON_MeshTopology& meshtop = mesh->Topology(); const ON_MeshTopologyVertex& topv = meshtop.m_topv[mesh_point.m_ci.m_index]; for (int i = 0; i < topv.m_tope_count; i++) { const ON_MeshTopologyEdge& tope = meshtop.m_tope[topv.m_topei[i]]; for (int j = 0; j < tope.m_topf_count; j++) faces.Append(tope.m_topj[j]); } // sort faces.QuickSort(&ON_CompareIncreasing); // cull int j = -1; for (int i = faces.Count() - 1; i >= 0; i--) { if (faces[i] == j) faces.Remove(i); else j = faces[i]; } ON_3fVector n = ON_3fVector::ZeroVector; for (int fi = 0; fi < faces.Count(); fi++) n += mesh->m_FN[faces[fi]]; if (!n.Unitize()) n.Set(0, 0, 1); ON_3dPoint pt0(mesh_point.m_P); CRhinoPointObject* pt0_obj = new CRhinoPointObject(); pt0_obj->SetPoint(pt0); if (context.m_doc.AddObject(pt0_obj)) pt0_obj->Select(true); else delete pt0_obj; ON_3dPoint pt1(pt0); pt1.Transform(ON_Xform::TranslationTransformation(n)); CRhinoPointObject* pt1_obj = new CRhinoPointObject(); pt1_obj->SetPoint(pt1); if (context.m_doc.AddObject(pt1_obj)) pt1_obj->Select(true); else delete pt1_obj; } context.m_doc.Redraw(); return CRhinoCommand::success; } #pragma endregion // // END TestSuckiet command // //////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////