乐筑天下

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

创造3 d文本,将它封装在一个管(Cylind

[复制链接]

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2020-5-8 01:06:31 | 显示全部楼层

你好,弗利特,我无法帮助编程部分。我相信米克德可以引导你一路走到这一步。你是对的,我使用的手动方式没有保留管道。压印和爆炸只是一种快速的方法,可以将文本作为一个可以加厚的表面。但是压印文本只是一种粗糙的方式,我假设你想保持文本的比例,就像它沿着弯曲的实体覆盖一样。祝你一切顺利!
回复

使用道具 举报

3

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
28
发表于 2020-5-8 17:44:14 | 显示全部楼层
你好,巫师,你可以在文本上做双重切割,然后将文本合并成管道,而不是压印和挤压。Flyte,你现在有什么代码?我很乐意看一看,如果你能提供它和一个典型场景中的文本和管道设置的样本绘图。干杯。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2020-5-8 20:28:35 | 显示全部楼层
感谢MickD.<br>So..将文本创建为一个实体(即:非文本/多行文本),我非常依赖此处(以及OP中)描述的SEANT解决方案:https://www.theswamp.org/index.php?topic=31435.0它工作得很完美,(我可能在其他地方找到了该代码的更新版本……但前提是一样的。)。因此,我有文本…和管道..,这使我找到了接受块引用实体的代码,该实体是转换为区域的文本),我想:
1.挤出文本区域
2.创建圆柱体,用于从文本区域中减去,以获得“环绕”效果
3.正确定位圆柱体和文本区域(此处需要帮助!)
以下是代码:
  1. // FYI - the following are as held as member variables
  2. //        List> pipeProperties;
  3. //        private Point3d position;
  4. //        private Point3d centerOfPipe;
  5. //        private double extrudeHeight;
  6. //        private double outsideDiameter;
  7. //        private double wallThickness;
  8. //        private double pipeLength;
  9. //        private Vector3d pipeVector;
  10. private void CreateEnt(Entity ent)
  11. {
  12.         // Scale the text height...
  13.         Extents3d geometricExtents = ent.GeometricExtents;
  14.         Point3d point3d = new Point3d();
  15.         double mHeight = this.m_height;
  16.         Vector3d vectorTo = point3d.GetVectorTo(geometricExtents.MaxPoint);
  17.         double y = mHeight / vectorTo.Y;
  18.         ent.TransformBy(Matrix3d.Scaling(y, point3d));
  19.         using (Transaction tr = this.m_db.TransactionManager.StartTransaction())
  20.         {
  21.                 try
  22.                 {
  23.                         BlockTableRecord btr = tr.GetObject(this.m_db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  24.                         ent.SetDatabaseDefaults();
  25.                         // Extrude this region just beyond the thickness of the pipe...
  26.                         var pSolid = new Solid3d { RecordHistory = true };
  27.                         pSolid.Extrude(ent as Region, extrudeHeight, 0.0);
  28.                         // Move this region to the center point of the pipe, and move it down so it is vertically center justified...
  29.                         var centerJustPoint = new Point3d(centerOfPipe.X, centerOfPipe.Y, centerOfPipe.Z - (extrudeHeight / 4.0));
  30.                         pSolid.TransformBy(Matrix3d.Displacement(centerJustPoint - Point3d.Origin));
  31.                         // Now the text region is by default oriented so that the text is laying down flat. Hard code transform to be "vertical" so the
  32.                         // text region is up.
  33.                         // ** how do I figure out the proper orientation of the text region to match the orientation of the pipe...??
  34.                         Matrix3d matrix = Matrix3d.Rotation(Math.PI / 2, Vector3d.XAxis, centerJustPoint);
  35.                         pSolid.TransformBy(matrix);
  36.                                                  
  37.                         // Add this solid to the model...
  38.                         btr.AppendEntity(pSolid);
  39.                         tr.AddNewlyCreatedDBObject(pSolid, true);                    
  40.                         // Create the cylinder that will be subtracted from the text regoin, and move it to the center point of the pipe..
  41.                         var cyl = new Solid3d { RecordHistory = true };
  42.                         var radius = (outsideDiameter / 2.0);
  43.                         cyl.CreateFrustum(pipeLength, radius, radius, radius);
  44.                         cyl.TransformBy(Matrix3d.Displacement(centerOfPipe - Point3d.Origin));
  45.                         // Now this cylinder and text region is simply using the default orientation. Manually hard code to orientate it, just like above,
  46.                         // so that it matches the text orientation..
  47.                         // ** obviouslly this is wrong and won't handle, for example, vertical pipes.. how do I align this and the text to the orientation
  48.                         //    of the pipe.
  49.                        
  50.                         Matrix3d matrix2 = Matrix3d.Rotation(Math.PI / 2, Vector3d.YAxis, centerOfPipe);
  51.                         cyl.TransformBy(matrix2);
  52.                         // Lots of test code here to try to orientate / align the cylinder and text to the pipe... see previous post that describes the approaches
  53.                         // that I attempted, but couldn't figure out...
  54.                        
  55.                         btr.AppendEntity(cyl);
  56.                         tr.AddNewlyCreatedDBObject(cyl, true);
  57.                         // Subtract the cylinder from the text region..
  58.                         pSolid.BooleanOperation(BooleanOperationType.BoolSubtract, cyl);
  59.                 }
  60.                 catch
  61.                 {
  62.                         this.m_isValid = false;
  63.                 }
  64.                 finally
  65.                 {
  66.                         tr.Commit();
  67.                 }
  68.         }
  69. }

现在,这段代码让我了解了我之前的屏幕截图。因此,如果管道是完全水平的……一切看起来都很好,它让我实现了您在最初答复中为我概述的策略。因此,我觉得繁重的工作已经完成。正是这个对齐问题阻碍了我。
我附上了一个显示管道的测试图纸,(这是一个Plant3D图纸……希望您能够打开它。)
回复

使用道具 举报

3

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
28
发表于 2020-5-9 19:08:28 | 显示全部楼层
这就是您使用WorldToPlane的地方,您通过将WCS向量乘以管道的ECS向量,将文本和新“切割”管道的世界坐标更改为平面坐标,这将一次转换和旋转文本。从空间中的管道创建一个平面,比如从其起点、ECS x和y向量开始,并在转换中使用该平面。ECS是一个Matrix3d,因此您需要访问它的CoordinateSystem3d属性来获取X和y。start point/*或pipeEcs,CoordinateSystem3d.Origin*/,pipeEcs。CoordinateSystem3d.Xaxis,pipeEcs。coordinate system3d . ya xis);。
mat = Matrix3d,WorldToPlane(飞机);//设置用于文本和切割管道的矩阵,以将它们移动(转换)到管道ECS。
您还可以使用PostMultiplyBy或PreMultiplyBy,直接使用ECS。这取决于ECS原点是否与管道起点对齐(很可能是这样),textCuttingSolid。post multiplyby(pipe . getecs());。
textSolidpost multiplyby(pipe . getecs());。
//从文本中减去切割实体,然后在现有管道实体上减去切割文本...。
您就快完成了p.s.我无法打开绘图,但我想了想,只需使用PostMultiplyBy示例,因为它节省了许多设置,标准的Solid3d没有像“管道”那样有意义的ECS,所以我必须做更多的工作,从我自己的自定义ECS创建一个平面,现在您需要的只是一个简单的方法,该方法采用要蚀刻的plant3d管道和一些文本,创建切割文本,并使用管道的ECS将文本与管道对齐来蚀刻管道。
回复

使用道具 举报

3

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
28
发表于 2020-5-11 12:33:02 | 显示全部楼层
MickD再次表示感谢。
所以使用管道的ECS圣
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 01:23 , Processed in 0.157355 second(s), 60 queries .

© 2020-2024 乐筑天下

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