乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 144|回复: 7

曲线处理专贴----我们的[原创]

[复制链接]

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-5-14 21:47:00 | 显示全部楼层 |阅读模式
先发几个简单的例子,抛砖引玉,希望大家也贴上自己的得意之作:)
直线打断,模拟Break命令
  1.         [CommandMethod("myb")]
  2.         public static void MyBreakLine()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             //选择直线
  8.             PromptEntityOptions opt1 = new PromptEntityOptions("\nselect a line:");
  9.             opt1.SetRejectMessage("\nerror!");
  10.             opt1.AddAllowedClass(typeof(Line), true);
  11.             PromptEntityResult res1 = ed.GetEntity(opt1);
  12.             if (res1.Status == PromptStatus.OK)
  13.             {
  14.                 //选择第二打断点
  15.                 PromptPointOptions opt2 = new PromptPointOptions("\nselect second point:");
  16.                 opt2.AllowNone = true;
  17.                 PromptPointResult res2 = ed.GetPoint(opt2);
  18.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  19.                 {
  20.                     Line oldline = (Line)tr.GetObject(res1.ObjectId, OpenMode.ForRead);
  21.                     List pars = new List();
  22.                     Point3d pt1 = oldline.GetClosestPointTo(res1.PickedPoint, false);
  23.                     Point3d pt2 = new Point3d();
  24.                     pars.Add(oldline.GetParameterAtPoint(pt1));
  25.                     BlockTableRecord btr =
  26.                         (BlockTableRecord)tr.GetObject(
  27.                             db.CurrentSpaceId,
  28.                             OpenMode.ForWrite,
  29.                             false);
  30.                     DBObjectCollection objs;
  31.                     //两种情况
  32.                     if (res2.Status == PromptStatus.OK)
  33.                     {
  34.                         //如果选择了第二点,获取直线上两点的param值,并排序
  35.                         pt2 = oldline.GetClosestPointTo(res2.Value, false);
  36.                         pars.Add(oldline.GetParameterAtPoint(pt2));
  37.                         pars.Sort();
  38.                         //按param值打断曲线
  39.                         objs = oldline.GetSplitCurves(new DoubleCollection(pars.ToArray()));
  40.                         foreach (Line newline in objs)
  41.                         {
  42.                             //如果生成的直线起点或终点不是选择的打断点,把它加入数据库
  43.                             if ((newline.StartPoint != pt1 && newline.StartPoint != pt2) ^ (newline.EndPoint != pt1 && newline.EndPoint != pt2))
  44.                             {
  45.                                 btr.AppendEntity(newline);
  46.                                 tr.AddNewlyCreatedDBObject(newline, true);
  47.                             }
  48.                         }
  49.                     }
  50.                     else
  51.                     {
  52.                         //如果没有选择第二点,就按第一点打断
  53.                         objs = oldline.GetSplitCurves(new DoubleCollection(pars.ToArray()));
  54.                         foreach (Line newline in objs)
  55.                         {
  56.                             btr.AppendEntity(newline);
  57.                             tr.AddNewlyCreatedDBObject(newline, true);
  58.                         }
  59.                     }
  60.                     oldline.UpgradeOpen();
  61.                     oldline.Erase();
  62.                     tr.Commit();
  63.                 }
  64.             }
  65.         }
