C#打断曲线方法(程序代码)
一直就不喜欢在程序里用命令,在.Net里还有AutoCAD命令与Editor及事务提交之间纠缠不清的关系,特别是三者的次序我实在搞不清楚,托管类里没有打断曲线的方法,AutoCAD的Break命令用起来不顺手,而且还担心不可靠.只好自己写一个打断曲线的方法,各位或许会用得上.花了一个很晚的晚上和一个很早的早上.可以打断直线,圆弧,圆,椭圆,椭圆弧,轻型多义线(封闭和开口的),Xline及射线.///
/// curveid Object must have existed in Database
/// Can break Line | Arc | Circle | Ellipse | Polyline | Xline | Ray
///
/// 第一个打断点
/// 第二个打断点
/// 要打断曲线的ObjectId
///
public static bool BreakCurve(Point3d p1, Point3d p2, ObjectId curveid)
{
//pcm.WriteLine("BreakCurve start", 0);
try
{
Database cdb = curveid.Database;
using (Transaction ctrans = cdb.TransactionManager.StartTransaction())
{
Curve cur = (Curve)ctrans.GetObject(curveid, OpenMode.ForWrite);
Point3d p11 = cur.GetClosestPointTo(p1, false);
Point3d p21 = cur.GetClosestPointTo(p2, false);
#region Break Line
if (cur is Line)
{
//pcm.WriteLine("Break Line start ", 1);
Line l1 = (Line)cur;
Line l2 = (Line)l1.Clone();
if (l1.GetDistAtPoint(p11)len12)
{
if ((double)param32 != param22)
{
double bul12 = pl1.GetBulgeAt(param32 - 1);
double bul22 = 0;
if (bul12 != 0.0)
{
double len22 = pl1.GetDistanceAtParameter(param32) - pl1.GetDistanceAtParameter(param32 - 1);
double len32 = pl1.GetDistanceAtParameter(param32) - pl1.GetDistanceAtParameter(param22);
bul22 = Math.Tan(len32 * Math.Atan(bul12) / len22);
}
p31 = pl1.GetPointAtParameter(param22);
pl2.AddVertexAt(0, new Point2d(p31.X, p31.Y), bul22, 0, 0);
}
for (int i = param32; iray1.BasePoint.DistanceTo(p21))
{
l1 = new Line(ray1.BasePoint, p21);
l1.SetPropertiesFrom(ray1);
ray1.BasePoint = p11;
}
else
{
l1 = new Line(ray1.BasePoint, p11);
l1.SetPropertiesFrom(ray1);
ray1.BasePoint = p21;
}
DrawEntity(l1);
}
#endregion Break Ray
ctrans.Commit();
return true;
}
}
catch (System.Exception ex)
{ pcm.WriteLine(ex); return false; }
} 问:
编译时为何提示无DrawEntity方法?或引用何命名空间?
public static ObjectId DrawEntity(Entity ent)
{ //Debug.WriteLine("Draw Entity");
try
{
Database db=HostApplicationServices.WorkingDatabase;
Transaction trans = db.TransactionManager.StartTransaction();
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt, OpenMode.ForWrite);
btr.AppendEntity(ent);
trans.AddNewlyCreatedDBObject(ent, true);
trans.Commit();
trans.Dispose();
return ent.ObjectId;
}
catch (System.Exception ex)
{
// smc.WriteLine(ex);
return ObjectId.Null;
}
}
不好意思,DrawEntity是我定义的一个方法,作用是生成实体.
其实不使用我的方法也行,只要在DrawEntity这个地方把实体提交给数据库就行
你好,请教一下如何取得多段线中圆弧的中点?回油箱:muli_zxm@163.com
谢谢哦
不好意思!好久没有来到这里!前不久才发现有个getSplitCurves函数,打断曲线用这个函数才是正途,
下面是C++的代码,C#里的curve 同样有GetSplitCurves方法,代码应该也差不多
回楼上:可以通过GetBulgeAt(param)的返回值判断是否为圆弧(不等于0就是),然后用GetPointAtParameter(param+0.5)即可得到圆弧中点
bool nsp::breakCurve(AcDbCurve* curve, AcGePoint3d p1, AcGePoint3d p2)
{
AcGePoint3d p11;
curve->getClosestPointTo(p1,p11);
double param1;
curve->getParamAtPoint(p11,param1);
AcGePoint3d p21;
curve->getClosestPointTo(p2,p21);
double param2;
curve->getParamAtPoint(p21,param2);
AcGeDoubleArray params;
if (param1getSplitCurves(params, curveSegments);
AcDbEntity* ent =NULL;
if (curveSegments.length()==2)
{
ent=(AcDbEntity*)curveSegments;
nsp::drawEntity(ent);
ent->close();
}
else if (curveSegments.length()==3)
{
ent=(AcDbEntity*)curveSegments;
nsp::drawEntity(ent);
ent->close();
ent=(AcDbEntity*)curveSegments;
nsp::drawEntity(ent);
ent->close();
}
curve->erase();
return true ;
}
这是用什么方式开发的,ActiveX? 用C#怎样调用Addhatch()函数
using app = Autodesk.AutoCAD.ApplicationServices.Application;
AcadApplication CurApp = (AcadApplication)app.AcadApplication;
AcadDocument CurDoc = CurApp.ActiveDocument;
AcadModelSpace CurSpace = CurDoc.ModelSpace;
CurSpace.AddHatch(int PatternType, string PatternName, bool Associativity, object HatchObjectType)
AcadBlocks Blocks = CurDoc.Blocks;
AcadBlock Block = Blocks.Item(0);
Block .AddHatch(int PatternType, string PatternName, bool Associativity, object HatchObjectType)
页:
[1]