Revit开发--代码导入CAD.dwg文件及对其操作

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值