所有曲线打断于点
  1.         [CommandMethod("BAC")]
  2.         public static void BreakAllCurve()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             //选择曲线
  8.             PromptSelectionResult res = ed.GetSelection(new PromptSelectionOptions(), new SelectionFilter(new TypedValue[] { new TypedValue(0, "*Line,Arc,Circle,Ellipse") }));
  9.             ObjectId[] ids = res.Value.GetObjectIds();
  10.             ObjectIdCollection oldids = new ObjectIdCollection();
  11.             using (Transaction tr = db.TransactionManager.StartTransaction())
  12.             {
  13.                 BlockTableRecord btr =
  14.                     (BlockTableRecord)tr.GetObject(
  15.                         db.CurrentSpaceId,
  16.                         OpenMode.ForWrite,
  17.                         false);
  18.                 //遍历选择集
  19.                 foreach (ObjectId i in ids)
  20.                 {
  21.                     List pars = new List();
  22.                     Curve iCurve = (Curve)tr.GetObject(i, OpenMode.ForRead);
  23.                     //获取曲线与其他曲线的交点处的param值集合,按该集合打断曲线
  24.                     foreach (ObjectId j in ids)
  25.                     {
  26.                         if (i != j)
  27.                         {
  28.                             Curve jCurve = (Curve)tr.GetObject(j, OpenMode.ForRead);
  29.                             Point3dCollection iwpnts = new Point3dCollection();
  30.                             iCurve.IntersectWith(jCurve, Intersect.OnBothOperands, iwpnts, 0, 0);
  31.                             foreach (Point3d p in iwpnts)
  32.                             {
  33.                                 pars.Add(iCurve.GetParameterAtPoint(p));
  34.                             }
  35.                         }
  36.                     }
  37.                     //如果有交点,按param值排序并打断
  38.                     if (pars.Count > 0)
  39.                     {
  40.                         pars.Sort();
  41.                         try
  42.                         {
  43.                             //将子曲线加入数据库,原曲线加入oldids集合
  44.                             foreach (Curve c in iCurve.GetSplitCurves(new DoubleCollection(pars.ToArray())))
  45.                             {
  46.                                 btr.AppendEntity(c);
  47.                                 tr.AddNewlyCreatedDBObject(c, true);
  48.                             }
  49.                             oldids.Add(i);
  50.                         }
  51.                         catch
  52.                         { }
  53.                     }
  54.                 }
  55.                 foreach (ObjectId id in oldids)
  56.                 {
  57.                     tr.GetObject(id, OpenMode.ForWrite).Erase();
  58.                 }
  59.                 tr.Commit();
  60.             }
  61.         }
