尝试C#将CAD二维多段线转为三维管线样式

2023-10-28 23:10

本文主要是介绍尝试C#将CAD二维多段线转为三维管线样式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近每天学CAD,今天试着体验下三维,略有小成给大家分享一下,把CAD二维的多段线转为三维的,想对于管线类应该很实用。
效果图如下:

#region 二维管线转三维管线模型

[CommandMethod("solid3d")]
public void Solid3d()
{
#region 选择二维管线创建三维模型
PromptSelectionOptions m_selectionOption = new PromptSelectionOptions();
SelectionSet m_selectionSet = pDocument.Editor.GetSelection(m_selectionOption).Value;
List<Solid3d> solid3dCollection = new List<Solid3d>();
using (DocumentLock docLock = pDocument.LockDocument())
{
using (Transaction tran = pDatabase.TransactionManager.StartTransaction())
{
foreach (ObjectId m_objectid in m_selectionSet.GetObjectIds())
{
Entity pEntity = (Entity)tran.GetObject(m_objectid, OpenMode.ForRead);

if ((Polyline)pEntity != null)
{
Polyline m_polyline = pEntity as Polyline;
foreach (Solid3d m_solid3d in CreateSolid(m_polyline, 10, 4))
{
solid3dCollection.Add(m_solid3d);
}
}
}
}
}
#endregion
#region 复制到3维视图
if (solid3dCollection.Count > 0)
{
Document m_document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.Add(@"C:\Documents and Settings\Administrator\Local Settings\Application Data\Autodesk\AutoCAD 2007\R17.0\chs\Template\acad3D.dwt");

Database m_database = m_document.Database;
//锁定文档
using (DocumentLock docLock = m_document.LockDocument())
{
using (Transaction tran = m_database.TransactionManager.StartTransaction())
{
BlockTable m_blockTable = (BlockTable)tran.GetObject(m_database.BlockTableId, OpenMode.ForRead);
BlockTableRecord m_blockTableRecord = (BlockTableRecord)tran.GetObject(m_blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
foreach (Solid3d m_solid3d in solid3dCollection)
{
m_blockTableRecord.AppendEntity(m_solid3d);
tran.AddNewlyCreatedDBObject(m_solid3d, true);
}
tran.Commit();
}
m_document.SendStringToExecute("_zoom _a", true, false, false);
Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument = m_document;
}
}
#endregion
}
/// <summary>
/// 根据二维管线创建三维模型
/// </summary>
/// <param name="m_polyline">二维管线</param>
/// <param name="r">内管径</param>
/// <param name="h">管壁厚度</param>
/// <returns>三维管线模型的集合</returns>
public List<Solid3d> CreateSolid(Polyline m_polyline, double r, double h)
{
List<Solid3d> solid3dCollection = new List<Autodesk.AutoCAD.DatabaseServices.Solid3d>();//保存3d模型实体
for (int i = 0; i < m_polyline.NumberOfVertices-1; i++)
{
#region 创建三维管线剖面
double disx = Math.Pow((m_polyline.GetPoint2dAt(i + 1).X - m_polyline.GetPoint2dAt(i).X), 2);
double disy = Math.Pow((m_polyline.GetPoint2dAt(i + 1).Y - m_polyline.GetPoint2dAt(i).Y), 2);
double length = Math.Sqrt(disx+disy);//计算实际管长
Polyline polyline = new Polyline();//存放管线剖面结构
polyline.AddVertexAt(0, new Point2d(m_polyline.GetPoint2dAt(i).X, m_polyline.GetPoint2dAt(i).Y), 0, 0, 0);
polyline.AddVertexAt(1, new Point2d(m_polyline.GetPoint2dAt(i).X + length, m_polyline.GetPoint2dAt(i).Y), 0, 0, 0);
polyline.AddVertexAt(2, new Point2d(m_polyline.GetPoint2dAt(i).X + length, m_polyline.GetPoint2dAt(i).Y + h), 0, 0, 0);
polyline.AddVertexAt(3, new Point2d(m_polyline.GetPoint2dAt(i).X, m_polyline.GetPoint2dAt(i).Y + h), 0, 0, 0);
polyline.Closed = true;

DBObjectCollection n_DBObjectCollection = new DBObjectCollection();
n_DBObjectCollection.Add(polyline);
DBObjectCollection m_DBObjectCollection = Region.CreateFromCurves(n_DBObjectCollection);
Region m_Region = m_DBObjectCollection[0] as Region;
#endregion
#region 创建三维实体
Solid3d m_solid3d = new Solid3d();
Point3d point3d = new Point3d(polyline.GetPoint3dAt(0).X, polyline.GetPoint3dAt(0).Y - r,0);
m_solid3d.Revolve(m_Region, point3d, Vector3d.XAxis, 6.28);
#endregion
#region 拐角
double angle=Math.Atan2(m_polyline.GetPoint2dAt(i+1).Y-m_polyline.GetPoint2dAt(i).Y,m_polyline.GetPoint2dAt(i+1).X-m_polyline.GetPoint2dAt(i).X);
if (angle != 0)
{
//平面旋转
Matrix3d m_Matrix3d = pDocument.Editor.CurrentUserCoordinateSystem;
CoordinateSystem3d m_CoordinateSystem3d = m_Matrix3d.CoordinateSystem3d;
m_solid3d.TransformBy(Matrix3d.Rotation(angle, Vector3d.ZAxis, m_polyline.GetPoint3dAt(i)));
}
#endregion
#region 高程
double highValue = 10;//这个是假定的每一次拐点高程都增加10,如果每个点高程不一样的情况可以使用highValue=H2-H1,(当前点高程-前一点高程)
double highAngle = Math.Asin(highValue / length);
if (highAngle != 0)
{
//高程旋转
Matrix3d m_Matrix3d = pDocument.Editor.CurrentUserCoordinateSystem;
CoordinateSystem3d m_CoordinateSystem3d = m_Matrix3d.CoordinateSystem3d;
m_solid3d.TransformBy(Matrix3d.Rotation(-highAngle, Vector3d.YAxis, m_polyline.GetPoint3dAt(i)));

//高程平移
Vector3d m_Vector3d = m_polyline.GetPoint3dAt(i).GetVectorTo(new Point3d(m_polyline.GetPoint3dAt(i).X, m_polyline.GetPoint3dAt(i).Y, m_polyline.GetPoint3dAt(i).Z + highValue * i));
m_solid3d.TransformBy(Matrix3d.Displacement(m_Vector3d));
}

#endregion
solid3dCollection.Add(m_solid3d);
}
return solid3dCollection;
}
#endregion

这篇关于尝试C#将CAD二维多段线转为三维管线样式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296596

相关文章

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

Vector3 三维向量

Vector3 三维向量 Struct Representation of 3D vectors and points. 表示3D的向量和点。 This structure is used throughout Unity to pass 3D positions and directions around. It also contains functions for doin

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t