明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索

[图元] MText使用相关

  [复制链接]
 楼主| 发表于 2012-7-16 11:02:52 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2012-7-17 08:12 编辑



  1.         /// <summary>
  2.         /// 单行文字曲线分布,简单的示例
  3.         /// </summary>
  4.         [CommandMethod("t4")]
  5.         public static void Test4()
  6.         {
  7.             var ed = SystemManager.Editor;
  8.             var opts = new PromptEntityOptions("\n请选择文本:");
  9.             opts.SetRejectMessage("你选择的不是文本,请重新选择!");
  10.             opts.AddAllowedClass(typeof(DBText), true);
  11.             var res1 = ed.GetEntity(opts);
  12.             if (res1.Status != PromptStatus.OK) return;
  13.             opts = new PromptEntityOptions("\n请选择曲线:");
  14.             opts.SetRejectMessage("你选择的不是曲线,请重新选择!");
  15.             opts.AddAllowedClass(typeof(Curve), false);
  16.             var res2 = ed.GetEntity(opts);
  17.             if (res1.Status != PromptStatus.OK) return;
  18.             using (var tr = new DBTransaction())
  19.             {
  20.                 var btr = tr.OpenCurrentSpace(OpenMode.ForWrite);
  21.                 var txt = tr.GetObject<DBText>(res1.ObjectId);
  22.                 var ext = txt.GeometricExtents;
  23.                 var txts = new List<DBText>();
  24.                 int color = 1;
  25.                 var curve = tr.GetObject<Curve>(res2.ObjectId);
  26.                 double w = 0;
  27.                 foreach (char c in txt.TextString)
  28.                 {
  29.                     var s = c.ToString();
  30.                     var txtx =
  31.                         new DBText
  32.                         {
  33.                             TextString = s,
  34.                             TextStyleId = txt.TextStyleId,
  35.                             Height = txt.Height,
  36.                             ColorIndex = color++
  37.                         };
  38.                     txtx.SetDatabaseDefaults();
  39.                     txts.Add(txtx);
  40.                     var width = AcUtils.GetTextExtents(txt.TextStyleId, s, txt.Height).X;
  41.                     w += width / 2;
  42.                     txtx.Justify = AttachmentPoint.BottomCenter;
  43.                     txtx.AlignmentPoint = curve.GetPointAtDist(w);
  44.                     txtx.Rotation =
  45.                         curve
  46.                         .GetFirstDerivative(curve.GetParameterAtDistance(w))
  47.                         .GetAngleTo(Vector3d.XAxis, -Vector3d.ZAxis);
  48.                     w += width / 2;
  49.                 }
  50.                 tr.AddEntity(btr, txts);
  51.             }
  52.         }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2012-7-17 22:08:07 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2012-7-17 22:36 编辑




  1.         /// <summary>
  2.         /// 单行文字曲线分布+拖动
  3.         /// </summary>
  4.         [CommandMethod("t4")]
  5.         public static void Test4()
  6.         {
  7.             var ed = SystemManager.Editor;
  8.             var opts = new PromptEntityOptions("\n请选择文本:");
  9.             opts.SetRejectMessage("你选择的不是文本,请重新选择!");
  10.             opts.AddAllowedClass(typeof(DBText), true);
  11.             var res1 = ed.GetEntity(opts);
  12.             if (res1.Status != PromptStatus.OK) return;
  13.             opts = new PromptEntityOptions("\n请选择曲线:");
  14.             opts.SetRejectMessage("你选择的不是曲线,请重新选择!");
  15.             opts.AddAllowedClass(typeof(Curve), false);
  16.             var res2 = ed.GetEntity(opts);
  17.             if (res1.Status != PromptStatus.OK) return;
  18.             using (var tr = new DBTransaction())
  19.             {
  20.                 var txt = tr.GetObject<DBText>(res1.ObjectId);
  21.                 var ext = txt.GeometricExtents;
  22.                 var txts = new List<DBText>();
  23.                 var dists = new List<double>();
  24.                 var curve = tr.GetObject<Curve>(res2.ObjectId);
  25.                 double w = 0;
  26.                 foreach (char c in txt.TextString)
  27.                 {
  28.                     var s = c.ToString();
  29.                     var txtx =
  30.                         new DBText
  31.                         {
  32.                             Height = txt.Height,
  33.                             TextStyleId = txt.TextStyleId,
  34.                             TextString = s,
  35.                         };
  36.                     txtx.SetDatabaseDefaults();
  37.                     var width = AcUtils.GetTextExtents(txt.TextStyleId, s, txt.Height).X;
  38.                     txts.Add(txtx);
  39.                     dists.Add(w);
  40.                     w += width;
  41.                     
  42.                 }
  43.                 TextJig jig = new TextJig(txts,dists, curve);
  44.                 var resdrag = ed.Drag(jig);
  45.                 if (resdrag.Status == PromptStatus.OK)
  46.                     tr.AddEntity(tr.OpenCurrentSpace(), txts);
  47.             }
  48.         }
  49.         private class TextJig : DrawJig
  50.         {
  51.             List<DBText> _txts;
  52.             List<double> _dists;
  53.             Curve _curve;
  54.             Point3d _pos;
  55.             public TextJig(List<DBText> txts, List<double> dists, Curve curve)
  56.             {
  57.                 _txts = txts;
  58.                 _dists = dists;
  59.                 _curve = curve;
  60.             }
  61.             protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  62.             {
  63.                 try
  64.                 {
  65.                     Point3d pnt = _curve.GetClosestPointTo(_pos, false);
  66.                     double w = _curve.GetDistAtPoint(pnt);
  67.                     for (int i = 0; i < _txts.Count; i++)
  68.                     {
  69.                         double dist = w + _dists;
  70.                         double par = _curve.GetParameterAtDistance(dist);
  71.                         _txts.Position = _curve.GetPointAtParameter(par);
  72.                         _txts.Rotation = _curve.GetFirstDerivative(par).GetAngleTo(Vector3d.XAxis, -Vector3d.ZAxis);
  73.                         draw.Geometry.Draw(_txts);
  74.                     }
  75.                     return true;
  76.                 }
  77.                 catch
  78.                 {
  79.                     return false;
  80.                 }
  81.             }
  82.             protected override SamplerStatus Sampler(JigPrompts prompts)
  83.             {
  84.                 JigPromptPointOptions jigOpts = new JigPromptPointOptions("\n请输入起点:");
  85.                 jigOpts.UserInputControls =
  86.                     UserInputControls.Accept3dCoordinates |
  87.                     UserInputControls.NoZeroResponseAccepted |
  88.                     UserInputControls.NoNegativeResponseAccepted;
  89.                 PromptPointResult res = prompts.AcquirePoint(jigOpts);
  90.                 Point3d pnt = res.Value;
  91.                 if (pnt != _pos)
  92.                 {
  93.                     _pos = pnt;
  94.                 }
  95.                 else
  96.                     return SamplerStatus.NoChange;
  97.                 if (res.Status == PromptStatus.Cancel)
  98.                     return SamplerStatus.Cancel;
  99.                 else
  100.                     return SamplerStatus.OK;

  101.             }
  102.         }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2012-7-17 22:18:26 | 显示全部楼层