简单的直线倒角
  1.         [CommandMethod("dj")]
  2.         public void daojiao()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             PromptDoubleResult resgetdist = ed.GetDistance("\n请输入倒角距离");
  8.             if (resgetdist.Status == PromptStatus.OK)
  9.             {
  10.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  11.                 {
  12.                     double dist = resgetdist.Value;
  13.                     PromptEntityOptions optgetent = new PromptEntityOptions("\n请选择第一条直线:");
  14.                     optgetent.SetRejectMessage("\n错误的选择");
  15.                     optgetent.AddAllowedClass(typeof(Line), true);
  16.                     PromptEntityResult resgetent = ed.GetEntity(optgetent);
  17.                     if (resgetent.Status == PromptStatus.OK)
  18.                     {
  19.                         ObjectId id1 = resgetent.ObjectId;
  20.                         Line line1 = (Line)tr.GetObject(id1, OpenMode.ForWrite);
  21.                         line1.Highlight();
  22.                         Point3d pt1 = resgetent.PickedPoint;
  23.                         optgetent.Message = "\n请选择第二条直线:";
  24.                         resgetent = ed.GetEntity(optgetent);
  25.                         if (resgetent.Status == PromptStatus.OK)
  26.                         {
  27.                             ObjectId id2 = resgetent.ObjectId;
  28.                             Point3d pt2 = resgetent.PickedPoint;
  29.                             Line line2 = (Line)tr.GetObject(id2, OpenMode.ForWrite);
  30.                             pt1 = line1.GetClosestPointTo(pt1, false);
  31.                             pt2 = line2.GetClosestPointTo(pt2, false);
  32.                             //获取两直线交点
  33.                             Point3dCollection pts = new Point3dCollection();
  34.                             line1.IntersectWith(line2, Intersect.ExtendBoth, pts, 0, 0);
  35.                             //如果有交点
  36.                             if (pts.Count == 1)
  37.                             {
  38.                                 Point3d pt = pts[0];
  39.                                 Plane plane = new Plane();
  40.                                 //判断点选在直线的哪一侧(是否靠近起点)
  41.                                 Vector3d v1,v2;
  42.                                 v1 = line1.StartPoint - pt;
  43.                                 v2 = line1.EndPoint - pt;
  44.                                 bool atstart1 = false;
  45.                                 if (v1.Length != 0)
  46.                                 {
  47.                                     atstart1 = Tolerance.Equals(v1.AngleOnPlane(plane), (pt1 - pt).AngleOnPlane(plane));
  48.                                     if (Tolerance.Equals(v1.AngleOnPlane(plane), v2.AngleOnPlane(plane)))
  49.                                     {
  50.                                         atstart1 = v1.Length > v2.Length;
  51.                                     }
  52.                                 }
  53.                                 v1 = line2.StartPoint - pt;
  54.                                 v2 = line2.EndPoint - pt;
  55.                                 bool atstart2 = false;
  56.                                 if (v1.Length != 0)
  57.                                 {
  58.                                     atstart2 = Tolerance.Equals(v1.AngleOnPlane(plane), (pt2 - pt).AngleOnPlane(plane));
  59.                                     if (Tolerance.Equals(v1.AngleOnPlane(plane), v2.AngleOnPlane(plane)))
  60.                                     {
  61.                                         atstart2 = v1.Length > v2.Length;
  62.                                     }
  63.                                 }
  64.                                 // 判断被选择段是否可以倒角
  65.                                 Point3d pt3 = atstart1 ? line1.StartPoint : line1.EndPoint;
  66.                                 Point3d pt4 = atstart2 ? line2.StartPoint : line2.EndPoint;
  67.                                 Vector3d vec1 = pt3 - pt;
  68.                                 Vector3d vec2 = pt4 - pt;
  69.                                 if (vec1.Length >= dist && vec2.Length >= dist)
  70.                                 {
  71.                                     //计算倒角点
  72.                                     vec1 = vec1.GetNormal() * dist;
  73.                                     vec2 = vec2.GetNormal() * dist;
  74.                                     pt3 = pt + vec1;
  75.                                     pt4 = pt + vec2;
  76.                                     //按点选的位置改变原直线
  77.                                     if (atstart1)
  78.                                     {
  79.                                         line1.EndPoint = pt3;
  80.                                     }
  81.                                     else
  82.                                     {
  83.                                         line1.StartPoint = pt3;
  84.                                     }
  85.                                     if (line1.Length == 0)
  86.                                     {
  87.                                         line1.Erase();
  88.                                     }
  89.                                     if (atstart2)
  90.                                     {
  91.                                         line2.EndPoint = pt4;
  92.                                     }
  93.                                     else
  94.                                     {
  95.                                         line2.StartPoint = pt4;
  96.                                     }
  97.                                     if (line2.Length == 0)
  98.                                     {
  99.                                         line2.Erase();
  100.                                     }
  101.                                     //生成倒角线
  102.                                     Line line = new Line(pt3, pt4);
  103.                                     BlockTableRecord btr =
  104.                                         (BlockTableRecord)tr.GetObject(
  105.                                             db.CurrentSpaceId,
  106.                                             OpenMode.ForWrite,
  107.                                             false);
  108.                                     btr.AppendEntity(line);
  109.                                     tr.AddNewlyCreatedDBObject(line, true);
  110.                                 }
  111.                                 else
  112.                                 {
  113.                                     ed.WriteMessage("\n距离太大\n*无效");
  114.                                 }
  115.                             }
  116.                             else
  117.                             {
  118.                                 ed.WriteMessage("\n直线平行\n*无效");
  119.                             }
  120.                         }
  121.                     }
  122.                     tr.Commit();
  123.                 }
  124.             }
  125.         }
