-
Notifications
You must be signed in to change notification settings - Fork 329
/
cmdSampleDrawBrep.cpp
146 lines (122 loc) · 4.12 KB
/
cmdSampleDrawBrep.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "stdafx.h"
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
// BEGIN SampleDrawBrepConduit display conduit
//
class CSampleDrawBrepConduit : public CRhinoDisplayConduit
{
public:
CSampleDrawBrepConduit(const CRhinoDoc& doc);
~CSampleDrawBrepConduit() = default;
void SetBreps(const ON_SimpleArray<const ON_Brep*>& breps);
bool ExecConduit(CRhinoDisplayPipeline& dp, UINT nActiveChannel, bool& bTerminateChannel) override;
private:
const CRhinoDoc& m_doc;
ON_SimpleArray<const ON_Brep*> m_breps;
};
CSampleDrawBrepConduit::CSampleDrawBrepConduit(const CRhinoDoc& doc)
: CRhinoDisplayConduit(CSupportChannels::SC_CALCBOUNDINGBOX | CSupportChannels::SC_PREDRAWOBJECTS)
, m_doc(doc)
{
}
void CSampleDrawBrepConduit::SetBreps(const ON_SimpleArray<const ON_Brep*>& breps)
{
m_breps.Empty();
m_breps.Append(breps.Count(), breps.Array());
}
bool CSampleDrawBrepConduit::ExecConduit(CRhinoDisplayPipeline& dp, UINT nActiveChannel, bool& bTerminateChannel)
{
if (nActiveChannel == CSupportChannels::SC_CALCBOUNDINGBOX)
{
ON_BoundingBox bbox;
for (int i = 0; i < m_breps.Count(); i++)
{
if (nullptr != m_breps[i])
m_breps[i]->GetTightBoundingBox(bbox, true);
m_pChannelAttrs->m_BoundingBox.Union(bbox);
}
}
else if (nActiveChannel == CSupportChannels::SC_PREDRAWOBJECTS)
{
const CDisplayPipelineAttributes* attributes = dp.DisplayAttrs();
if (nullptr != attributes && attributes->m_bShadeSurface)
{
CDisplayPipelineMaterial material = *attributes->m_pMaterial;
dp.SetupDisplayMaterial(material, &m_doc, nullptr);
for (int i = 0; i < m_breps.Count(); i++)
{
if (nullptr != m_breps[i])
dp.DrawShadedBrep(m_breps[i], &material, nullptr);
}
}
ON_Color color = RhinoApp().AppSettings().ActiveLayerColor();
for (int i = 0; i < m_breps.Count(); i++)
{
if (nullptr != m_breps[i])
dp.DrawBrep(m_breps[i], color, 1, false, nullptr);
}
}
return true;
}
//
// END SampleDrawBrepConduit display conduit
//
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//
// BEGIN SampleDrawBrep command
//
#pragma region SampleDrawBrep command
class CCommandSampleDrawBrep : public CRhinoCommand
{
public:
CCommandSampleDrawBrep() = default;
UUID CommandUUID() override
{
// {5287211C-2494-47FF-B37E-48E8A536C08A}
static const GUID SampleDrawBrepCommand_UUID =
{ 0x5287211C, 0x2494, 0x47FF, { 0xB3, 0x7E, 0x48, 0xE8, 0xA5, 0x36, 0xC0, 0x8A } };
return SampleDrawBrepCommand_UUID;
}
const wchar_t* EnglishCommandName() override { return L"SampleDrawBrep"; }
CRhinoCommand::result RunCommand(const CRhinoCommandContext& context) override;
};
// The one and only CCommandSampleDrawBrep object
static class CCommandSampleDrawBrep theSampleDrawBrepCommand;
CRhinoCommand::result CCommandSampleDrawBrep::RunCommand(const CRhinoCommandContext& context)
{
ON_Sphere sphere;
CArgsRhinoGetSphere args;
CRhinoCommand::result rc = RhinoGetSphere(args, sphere);
if (rc != CRhinoCommand::success)
return rc;
ON_RevSurface* sphere_srf = sphere.RevSurfaceForm(true);
if (nullptr == sphere_srf)
return CRhinoCommand::failure;
ON_Brep* brep = ON_Brep::New();
brep->Create(sphere_srf);
ON_SimpleArray<const ON_Brep*> breps;
breps.Append(brep);
CSampleDrawBrepConduit conduit(context.m_doc);
conduit.SetBreps(breps);
conduit.Enable(context.m_doc.RuntimeSerialNumber());
context.m_doc.Regen();
CRhinoGetString gs;
gs.SetCommandPrompt(L"Press <Enter> to continue");
gs.AcceptNothing();
gs.GetString();
conduit.Disable();
context.m_doc.Redraw();
delete brep; // Don't leak...
brep = nullptr;
return CRhinoCommand::success;
}
#pragma endregion
//
// END SampleDrawBrep command
//
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////