DBText在Jig里不能改变AlignmentPoint,只能改变Position或者使用TransformBy来改变位置
应该算是个一直存在的Bug吧
 楼主| 发表于 2012-7-18 10:43:58 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2012-7-19 12:18 编辑


  1.          /// <summary>
  2.         /// 单行文字曲线分布+拖动
  3.         /// </summary>
  4.         [CommandMethod("Tls:TBC")]
  5.         public static void TextByCurve()
  6.         {
  7.             var ed = SystemManager.Editor;
  8.             var opts = new PromptEntityOptions("\n请选择文本:");
  9.             opts.SetRejectMessage("你选择的不是文本,请重新选择!");
  10.             opts.AddAllowedClass(typeof(DBText), true);
  11.             var res1 = ed.GetEntity(opts);
  12.             if (res1.Status != PromptStatus.OK) return;
  13.             opts = new PromptEntityOptions("\n请选择曲线:");
  14.             opts.SetRejectMessage("你选择的不是曲线,请重新选择!");
  15.             opts.AddAllowedClass(typeof(Curve), false);
  16.             var res2 = ed.GetEntity(opts);
  17.             if (res1.Status != PromptStatus.OK) return;
  18.             using (var tr = new DBTransaction())
  19.             {
  20.                 var txt = tr.GetObject<DBText>(res1.ObjectId);
  21.                 var curve = tr.GetObject<Curve>(res2.ObjectId);
  22.                 double w = 0;
  23.                 var txts = new List<DBText>();
  24.                 var dists = new List<double>();
  25.                 foreach (char c in txt.TextString)
  26.                 {
  27.                     var s = c.ToString();
  28.                     var txtx =
  29.                         new DBText
  30.                         {
  31.                             Height = txt.Height,
  32.                             TextStyleId = txt.TextStyleId,
  33.                             TextString = s,
  34.                         };
  35.                     txtx.SetDatabaseDefaults();
  36.                     var width = AcUtils.GetTextExtents(txt.TextStyleId, s, txt.Height).X;
  37.                     txts.Add(txtx);
  38.                     dists.Add(w);
  39.                     w += width;
  40.                 }
  41.                 TextJig jig = new TextJig(txts, dists, curve);
  42.                 var resdrag = ed.Drag(jig);
  43.                 if (resdrag.Status == PromptStatus.OK)
  44.                     tr.AddEntity(tr.OpenCurrentSpace(), txts);
  45.             }
  46.         }
  47.         class TextJig : DrawJig
  48.         {
  49.             List<DBText> _txts;
  50.             List<double> _dists;
  51.             Curve3d _curve;
  52.             double _len;
  53.             Point3d _pos;
  54.             public TextJig(List<DBText> txts, List<double> dists, Curve curve)
  55.             {
  56.                 _txts = txts;
  57.                 _dists = dists;
  58.                 _curve = curve.ToCurve3d();
  59.                 var interval = _curve.GetInterval();
  60.                 _len = _curve.GetLength(0, interval.UpperBound, 0);
  61.             }
  62.             protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  63.             {
  64.                 try
  65.                 {
  66.                     var poc = _curve.GetClosestPointTo(_pos, Tolerance.Global);
  67.                     Point3d pnt = poc.Point;
  68.                     double w = _curve.GetLength(0, poc.Parameter, 0);
  69.                     double n = 1;
  70.                     var vec = poc.GetDerivative(1);
  71.                     if ((_pos - pnt).GetAngleTo(vec, Vector3d.ZAxis) < Math.PI)
  72.                         n = -1;
  73.                     for(int i = 0; i< _txts.Count; i++)
  74.                     {
  75.                         var txtx = _txts;
  76.                         double dist = w + n * _dists;
  77.                         if (dist < 0 || dist > _len)
  78.                         {
  79.                             break;
  80.                         }
  81.                         else
  82.                         {
  83.                             poc.Parameter = _curve.GetParameterAtLength(0, dist, true, Tolerance.Global.EqualPoint);
  84.                             txtx.Position = poc.Point;
  85.                             vec = poc.GetDerivative(1) * n;
  86.                             txtx.Rotation = vec.GetAngleTo(Vector3d.XAxis, -Vector3d.ZAxis);
  87.                             draw.Geometry.Draw(txtx);
  88.                         }
  89.                     }
  90.                     return true;
  91.                 }
  92.                 catch
  93.                 {
  94.                     return false;
  95.                 }
  96.             }
  97.             protected override SamplerStatus Sampler(JigPrompts prompts)
  98.             {
  99.                 JigPromptPointOptions jigOpts = new JigPromptPointOptions("\n请输入起点:");
  100.                 jigOpts.UserInputControls =
  101.                     UserInputControls.Accept3dCoordinates |
  102.                     UserInputControls.NoZeroResponseAccepted |
  103.                     UserInputControls.NoNegativeResponseAccepted;
  104.                 PromptPointResult res = prompts.AcquirePoint(jigOpts);
  105.                 Point3d pnt = res.Value;
  106.                 if (pnt != _pos)
  107.                 {
  108.                     _pos = pnt;
  109.                 }
  110.                 else
  111.                     return SamplerStatus.NoChange;
  112.                 if (res.Status == PromptStatus.Cancel)
  113.                     return SamplerStatus.Cancel;
  114.                 else
  115.                     return SamplerStatus.OK;

  116.             }
  117.         }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