找回hatch的边界,
填充边界是一组Ge曲线,所以需要转换为Db曲线
圆弧和椭圆的处理不太好,Ge库实体的方法有点晕哈,期待高人操刀
  1.         [CommandMethod("ht")]
  2.         public static void HatchLoop()
  3.         {
  4.             PromptSelectionResult res = CadHelper.Editor.GetSelection(
  5.                 new PromptSelectionOptions(),
  6.                 new SelectionFilter(new TypedValue[] { new TypedValue(0, "Hatch") }));
  7.             if (res.Status != PromptStatus.OK)
  8.                 return;
  9.             Document doc = Application.DocumentManager.MdiActiveDocument;
  10.             Database db = doc.Database;
  11.             using (Transaction tr = db.TransactionManager.StartTransaction())
  12.             {
  13.                 BlockTableRecord btr =
  14.                     (BlockTableRecord)tr.GetObject(
  15.                         db.CurrentSpaceId,
  16.                         OpenMode.ForWrite,
  17.                         false);
  18.                 foreach (ObjectId id in res.Value.GetObjectIds())
  19.                 {
  20.                     //获取Hatch对象的Ocs
  21.                     Hatch h = (Hatch)tr.GetObject(id, OpenMode.ForRead);
  22.                     Matrix3d mat = Matrix3d.PlaneToWorld(h.GetPlane());
  23.                     //遍历边界集合,通常边界有两种形式:多义线 或 曲线集合
  24.                     for (int i = 0; i  pars = new List();
  25.                     Curve iCurve = (Curve)tr.GetObject(i, OpenMode.ForRead);
  26.                     //获取曲线与其他曲线的交点处的param值集合,按该集合打断曲线
  27.                     foreach (ObjectId j in ids)
  28.                     {
  29.                         if (i != j)
  30.                         {
  31.                             Curve jCurve = (Curve)tr.GetObject(j, OpenMode.ForRead);
  32.                             Point3dCollection iwpnts = new Point3dCollection();
  33.                             iCurve.IntersectWith(jCurve, Intersect.OnBothOperands, iwpnts, 0, 0);
  34.                             foreach (Point3d p in iwpnts)
  35.                             {
  36.                                 pars.Add(iCurve.GetParameterAtPoint(p));
  37.                             }
  38.                         }
  39.                     }
  40.                     //如果有交点,按param值排序并打断
  41.                     if (pars.Count > 0)
  42.                     {
  43.                         pars.Sort();
  44.                         try
  45.                         {
  46.                             //将子曲线加入数据库,原曲线加入oldids集合
  47.                             foreach (Line newline in iCurve.GetSplitCurves(new DoubleCollection(pars.ToArray())))
  48.                             {
  49.                                 btr.AppendEntity(newline);
  50.                                 tr.AddNewlyCreatedDBObject(newline, true);
  51.                             }
  52.                             oldids.Add(i);
  53.                         }
  54.                         catch
  55.                         { }
  56.                     }
  57.                 }
  58.                 foreach (ObjectId id in oldids)
  59.                 {
  60.                     tr.GetObject(id, OpenMode.ForWrite).Erase();
  61.                 }
  62.                 tr.Commit();
  63.             }
  64.         }
回复

使用道具 举报

1

主题

13

帖子

2

银币

初来乍到

Rank: 1

铜币
17
发表于 2020-4-3 09:43:00 | 显示全部楼层

找回hatch的边界,
填充边界是一组Ge曲线,所以需要转换为Db曲线
圆弧和椭圆的处理不太好,Ge库实体的方法有点晕哈,期待高人操刀
  1.         [CommandMethod("ht")]
  2.         public static void HatchLoop()
  3.         {
  4.             PromptSelectionResult res = CadHelper.Editor.GetSelection(
  5.                 new PromptSelectionOptions(),
  6.                 new SelectionFilter(new TypedValue[] { new TypedValue(0, "Hatch") }));
  7.             if (res.Status != PromptStatus.OK)
  8.                 return;
  9.             Document doc = Application.DocumentManager.MdiActiveDocument;
  10.             Database db = doc.Database;
  11.             using (Transaction tr = db.TransactionManager.StartTransaction())
  12.             {
  13.                 BlockTableRecord btr =
  14.                     (BlockTableRecord)tr.GetObject(
  15.                         db.CurrentSpaceId,
  16.                         OpenMode.ForWrite,
  17.                         false);
  18.                 foreach (ObjectId id in res.Value.GetObjectIds())
  19.                 {
  20.                     //获取Hatch对象的Ocs
  21.                     Hatch h = (Hatch)tr.GetObject(id, OpenMode.ForRead);
  22.                     Matrix3d mat = Matrix3d.PlaneToWorld(h.GetPlane());
  23.                     //遍历边界集合,通常边界有两种形式:多义线 或 曲线集合
  24.                     for (int i = 0; i  v2.Length;
  25.                                     }
  26.                                 }
  27.                                 v1 = line2.StartPoint - pt;
  28.                                 v2 = line2.EndPoint - pt;
  29.                                 bool atstart2 = false;
  30.                                 if (v1.Length != 0)
  31.                                 {
  32.                                     atstart2 = Tolerance.Equals(v1.AngleOnPlane(plane), (pt2 - pt).AngleOnPlane(plane));
  33.                                     if (Tolerance.Equals(v1.AngleOnPlane(plane), v2.AngleOnPlane(plane)))
  34.                                     {
  35.                                         atstart2 = v1.Length > v2.Length;
  36.                                     }
  37.                                 }
  38.                                 // 判断被选择段是否可以倒角
  39.                                 Point3d pt3 = atstart1 ? line1.StartPoint : line1.EndPoint;
  40.                                 Point3d pt4 = atstart2 ? line2.StartPoint : line2.EndPoint;
  41.                                 Vector3d vec1 = pt3 - pt;
  42.                                 Vector3d vec2 = pt4 - pt;
  43.                                 if (vec1.Length >= dist && vec2.Length >= dist)
  44.                                 {
  45.                                     //计算倒角点
  46.                                     vec1 = vec1.GetNormal() * dist;
  47.                                     vec2 = vec2.GetNormal() * dist;
  48.                                     pt3 = pt + vec1;
  49.                                     pt4 = pt + vec2;
  50.                                     //按点选的位置改变原直线
  51.                                     if (atstart1)
  52.                                     {
  53.                                         line1.EndPoint = pt3;
  54.                                     }
  55.                                     else
  56.                                     {
  57.                                         line1.StartPoint = pt3;
  58.                                     }
  59.                                     if (line1.Length == 0)
  60.                                     {
  61.                                         line1.Erase();
  62.                                     }
  63.                                     if (atstart2)
  64.                                     {
  65.                                         line2.EndPoint = pt4;
  66.                                     }
  67.                                     else
  68.                                     {
  69.                                         line2.StartPoint = pt4;
  70.                                     }
  71.                                     if (line2.Length == 0)
  72.                                     {
  73.                                         line2.Erase();
  74.                                     }
  75.                                     //生成倒角线
  76.                                     Line line = new Line(pt3, pt4);
  77.                                     BlockTableRecord btr =
  78.                                         (BlockTableRecord)tr.GetObject(
  79.                                             db.CurrentSpaceId,
  80.                                             OpenMode.ForWrite,
  81.                                             false);
  82.                                     btr.AppendEntity(line);
  83.                                     tr.AddNewlyCreatedDBObject(line, true);
  84.                                 }
  85.                                 else
  86.                                 {
  87.                                     ed.WriteMessage("\n距离太大\n*无效");
  88.                                 }
  89.                             }
  90.                             else
  91.                             {
  92.                                 ed.WriteMessage("\n直线平行\n*无效");
  93.                             }
  94.                         }
  95.                     }
  96.                     tr.Commit();
  97.                 }
  98.             }
  99.         }
