c#代码
1.代码导入CAD图dwg文件
//载入cad文件
Transaction transaction = new Transaction(Doc, "DWGFamilyCreation");
//筛选找到目标视图
FilteredElementCollector viewFilter = new FilteredElementCollector(faDoc);
viewFilter.OfClass(typeof(Autodesk.Revit.DB.View));
Autodesk.Revit.DB.View v = viewFilter.First(m => m.Name == "右") as Autodesk.Revit.DB.View;
transaction.Start();
// 将dwg文件导入当前文档
DWGImportOptions options = new DWGImportOptions();
//ImportPlacement导入放置枚举 Centered 居中;Origin 原点;Shared 共享;Site 位置
options.Placement = Autodesk.Revit.DB.ImportPlacement.Origin;//放置--放置的坐标点与CAD里的坐标点(x,y)相关
options.OrientToView = true;//指向视图的方向
ElementId elementId = null;
string dwgpath=@".......";//dwg文件路径
Doc.Import(dwgpath, options, v, out elementId);
transaction.Commit();
2.获取CAD几何信息
[1]过滤
//【1】通过筛选
//获取cad元素
FilteredElementCollector view = new FilteredElementCollector(Doc);
var elementfilter1 = new ElementClassFilter(typeof(ImportInstance));//实例
var elementfilter2 = new ElementClassFilter(typeof(CADLinkType));//cad链接类型
var Orfilter = new LogicalOrFilter(elementfilter1, elementfilter2);
var cadsCollector = view.WherePasses(Orfilter);//CADLinkType、ImportInstance
//获取cad实例
Element inst = null;
foreach (Element it in cadsCollector)//出Element
{
if (it.GetType().ToString() == "Autodesk.Revit.DB.ImportInstance")
{
inst = it as Element;
}
}
GeometryElement geoElem = inst.get_Geometry(new Options());//几何图元
GeometryObject geometry = null;
foreach (GeometryObject geoObj in geoElem)//出GeometryObject
{
GeometryInstance geomInstance = geoObj as GeometryInstance;
foreach (GeometryObject ins in geomInstance.SymbolGeometry)
{
geometry = ins;
}
}
ImportInstance importInstance = inst as ImportInstance;
var transform = importInstance.GetTransform();
var location2 = transform.Origin;
PolyLine polyLine = geometry as PolyLine;
IList<XYZ> listpoint = polyLine.GetCoordinates();//获取坐标
【2】选择
//[1]获取单个的CAD
//拾取CAD
Reference reference = uidoc.Selection.PickObject(ObjectType.PointOnElement,"选择CAD图元");//元素上的点
Element element = doc.GetElement(reference);
GeometryElement geoElem = element.get_Geometry(new Options());//几何图元
CurveArray curveArray = new CurveArray();
GeometryObject geoObj = element.GetGeometryObjectFromReference(reference);
ImportInstance importInstance = element as ImportInstance;
//获取pl线数据
var transform = importInstance.GetTransform();
var location2 = transform.Origin;
PolyLine polyLine = geoObj as PolyLine;
IList<XYZ> points = polyLine.GetCoordinates();//获取坐标点
XYZ pMax = polyLine.GetOutline().MaximumPoint;//最大坐标点
XYZ pMin = polyLine.GetOutline().MinimumPoint;//最小坐标点
//[2]获取同一图层同种样式的CAD
//拾取CAD
Reference reference = uidoc.Selection.PickObject(ObjectType.PointOnElement,"选择CAD图元");//元素上的点
Element element = doc.GetElement(reference);
GeometryElement geoElem = element.get_Geometry(new Options());//几何图元
GeometryObject geoObj = element.GetGeometryObjectFromReference(reference);//几何对象
ElementId graphicsStyleId = geoObj.GraphicsStyleId;//图形样式Id--区别图层
foreach (var gObj in geoElem)
{
GeometryInstance geomInstance = gObj as GeometryInstance;
Transform transform = geomInstance.Transform;
//获取pl线数据
if (null != geomInstance)
{
foreach (var insObj in geomInstance.SymbolGeometry)//坐标空间
{
if (insObj.GraphicsStyleId.IntegerValue != graphicsStyleId.IntegerValue)
continue;
if (insObj.GetType().ToString() == "Autodesk.Revit.DB.PolyLine")
{
PolyLine polyLine = insObj as PolyLine;
IList<XYZ> points = polyLine.GetCoordinates();//获取坐标点
XYZ pMax = polyLine.GetOutline().MaximumPoint;//最大坐标点
XYZ pMin = polyLine.GetOutline().MinimumPoint;//最小坐标点
}
}
}
}
3.处理几何信息
【点】
//长和宽
double b = Math.Abs(pMin.X - pMax.X);
double h = Math.Abs(pMin.Y - pMax.Y);
//[1]
pMax = transform.OfPoint(pMax);//坐标转换
pMin = transform.OfPoint(pMin);//坐标转换
//[2]
//XYZ pMax2 = pMax.Subtract(transform.Origin.Negate());//坐标转换
//XYZ pMin2 = pMin.Subtract(transform.Origin.Negate());//坐标转换
XYZ pp = pMax.Add(pMin) / 2;//两点的中点
XYZ pMinb = new XYZ(pMin.X + b, pMin.Y, pMin.Z);
XYZ pMinh = new XYZ(pMin.X, pMin.Y + h, pMin.Z);
经过坐标转换才能正常使用,否则CAD坐标点与Revit坐标点对不上
【线】
//【1】模型线(一段)
//两个点生成线
Line line = Line.CreateBound(listpoint[i], listpoint[i+ 1]);
Line newLine = line;
//获取草图视图
SketchPlane skplane = GetSketchPlane(faDoc);
//生成模型线
ModelCurve modelCurve = faDoc.FamilyCreate.NewModelCurve(newLine, skplane);
//【2】多段线,闭合线圈
CurveArray curveArray = new CurveArray();
CurveArrArray curveArrArray = new CurveArrArray();
for (int i = 0; i < listpoint.Count - 1; i++)
{
Line line = Line.CreateBound(listpoint[i], listpoint[i + 1]);
line = TransformLine(transform, line);//坐标转换
Line newLine = line;
curveArray.Append(newLine);
}
curveArrArray.Append(curveArray);
注意
//坐标转换一次
//Transform transform = instance.GetTransform();
//坐标转换二次
//transform = geomInstance.Transform * transform;
4.删除导入的CAD图
//【】删除cad文件
Transaction tss2 = new Transaction(Doc, "删除cad文件");
tss2.Start();
Doc.Delete(inst.Id);
tss2.Commit();