狐哥,第58行, curve.ToCurve3d(),Curve类没有这个方法呀。请指明一下,dbtransaction我已经找了  发表于 2012-11-5 12:36
发表于 2012-11-2 13:01:02 | 显示全部楼层
雪山飞狐_lzh 发表于 2010-5-15 13:47
另外贴两个去除MText格式的函数

这个方法有没有漏洞?
http://bbs.mjtd.com/thread-97634-1-1.html
发表于 2012-11-2 17:48:31 | 显示全部楼层
狐哥,这个DBTransaction,我怎么找不到,在VB.net里面,是你自己写的类吗?
发表于 2012-11-6 18:23:05 | 显示全部楼层
翻译了两天终于翻译出来了- - 下面是VB版的。狐哥怎么那么忙,都不搭理我一下,要引用TlsBasal.dll 这个dll狐哥贴了好几个了。将此dll的复制本地属性设置为true.下面是代码

  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.ApplicationServices
  3. Imports Autodesk.AutoCAD.EditorInput
  4. Imports Autodesk.AutoCAD.DatabaseServices
  5. Imports Autodesk.AutoCAD.Geometry
  6. Imports TlsCad.Trans
  7. Public Class Mcls
  8.     <CommandMethod("td")> _
  9.     Public Shared Sub Test4()
  10.         Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  11.         Dim opts As PromptEntityOptions = New PromptEntityOptions(vbCr & "请选择文本:")
  12.         opts.SetRejectMessage(vbCr & "你选择的不是文本,请重新选择!")
  13.         opts.AddAllowedClass(GetType(DBText), True)
  14.         Dim res1 As PromptEntityResult = ed.GetEntity(opts)
  15.         If res1.Status <> PromptStatus.OK Then
  16.             Return
  17.         End If
  18.         opts = New PromptEntityOptions(vbCr & "请选择曲线:")
  19.         opts.SetRejectMessage(vbCr & "你选择的不是曲线,请重新选择!")
  20.         opts.AddAllowedClass(GetType(Curve), False)
  21.         Dim res2 As PromptEntityResult = ed.GetEntity(opts)
  22.         If res1.Status <> PromptStatus.OK Then
  23.             Return
  24.         End If
  25.         Using tr As New DBTransaction

  26.             Dim txt As DBText = CType(tr.GetObject(res1.ObjectId), DBText)
  27.             Dim ext As Extents3d = txt.GeometricExtents
  28.             Dim txts As New List(Of DBText)
  29.             Dim dists As New List(Of Double)
  30.             Dim curve As DBObject = tr.GetObject(res2.ObjectId)
  31.             Dim w As Double = 0
  32.             Dim c As Char
  33.             For Each c In txt.TextString
  34.                 Dim s As String = c.ToString()
  35.                 Dim txtx As New DBText
  36.                 txtx.Height = txt.Height
  37.                 txtx.TextStyleId = txt.TextStyleId
  38.                 txtx.TextString = s
  39.                 txtx.SetDatabaseDefaults()
  40.                 Dim width As Double = Autodesk.AutoCAD.Internal.Utils.GetTextExtents(txt.TextStyleId, s, txt.Height).X
  41.                 txts.Add(txtx)
  42.                 dists.Add(w)
  43.                 w += width
  44.             Next
  45.             Dim jig As TextJig = New TextJig(txts, dists, curve)
  46.             Dim resdrag As PromptPointResult = ed.Drag(jig)
  47.             If resdrag.Status = PromptStatus.OK Then
  48.                 tr.AddEntity(tr.OpenCurrentSpace(), txts)
  49.             End If
  50.         End Using

  51.     End Sub
  52. End Class
  53. Public Class TextJig
  54.     Inherits DrawJig
  55.     Dim _txts As List(Of DBText)
  56.     Dim _dists As List(Of Double)
  57.     Dim _curve As Curve3d
  58.     Dim _len As Double
  59.     Dim _pos As Point3d
  60.     Public Sub New(ByVal txts As List(Of DBText), ByVal dists As List(Of Double), ByVal curve As Curve)
  61.         _txts = txts
  62.         _dists = dists
  63.         _curve = TlsCad.ExtendMethods.CurveEx.ToCurve3d(curve)
  64.         Dim interval As Interval = _curve.GetInterval()
  65.         _len = _curve.GetLength(0, interval.UpperBound, 0)

  66.     End Sub
  67.     Protected Overrides Function WorldDraw(ByVal draw As Autodesk.AutoCAD.GraphicsInterface.WorldDraw) As Boolean
  68.         Try

  69.             Dim poc As PointOnCurve3d = _curve.GetClosestPointTo(_pos, Tolerance.Global)
  70.             Dim pnt As Point3d = poc.GetPoint
  71.             Dim w As Double = _curve.GetLength(0, poc.Parameter, 0)
  72.             Dim n As Double = 1
  73.             Dim vec As Vector3d = poc.GetDerivative(1)
  74.             If (_pos - pnt).GetAngleTo(vec, Vector3d.ZAxis) < Math.PI Then
  75.                 n = -1
  76.             End If

  77.             Dim i As Integer
  78.             For i = 0 To _txts.Count - 1 Step i + 1
  79.                 Dim txtx As DBText = _txts(i)
  80.                 Dim dist As Double = w + n * _dists(i)
  81.                 If dist < 0 Or dist > _len Then
  82.                     Exit For
  83.                 Else
  84.                     poc.Parameter = _curve.GetParameterAtLength(0, dist, True, Tolerance.Global.EqualPoint)
  85.                     txtx.Position = poc.Point
  86.                     vec = poc.GetDerivative(1) * n
  87.                     txtx.Rotation = vec.GetAngleTo(Vector3d.XAxis, -Vector3d.ZAxis)
  88.                     draw.Geometry.Draw(txtx)
  89.                 End If

  90.               
  91.             Next
  92.             Return True
  93.         Catch
  94.             Return False
  95.         End Try
  96.     End Function
  97.     Protected Overrides Function Sampler(ByVal prompts As JigPrompts) As SamplerStatus
  98.         Dim jigOpts As JigPromptPointOptions = New JigPromptPointOptions(vbCr & "请输入起点:")
  99.         jigOpts.UserInputControls = _
  100.             UserInputControls.Accept3dCoordinates Or UserInputControls.NoZeroResponseAccepted Or _
  101.     UserInputControls.NoNegativeResponseAccepted
  102.         Dim res As PromptPointResult = prompts.AcquirePoint(jigOpts)
  103.         Dim pnt As Point3d = res.Value
  104.         If pnt <> _pos Then
  105.             _pos = pnt
  106.         Else
  107.             Return SamplerStatus.NoChange
  108.         End If
  109.         If res.Status = PromptStatus.Cancel Then
  110.             Return SamplerStatus.Cancel
  111.         Else
  112.             Return SamplerStatus.OK
  113.         End If

  114.     End Function
  115. End Class


发表于 2012-11-6 18:24:23 | 显示全部楼层
我还会继续翻译其他的C#代码,希望狐哥能帮助下。VB的资料太少了- -
发表于 2013-8-14 13:11:12 | 显示全部楼层
YAOSHIWEI 发表于 2012-6-5 13:08
楼主,可以不可以来个lisp的版本

lisp过时了
发表于 2013-10-26 09:44:13 | 显示全部楼层
顶!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-15 15:07 , Processed in 0.182296 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表