回复

使用道具 举报

0

主题

1

帖子

1

银币

初来乍到

Rank: 1

铜币
1
发表于 2018-8-9 15:36:00 | 显示全部楼层
仅以此表示对新任版主的支持!复制代码提示:pi可以直接调用System.Math.PI获取,:)
回复

使用道具 举报

110

主题

324

帖子

10

银币

中流砥柱

Rank: 25

铜币
764
发表于 2020-5-26 08:35:00 | 显示全部楼层

连接两条相连的Spline,Ge曲线还是强大些:)
简单的示例
  1.         public static Spline ConvertNurbCurve3d(NurbCurve3d nc3d)
  2.         {
  3.             DoubleCollection knots = new DoubleCollection();
  4.             foreach (double knot in nc3d.Knots)
  5.             {
  6.                 knots.Add(knot);
  7.             }
  8.             NurbCurve3dData ncdata = nc3d.DefinitionData;
  9.             return
  10.                 new Spline(
  11.                     ncdata.Degree,
  12.                     ncdata.Rational,
  13.                     nc3d.IsClosed(),
  14.                     ncdata.Periodic,
  15.                     ncdata.ControlPoints,
  16.                     knots,
  17.                     ncdata.Weights,
  18.                     0,
  19.                     nc3d.Knots.Tolerance);
  20.         }
  21.         public static NurbCurve3d ConvertNurbCurve3d(Spline spl)
  22.         {
  23.             KnotCollection knots = new KnotCollection();
  24.             foreach (double knot in spl.NurbsData.GetKnots())
  25.             {
  26.                 knots.Add(knot);
  27.             }
  28.             NurbsData ndata = spl.NurbsData;
  29.             return
  30.                 new NurbCurve3d(
  31.                     ndata.Degree,
  32.                     knots,
  33.                     ndata.GetControlPoints(),
  34.                     ndata.Periodic);
  35.         }
  36.         [CommandMethod("t4")]
  37.         public static void Test4()
  38.         {
  39.             PromptSelectionResult res = CadHelper.Editor.GetSelection();
  40.             using (DBTransaction tr = new DBTransaction())
  41.             {
  42.                 Spline c1 = (Spline)tr.GetObject(res.Value[0].ObjectId, OpenMode.ForRead);
  43.                 Spline c2 = (Spline)tr.GetObject(res.Value[1].ObjectId, OpenMode.ForRead);
  44.                 NurbCurve3d nc3d = ConvertNurbCurve3d(c1);
  45.                 nc3d.JoinWith(ConvertNurbCurve3d(c2));
  46.                 Spline spl = ConvertNurbCurve3d(nc3d);
  47.                 tr.OpenCurrentSpace();
  48.                 tr.AddEntity(spl);
  49.             }
  50.         }
