sieben 发表于 2006-8-31 22:26:00

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; }
      }

zsh8012 发表于 2006-9-9 10:02:00

问:
编译时为何提示无DrawEntity方法?或引用何命名空间?

sieben 发表于 2006-9-12 14:31:00

      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 发表于 2007-4-29 16:56:00

你好,请教一下如何取得多段线中圆弧的中点?回油箱:muli_zxm@163.com
谢谢哦

sieben 发表于 2007-5-8 13:54:00

不好意思!好久没有来到这里!前不久才发现有个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 ;
}

gismaster08 发表于 2007-5-11 20:36:00

这是用什么方式开发的,ActiveX?

fairfanfan 发表于 2008-2-27 13:45:00

用C#怎样调用Addhatch()函数

sieben 发表于 2008-3-4 10:23:00

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]
查看完整版本: C#打断曲线方法(程序代码)