1、可以从族实例中获得面、获得边、获得线、获得点,方法如下
using
System
;
using
System
.
Collections
.
Generic
;
using
System
.
Linq
;
using
System
.
Text
;
using
System
.
Threading
.
Tasks
;
using
Autodesk
.
Revit
.
UI
;
using
Autodesk
.
Revit
.
DB
;
using
Autodesk
.
Revit
.
UI
.
Selection
;
using
Autodesk
.
Revit
.
ApplicationServices
;
namespace
从族实例中获得几何信息
{
[
Autodesk
.
Revit
.
Attributes
.
Transaction
(
Autodesk
.
Revit
.
Attributes
.
TransactionMode
.
Manual
)]
[
Autodesk
.
Revit
.
Attributes
.
Journaling
(
Autodesk
.
Revit
.
Attributes
.
JournalingMode
.
NoCommandData
)]
[
Autodesk
.
Revit
.
Attributes
.
Regeneration
(
Autodesk
.
Revit
.
Attributes
.
RegenerationOption
.
Manual
)]
public
class
Class1
:
IExternalCommand
{
public
Result
Execute
(
ExternalCommandData
commandData
,
ref
string
message
,
ElementSet
elements
)
{
Document
revitDoc
=
commandData
.
Application
.
ActiveUIDocument
.
Document
;
//取得文档
Application
revitApp
=
commandData
.
Application
.
Application
;
//取得应用程序
UIDocument
uiDoc
=
commandData
.
Application
.
ActiveUIDocument
;
Selection
sel
=
uiDoc
.
Selection
;
Reference
ref1
=
sel
.
PickObject
(
ObjectType
.
Element
,
"选择一个族实例"
);
Element
elem
=
revitDoc
.
GetElement
(
ref1
);
FamilyInstance
familyInstance
=
elem
as
FamilyInstance
;
Options
opt
=
new
Options
();
opt
.
ComputeReferences
=
true
;
opt
.
DetailLevel
=
ViewDetailLevel
.
Fine
;
GeometryElement
e
=
familyInstance
.get_Geometry(
opt
);
foreach
(
GeometryObject
obj
in
e
)
{
GeometryInstance
geoInstance
=
obj
as
GeometryInstance
;
GeometryElement
geoElement
=
geoInstance
.
GetInstanceGeometry
();
Transform
insTransform
=
geoInstance
.
Transform
;
foreach
(
GeometryObject
obj2
in
geoElement
)
{
Solid
solid2
=
obj2
as
Solid
;
if
(
solid2
.
Faces
.
Size
> 0)
{
//FindBottomFace(solid2);
//FindEdge(solid2);
//FindLine(solid2);
//FindPoint(solid2);
transformPointAndUaPoint
(
solid2
,
insTransform
);
TaskDialog
.
Show
(
"呵呵"
,
"在这里"
);
}
}
}
return
Result
.
Succeeded
;
}
///
///
得到最底下的边的面积和原点坐标
///
///
Face
FindBottomFace
(
Solid
solid
)
{
PlanarFace
pf
=
null
;
foreach
(
Face
face
in
solid
.
Faces
)
{
pf
=
face
as
PlanarFace
;
if
(
null
!=
pf
)
{
if
(
Math
.
Abs
(
pf
.
FaceNormal
.
X
) < 0.01 &&
Math
.
Abs
(
pf
.
FaceNormal
.
Y
) < 0.01 &&
pf
.
FaceNormal
.
Z
< 0)
{
TaskDialog
.
Show
(
"Wall Bottom Face"
,
"Area is "
+
pf
.
Area
.
ToString
() +
"; Origin = ("
+
pf
.
Origin
.
X
.
ToString
() +
" "
+
pf
.
Origin
.
Y
.
ToString
() +
" "
+
pf
.
Origin
.
Z
.
ToString
() +
")"
);
break
;
}
}
}
return
pf
;
}
///
///
通过curve得到12个边的长度
///
public
void
FindEdge
(
Solid
solid
)
{
string
strParamInfo
=
null
;
foreach
(
Edge
e
in
solid
.
Edges
)
{
strParamInfo
+=
e
.
ApproximateLength
+
"\n"
;
}
TaskDialog
.
Show
(
"REVIT"
,
strParamInfo
);
}
///
///
通过Line得到12个边的长度
///
public
void
FindLine
(
Solid
solid
)
{
string
strParamInfo
=
null
;
foreach
(
Edge
e
in
solid
.
Edges
)
{
Line
line
=
e
.
AsCurve
()
as
Line
;
strParamInfo
+=
line
.
ApproximateLength
+
"\n"
;
}
TaskDialog
.
Show
(
"REVIT"
,
strParamInfo
);
}
///
///
通过curve或者line找到点
///
public
void
FindPoint
(
Solid
solid
)
{
string
strParamInfo1
=
null
;
string
strParamInfo2
=
null
;
//string strParamInfo3 = null;
foreach
(
Edge
e
in
solid
.
Edges
)
{
foreach
(
XYZ
ii
in
e
.
Tessellate
())
{
XYZ
point
=
ii
;
strParamInfo1
+=
ii
.
X
+
","
+
ii
.
Y
+
","
+
ii
.
Z
+
"\n"
;
}
Line
line
=
e
.
AsCurve
()
as
Line
;
foreach
(
XYZ
ii
in
line
.
Tessellate
())
{
XYZ
point
=
ii
;
strParamInfo2
+=
ii
.
X
+
","
+
ii
.
Y
+
","
+
ii
.
Z
+
"\n"
;
}
}
TaskDialog
.
Show
(
"通过curve找到点的坐标"
,
strParamInfo1
);
TaskDialog
.
Show
(
"通过line找到点的坐标"
,
strParamInfo2
);
}
public
void
transformPointAndUaPoint
(
Solid
solid
,
Transform
insTransform
)
{
string
strParamInfo1
=
null
;
string
strParamInfo2
=
null
;
//string strParamInfo3 = null;
foreach
(
Edge
e
in
solid
.
Edges
)
{
foreach
(
XYZ
ii
in
e
.
Tessellate
())
{
XYZ
point
=
ii
;
strParamInfo1
+=
point
.
X
+
","
+
point
.
Y
+
","
+
point
.
Z
+
"\n"
;
XYZ
transformPoint
=
insTransform
.
OfPoint
(
point
);
strParamInfo2
+=
transformPoint
.
X
+
","
+
transformPoint
.
Y
+
","
+
transformPoint
.
Z
+
"\n"
;
}
}
TaskDialog
.
Show
(
"未经transform过转换的坐标"
,
strParamInfo1
);
TaskDialog
.
Show
(
"经过transform转换的坐标系"
,
strParamInfo2
);
}
}
}