打断自相交曲线,以前写过一个巨复杂的:),一百多行代码
使用Ge CurveCurveIntersector3d对象要简单有效的多:)
暂时只有Spline的
  1.         [CommandMethod("t7")]
  2.         public static void Test7()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             PromptEntityResult res1 = ed.GetEntity("选择图元1");
  8.             using (DBTransaction tr = new DBTransaction())
  9.             {
  10.                 Spline spl1 = (Spline)tr.GetObject(res1.ObjectId, OpenMode.ForRead);
  11.                 NurbCurve3d nc1 = ConvertDbCurve.ToNurbCurve3d(spl1);
  12.                 CurveCurveIntersector3d cci = new CurveCurveIntersector3d(nc1, nc1, Vector3d.ZAxis);
  13.                 List pars = new List();
  14.                
  15.                 for (int i = 0; i  0)
  16.                 {
  17.                     pars.Sort();
  18.                     tr.OpenCurrentSpace();
  19.                     tr.AddEntity(spl1.GetSplitCurves(new DoubleCollection(pars.ToArray())));
  20.                     spl1.UpgradeOpen();
  21.                     spl1.Erase(true);
  22.                 }
  23.             }
  24.         }
曲线的不等比缩放
注意,不是所有的曲线都支持,可以直接转换的只有椭圆,样条曲线
圆可以先转换为椭圆
其余的曲线可能需要先转换为Ge样条曲线,再变换矩阵,或取Spline属性
  1.         public static Matrix3d ScaleMatrix(Point3d point, double x, double y, double z)
  2.         {
  3.             double[] matdata = new double[16];
  4.             matdata[0] = x;
  5.             matdata[3] = point.X * (1 - x);
  6.             matdata[5] = y;
  7.             matdata[7] = point.Y * (1 - y);
  8.             matdata[10] = z;
  9.             matdata[11] = point.Z * (1 - z);
  10.             matdata[15] = 1;
  11.             return new Matrix3d(matdata);
  12.         }
  13.         [CommandMethod("t9")]
  14.         public static void Test9()
  15.         {
  16.             Document doc = Application.DocumentManager.MdiActiveDocument;
  17.             Database db = doc.Database;
  18.             Editor ed = doc.Editor;
  19.             PromptEntityResult res1 = ed.GetEntity("选择图元1");
  20.             using (DBTransaction tr = new DBTransaction())
  21.             {
  22.                 Curve curve = (Curve)tr.GetObject(res1.ObjectId, OpenMode.ForWrite);
  23.                 curve.TransformBy(ScaleMatrix(new Point3d(10, 10, 0), 2, 1, 1));
  24.             }
  25.         }
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-5-14 22:18:00 | 显示全部楼层
打断自相交曲线,以前写过一个巨复杂的:),一百多行代码
使用Ge CurveCurveIntersector3d对象要简单有效的多:)
  1.         [CommandMethod("t7")]
  2.         public static void Test7()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             PromptEntityResult res1 = ed.GetEntity("选择图元1");
  8.             using (DBTransaction tr = new DBTransaction())
  9.             {
  10.                 Spline spl1 = (Spline)tr.GetObject(res1.ObjectId, OpenMode.ForRead);
  11.                 NurbCurve3d nc1 = ConvertDbCurve.ToNurbCurve3d(spl1);
  12.                 CurveCurveIntersector3d cci = new CurveCurveIntersector3d(nc1, nc1, Vector3d.ZAxis);
  13.                 List pars = new List();
  14.                
  15.                 for (int i = 0; i  0)
  16.                 {
  17.                     pars.Sort();
  18.                     tr.OpenCurrentSpace();
  19.                     tr.AddEntity(spl1.GetSplitCurves(new DoubleCollection(pars.ToArray())));
  20.                     spl1.UpgradeOpen();
  21.                     spl1.Erase(true);
  22.                 }
  23.             }
  24.         }
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-5-15 13:13:00 | 显示全部楼层

