Skip to content

Commit b82e77d

Browse files
committed
Nested Components added
1 parent 1b6126f commit b82e77d

File tree

6 files changed

+111
-33
lines changed

6 files changed

+111
-33
lines changed

SketchUp/SketchUpNET/SketchUpForDynamo/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("1.2.0.0")]
36-
[assembly: AssemblyFileVersion("1.2.0.0")]
35+
[assembly: AssemblyVersion("1.3.0.0")]
36+
[assembly: AssemblyFileVersion("1.3.0.0")]

SketchUp/SketchUpNET/SketchUpForDynamo/SketchUp.cs

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public static Dictionary<string, object> LoadModel(string path, bool includeMesh
8888
/// SketchUp Component Instance Data
8989
/// </summary>
9090
/// <param name="instance">SketchUp Component Instance</param>
91-
[MultiReturn(new[] { "Surfaces","Curves","Meshes","Edges", "Position", "Scale", "Name", "Parent Name" })]
91+
[MultiReturn(new[] { "Surfaces","Curves","Instances","Meshes","Edges", "Position", "Scale", "Name", "Parent Name" })]
9292
public static Dictionary<string, object> GetInstance(Instance instance)
9393
{
9494
List<Autodesk.DesignScript.Geometry.Surface> surfaces = new List<Autodesk.DesignScript.Geometry.Surface>();
@@ -98,31 +98,69 @@ public static Dictionary<string, object> GetInstance(Instance instance)
9898

9999
Autodesk.DesignScript.Geometry.Point p = Autodesk.DesignScript.Geometry.Point.ByCoordinates(instance.Transformation.X, instance.Transformation.Y, instance.Transformation.Z);
100100

101-
foreach (Surface srf in instance.Parent.Surfaces)
101+
Component parent = instance.Parent as Component;
102+
103+
foreach (Surface srf in parent.Surfaces)
102104
{
103105
surfaces.Add(srf.ToDSGeo(instance.Transformation));
104106
if (srf.FaceMesh != null)
105107
meshes.Add(srf.FaceMesh.ToDSGeo(instance.Transformation));
106108
}
107-
foreach (Curve c in instance.Parent.Curves)
109+
foreach (Curve c in parent.Curves)
108110
curves.Add(c.ToDSGeo(instance.Transformation));
109-
foreach (Edge e in instance.Parent.Edges)
111+
foreach (Edge e in parent.Edges)
110112
edges.Add(e.ToDSGeo(instance.Transformation));
111113

112114
return new Dictionary<string, object>
113115
{
114116
{ "Surfaces", surfaces },
115117
{ "Curves", curves },
118+
{ "Instances", parent.Instances },
116119
{ "Meshes", meshes },
117120
{ "Edges", edges },
118121
{ "Position", p },
119122
{ "Scale", instance.Transformation.Scale },
120123
{ "Name", instance.Name },
121-
{ "Parent Name", instance.Parent.Name }
124+
{ "Parent Name", parent.Name }
122125

123126
};
124127
}
125128

129+
/// <summary>
130+
/// Flatten Instances
131+
/// </summary>
132+
/// <param name="instances"></param>
133+
/// <returns>All Geometries</returns>
134+
public static List<Autodesk.DesignScript.Geometry.Geometry> FlattenInstances(List<Instance> instances)
135+
{
136+
List<Autodesk.DesignScript.Geometry.Geometry> data = new List<Autodesk.DesignScript.Geometry.Geometry>();
137+
138+
foreach (Instance instance in instances)
139+
FlattenInstance(instance, ref data);
140+
141+
return data;
142+
}
143+
144+
private static void FlattenInstance(Instance instance, ref List<Autodesk.DesignScript.Geometry.Geometry> data)
145+
{
146+
Autodesk.DesignScript.Geometry.Point p = Autodesk.DesignScript.Geometry.Point.ByCoordinates(instance.Transformation.X, instance.Transformation.Y, instance.Transformation.Z);
147+
148+
Component parent = instance.Parent as Component;
149+
150+
foreach (Surface srf in parent.Surfaces)
151+
data.Add(srf.ToDSGeo(instance.Transformation));
152+
153+
foreach (Curve c in parent.Curves)
154+
{
155+
var curves = c.ToDSGeo(instance.Transformation);
156+
foreach (var curve in curves)
157+
data.Add(curve);
158+
}
159+
160+
foreach (Edge e in parent.Edges)
161+
data.Add(e.ToDSGeo(instance.Transformation));
162+
}
163+
126164
/// <summary>
127165
/// Write SketchUp Model
128166
/// </summary>
@@ -260,21 +298,25 @@ public static Autodesk.DesignScript.Geometry.Mesh ToDSGeo(this SketchUpNET.Mesh
260298
[IsVisibleInDynamoLibrary(false)]
261299
public static Autodesk.DesignScript.Geometry.Surface ToDSGeo(this SketchUpNET.Surface v, Transform t = null)
262300
{
263-
List<Autodesk.DesignScript.Geometry.Curve> curves = new List<Autodesk.DesignScript.Geometry.Curve>();
264-
foreach (Edge c in v.OuterEdges.Edges) curves.Add(c.ToDSGeo(t).ToNurbsCurve());
265-
int a = 0;
266-
Autodesk.DesignScript.Geometry.PolyCurve pc = Autodesk.DesignScript.Geometry.PolyCurve.ByJoinedCurves(curves);
267-
Autodesk.DesignScript.Geometry.Surface s = Autodesk.DesignScript.Geometry.Surface.ByPatch(pc);
268-
269-
List<Autodesk.DesignScript.Geometry.Surface> inner = v.InnerLoops(t);
270-
271-
foreach(Autodesk.DesignScript.Geometry.Surface srf in inner)
301+
try
272302
{
273-
Autodesk.DesignScript.Geometry.Geometry[] geo = s.Split(srf);
274-
if (geo.Count() == 2) s = (Autodesk.DesignScript.Geometry.Surface)geo[0];
303+
List<Autodesk.DesignScript.Geometry.Curve> curves = new List<Autodesk.DesignScript.Geometry.Curve>();
304+
foreach (Edge c in v.OuterEdges.Edges) curves.Add(c.ToDSGeo(t).ToNurbsCurve());
305+
int a = 0;
306+
Autodesk.DesignScript.Geometry.PolyCurve pc = Autodesk.DesignScript.Geometry.PolyCurve.ByJoinedCurves(curves);
307+
Autodesk.DesignScript.Geometry.Surface s = Autodesk.DesignScript.Geometry.Surface.ByPatch(pc);
308+
309+
List<Autodesk.DesignScript.Geometry.Surface> inner = v.InnerLoops(t);
275310

311+
foreach (Autodesk.DesignScript.Geometry.Surface srf in inner)
312+
{
313+
Autodesk.DesignScript.Geometry.Geometry[] geo = s.Split(srf);
314+
if (geo.Count() == 2) s = (Autodesk.DesignScript.Geometry.Surface)geo[0];
315+
316+
}
317+
return s;
276318
}
277-
return s;
319+
catch { return null; }
278320
}
279321

280322
[IsVisibleInDynamoLibrary(false)]

SketchUp/SketchUpNET/SketchUpNET/Component.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SO
3535
#include "edge.h"
3636
#include "curve.h"
3737
#include "utilities.h"
38-
38+
#include "Transform.h"
39+
#include "Instance.h"
3940

4041

4142
#pragma once
@@ -52,18 +53,20 @@ namespace SketchUpNET
5253
System::String^ Name;
5354
System::String^ Description;
5455
List<Surface^>^ Surfaces;
56+
List<Instance^>^ Instances;
5557
System::String^ Guid;
5658
List<Curve^>^ Curves;
5759
List<Edge^>^ Edges;
5860

59-
Component(System::String^ name, System::String^ guid, List<Surface^>^ surfaces, List<Curve^>^ curves, List<Edge^>^ edges, System::String^ desc)
61+
Component(System::String^ name, System::String^ guid, List<Surface^>^ surfaces, List<Curve^>^ curves, List<Edge^>^ edges, List<Instance^>^ instances, System::String^ desc)
6062
{
6163
this->Name = name;
6264
this->Surfaces = surfaces;
6365
this->Guid = guid;
6466
this->Curves = curves;
6567
this->Edges = edges;
6668
this->Description = desc;
69+
this->Instances = instances;
6770
};
6871

6972
Component(){};
@@ -92,9 +95,12 @@ namespace SketchUpNET
9295
List<Surface^>^ surfaces = Surface::GetEntitySurfaces(entities, includeMeshes, materials);
9396
List<Curve^>^ curves = Curve::GetEntityCurves(entities);
9497
List<Edge^>^ edges = Edge::GetEntityEdges(entities);
95-
//List<Instance^>^ instances = Instance::GetEntityInstances(entities);
98+
List<Instance^>^ instances = Instance::GetEntityInstances(entities);
99+
100+
101+
96102

97-
Component^ v = gcnew Component(Utilities::GetString(name), Utilities::GetString(guid), surfaces, curves, edges, Utilities::GetString(desc));
103+
Component^ v = gcnew Component(Utilities::GetString(name), Utilities::GetString(guid), surfaces, curves, edges,instances, Utilities::GetString(desc));
98104

99105
return v;
100106
};

SketchUp/SketchUpNET/SketchUpNET/Instance.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SO
3333
#include <msclr/marshal.h>
3434
#include <vector>
3535
#include "transform.h"
36-
#include "component.h"
36+
#include "Utilities.h"
3737

3838

3939
#pragma once
@@ -49,20 +49,22 @@ namespace SketchUpNET
4949
public:
5050
System::String^ Name;
5151
Transform^ Transformation;
52-
Component^ Parent;
52+
String^ ParentID;
5353
System::String^ Guid;
54+
System::Object^ Parent;
5455

55-
Instance(System::String^ name, System::String^ guid, Component^ parent, Transform^ transformation)
56+
Instance(System::String^ name, System::String^ guid, String^ parent, Transform^ transformation)
5657
{
5758
this->Name = name;
5859
this->Transformation = transformation;
59-
this->Parent = parent;
60+
this->ParentID = parent;
6061
this->Guid = guid;
6162
};
6263

64+
6365
Instance(){};
6466
internal:
65-
static Instance^ FromSU(SUComponentInstanceRef comp, Dictionary<String^, Component^>^ components)
67+
static Instance^ FromSU(SUComponentInstanceRef comp)
6668
{
6769
SUStringRef name = SU_INVALID;
6870
SUStringCreate(&name);
@@ -83,7 +85,7 @@ namespace SketchUpNET
8385
SUComponentDefinitionGetGuid(definition, &guid);
8486
System::String^ guidstring = SketchUpNET::Utilities::GetString(guid);
8587

86-
Component^ parent = components[guidstring];
88+
String^ parent = guidstring;
8789

8890

8991
SUTransformation transform = SU_INVALID;
@@ -94,7 +96,7 @@ namespace SketchUpNET
9496

9597
return v;
9698
};
97-
static List<Instance^>^ GetEntityInstances(SUEntitiesRef entities, Dictionary<String^, Component^>^ components)
99+
static List<Instance^>^ GetEntityInstances(SUEntitiesRef entities)
98100
{
99101
List<Instance^>^ instancelist = gcnew List<Instance^>();
100102

@@ -108,7 +110,7 @@ namespace SketchUpNET
108110
SUEntitiesGetInstances(entities, instanceCount, &instances[0], &instanceCount);
109111

110112
for (size_t i = 0; i < instanceCount; i++) {
111-
Instance^ inst = Instance::FromSU(instances[i], components);
113+
Instance^ inst = Instance::FromSU(instances[i]);
112114
instancelist->Add(inst);
113115
}
114116

SketchUp/SketchUpNET/SketchUpNET/SketchUpNET.cpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SO
3737
#include "Layer.h"
3838
#include "Group.h"
3939
#include "Instance.h"
40+
#include "Component.h"
4041

4142
#pragma once
4243

@@ -197,7 +198,21 @@ namespace SketchUpNET
197198
Surfaces = Surface::GetEntitySurfaces(entities, includeMeshes, Materials);
198199
Curves = Curve::GetEntityCurves(entities);
199200
Edges = Edge::GetEntityEdges(entities);
200-
Instances = Instance::GetEntityInstances(entities, Components);
201+
Instances = Instance::GetEntityInstances(entities);
202+
203+
for each (Instance^ var in Instances)
204+
{
205+
if (Components->ContainsKey(var->ParentID))
206+
{
207+
System::Object^ o = Components[var->ParentID];
208+
var->Parent = o;
209+
}
210+
}
211+
212+
for each (KeyValuePair<String^, Component^>^ cmp in Components)
213+
{
214+
FixRefs(cmp->Value);
215+
}
201216

202217

203218
SUModelRelease(&model);
@@ -270,7 +285,20 @@ namespace SketchUpNET
270285
return true;
271286
}
272287

273-
288+
private:
289+
void FixRefs(Component^ comp)
290+
{
291+
for each (Instance^ var in comp->Instances)
292+
{
293+
if (Components->ContainsKey(var->ParentID))
294+
{
295+
System::Object^ o = Components[var->ParentID];
296+
var->Parent = o;
297+
298+
FixRefs(Components[var->ParentID]);
299+
}
300+
}
301+
}
274302

275303

276304
};
0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)