曲线的不等比缩放
注意,不是所有的曲线都支持,可以直接转换的只有椭圆,样条曲线
圆可以先转换为椭圆
其余的曲线可能需要先转换为Ge样条曲线,再变换矩阵,或取Spline属性
  1.         public static Matrix3d ScaleMatrix(Point3d point, double x, double y, double z)
  2.         {
  3.             double[] matdata = new double[16];
  4.             matdata[0] = x;
  5.             matdata[3] = point.X * (1 - x);
  6.             matdata[5] = y;
  7.             matdata[7] = point.Y * (1 - y);
  8.             matdata[10] = z;
  9.             matdata[11] = point.Z * (1 - z);
  10.             matdata[15] = 1;
  11.             return new Matrix3d(matdata);
  12.         }
  13.         [CommandMethod("t9")]
  14.         public static void Test9()
  15.         {
  16.             Document doc = Application.DocumentManager.MdiActiveDocument;
  17.             Database db = doc.Database;
  18.             Editor ed = doc.Editor;
  19.             PromptEntityResult res1 = ed.GetEntity("选择图元1");
  20.             using (DBTransaction tr = new DBTransaction())
  21.             {
  22.                 Curve curve = (Curve)tr.GetObject(res1.ObjectId, OpenMode.ForWrite);
  23.                 curve.TransformBy(ScaleMatrix(new Point3d(10, 10, 0), 2, 1, 1));
  24.             }
  25.         }
复制代码
回复

使用道具 举报

72

主题

2726

帖子

9

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3014
发表于 2009-5-16 16:37:00 | 显示全部楼层
“所有曲线打断于点”的程序只是针对line对象有用?我试了cad2008、2010多段线都没打断。
回复

使用道具 举报

32

主题

651

帖子

8

银币

中流砥柱

Rank: 25

铜币
779
发表于 2009-5-18 08:54:00 | 显示全部楼层
如果有自交点,这个简化版本不支持:)
在自交点打断曲线可以看下三楼的代码
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 02:06 , Processed in 0.330346 second(s), 68 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表