Создание сегментов полилинии перпеникулярых к другой полилинии

Автор Тема: Создание сегментов полилинии перпеникулярых к другой полилинии  (Прочитано 5888 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Нужно создать две взаимно перпендикулярных полилинии: 1 базовую стоящую из одного сегмента и 1 указательную состоящую из 3 сегментов(выглядит как стрелка).
Опробовал код на Line - отрезки создаются как надо - перпендикулярно друг другу, но при замене объекта на требуемый мне - полилиинию, она перестает строиться перпендикулярно к базовой линии. Подскажите пожалуйста, где я накосячил?
Код - C# [Выбрать]
  1.  public class Crossection
  2.     {
  3.         private static string sectionName = Utilities.SelectionUtilities.GetStringParameter("Set section name");
  4.         private static Point3d pL = Utilities.SelectionUtilities.GetPointFromUser("Set left point");
  5.         private static Point3d pR = Utilities.SelectionUtilities.GetPointFromUser("Set right point");
  6.         private static Point3d pointer = Utilities.SelectionUtilities.GetPointFromUser("Set desired side point");
  7.         private static int stripeLength = 500;
  8.         private static int thickness = 5;
  9.  
  10.         public void CreateSectionMark()
  11.         {
  12.  
  13.             //--------------------------------------------------------------------Mandatory variables
  14.             Document doc = Application.DocumentManager.MdiActiveDocument;
  15.             Database db = doc.Database;
  16.             Editor ed = doc.Editor;
  17.             Transaction tr = db.TransactionManager.StartTransaction();
  18.             //--------------------------------------------------------------------Mandatory variables
  19.             ObjectIdCollection collection = new ObjectIdCollection();
  20.             using (tr)
  21.             {
  22.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  23.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  24.  
  25.                 Polyline stripe = new Polyline();
  26.                 stripe.SetDatabaseDefaults();
  27.                 stripe.AddVertexAt(0, new Point2d(pL.X, pL.Y), 0, thickness, thickness);
  28.                 stripe.AddVertexAt(1, new Point2d(pR.X, pR.Y), 0, thickness, thickness);
  29.  
  30.                 stripe.LineWeight = LineWeight.ByLineWeightDefault;
  31.                 stripe.Layer = "0";
  32.                 btr.AppendEntity(stripe);
  33.                 tr.AddNewlyCreatedDBObject(stripe, true);
  34.                 collection.Add(stripe.ObjectId);
  35.                 // Point2d yy= new Point2d( stripe.Normal.X, new Vector2d().GetPerpendicularVector().Y);
  36.                 Point3d startPoint = stripe.GetPointAtDist(0.33 * stripe.Length);
  37.                 Vector3d angle = stripe.GetFirstDerivative(stripe.GetParameterAtPoint(startPoint));
  38.                 angle = angle.GetNormal();
  39.                 angle = angle.TransformBy(Matrix3d.Rotation(Math.PI / 2, stripe.Normal, Point3d.Origin));
  40.  
  41.                // Line arrow = new Line(startPoint, startPoint + 500*angle);
  42.  
  43.  
  44.                 Polyline arrow = new Polyline();
  45.                 arrow.SetDatabaseDefaults();
  46.                 arrow.AddVertexAt(0, new Point2d(startPoint.X, (startPoint + 500*angle).Y - 0.33), 0, 0, thickness * 3);
  47.                 arrow.AddVertexAt(1, new Point2d(startPoint.X, (startPoint + 500 * angle).Y - (0.33 * stripeLength)), 0, 0, 0);
  48.                 arrow.AddVertexAt(2, new Point2d(startPoint.X, (startPoint + 500 * angle).Y - (stripeLength * 1.2)), 0, 0, 0);
  49.  
  50.                 arrow.LineWeight = LineWeight.ByLineWeightDefault;
  51.                 arrow.Layer = "0";
  52.                 btr.AppendEntity(arrow);
  53.                 tr.AddNewlyCreatedDBObject(arrow, true);
  54.                 collection.Add(arrow.ObjectId);
  55.                 tr.Commit();
  56.             }
  57.  
  58.         }
  59. }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Atomohod,
Если просишь помощи, то не поленись и сделай нормальный пример, который можно откомпилировать и проверить и который не требует написания дополнительных функций.
P.S.:
Похоже ошибка тут:
Код - C# [Выбрать]
  1. arrow.AddVertexAt(0, new Point2d(startPoint.X, (startPoint + 500*angle).Y - 0.33), 0, 0, thickness * 3);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
ОЙ, я извиняюсь-забыл про подключаемые ссылки. Исправляюсь.
Код - C# [Выбрать]
  1.  
  2. [CommandMethod("0sec", CommandFlags.UsePickSet)]
  3.             public static void DoSection()
  4.             {
  5.                 Crossection cs = new Crossection();
  6.                 cs.CreateSectionMark();
  7.             }
  8. public class Crossection
  9.     {
  10.         private static Point3d pL = GetPointFromUser("Set left point");
  11.         private static Point3d pR = GetPointFromUser("Set right point");
  12.         private static int stripeLength = 500;
  13.         private static int thickness = 5;
  14.  
  15.         public void CreateSectionMark()
  16.         {
  17.  
  18.             //--------------------------------------------------------------------Mandatory variables
  19.             Document doc = Application.DocumentManager.MdiActiveDocument;
  20.             Database db = doc.Database;
  21.             Editor ed = doc.Editor;
  22.             Transaction tr = db.TransactionManager.StartTransaction();
  23.             //--------------------------------------------------------------------Mandatory variables
  24.             ObjectIdCollection collection = new ObjectIdCollection();
  25.             using (tr)
  26.             {
  27.                 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  28.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  29.  
  30.                 Polyline stripe = new Polyline();
  31.                 stripe.SetDatabaseDefaults();
  32.                 stripe.AddVertexAt(0, new Point2d(pL.X, pL.Y), 0, thickness, thickness);
  33.                 stripe.AddVertexAt(1, new Point2d(pR.X, pR.Y), 0, thickness, thickness);
  34.  
  35.                 stripe.LineWeight = LineWeight.ByLineWeightDefault;
  36.                 stripe.Layer = "0";
  37.                 btr.AppendEntity(stripe);
  38.                 tr.AddNewlyCreatedDBObject(stripe, true);
  39.                 collection.Add(stripe.ObjectId);
  40.                 // Point2d yy= new Point2d( stripe.Normal.X, new Vector2d().GetPerpendicularVector().Y);
  41.                 Point3d startPoint = stripe.GetPointAtDist(0.33 * stripe.Length);
  42.                 Vector3d angle = stripe.GetFirstDerivative(stripe.GetParameterAtPoint(startPoint));
  43.                 angle = angle.GetNormal();
  44.                 angle = angle.TransformBy(Matrix3d.Rotation(Math.PI / 2, stripe.Normal, Point3d.Origin));
  45.  
  46.                // Line arrow = new Line(startPoint, startPoint + 500*angle);
  47.  
  48.  
  49.                 Polyline arrow = new Polyline();
  50.                 arrow.SetDatabaseDefaults();
  51.                 arrow.AddVertexAt(0, new Point2d(startPoint.X, startPoint.Y), 0, 0, thickness * 3);
  52.                 arrow.AddVertexAt(1, new Point2d(startPoint.X, (startPoint + 500 * angle).Y - (0.33 * stripeLength)), 0, 0, 0);
  53.                 arrow.AddVertexAt(2, new Point2d(startPoint.X, (startPoint + 500 * angle).Y - (stripeLength * 1.2)), 0, 0, 0);
  54.  
  55.                 arrow.LineWeight = LineWeight.ByLineWeightDefault;
  56.                 arrow.Layer = "0";
  57.                 btr.AppendEntity(arrow);
  58.                 tr.AddNewlyCreatedDBObject(arrow, true);
  59.                 collection.Add(arrow.ObjectId);
  60.                 tr.Commit();
  61.             }
  62.  
  63.         }
  64.         public static Point3d GetPointFromUser(string message)
  65.         {
  66.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  67.             Document doc = Application.DocumentManager.MdiActiveDocument;
  68.             Database db = doc.Database;
  69.             PromptPointOptions pickPoint = new PromptPointOptions(message);
  70.             PromptPointResult insertPoint = ed.GetPoint(pickPoint);
  71.             return insertPoint.Value;
  72.         }}

Отмечено как Решение Atomohod 05-08-2019, 19:49:33

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не уверен, что ты именно этого добиваешься, так как стрелка (на мой взгляд) слишком длинная и узкая:


Код - C# [Выбрать]
  1. // (C) Copyright 2019 by  
  2. //
  3. using System;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.EditorInput;
  9.  
  10. // This line is not mandatory, but improves loading performances
  11. [assembly: CommandClass(typeof(CrossectionMark.MyCommands))]
  12.  
  13. namespace CrossectionMark
  14. {
  15.   public class MyCommands
  16.   {
  17.     [CommandMethod("0sec", CommandFlags.UsePickSet)]
  18.     public static void DoSection()
  19.     {
  20.       Crossection cs = new Crossection();
  21.       cs.CreateSectionMark();
  22.     }
  23.   }
  24.   public class Crossection
  25.   {
  26.     private static int stripeLength = 500;
  27.     private static int thickness = 5;
  28.  
  29.     public void CreateSectionMark()
  30.     {
  31.  
  32.       //--------------------------------------------------------------------Mandatory variables
  33.       Document doc = Application.DocumentManager.MdiActiveDocument;
  34.       Database db = doc.Database;
  35.       Editor ed = doc.Editor;
  36.       Point3d pL = GetPointFromUser("Set left point");
  37.       Point3d pR = GetPointFromUser("Set right point");
  38.  
  39.     Transaction tr = db.TransactionManager.StartTransaction();
  40.       //--------------------------------------------------------------------Mandatory variables
  41.       ObjectIdCollection collection = new ObjectIdCollection();
  42.       using (tr)
  43.       {
  44.         BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
  45.         BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  46.  
  47.         Polyline stripe = new Polyline();
  48.         stripe.SetDatabaseDefaults();
  49.         stripe.AddVertexAt(0, new Point2d(pL.X, pL.Y), 0, thickness, thickness);
  50.         stripe.AddVertexAt(1, new Point2d(pR.X, pR.Y), 0, thickness, thickness);
  51.  
  52.         stripe.LineWeight = LineWeight.ByLineWeightDefault;
  53.         stripe.Layer = "0";
  54.         btr.AppendEntity(stripe);
  55.         tr.AddNewlyCreatedDBObject(stripe, true);
  56.         collection.Add(stripe.ObjectId);
  57.         // Point2d yy= new Point2d( stripe.Normal.X, new Vector2d().GetPerpendicularVector().Y);
  58.         Point3d startPoint = stripe.GetPointAtDist(0.33 * stripe.Length);
  59.         Vector3d perpDir = stripe.GetFirstDerivative(stripe.GetParameterAtPoint(startPoint));
  60.         perpDir = perpDir.GetNormal();
  61.         perpDir = perpDir.TransformBy(Matrix3d.Rotation(Math.PI / 2, stripe.Normal, Point3d.Origin));
  62.  
  63.         // Line arrow = new Line(startPoint, startPoint + 500*angle);
  64.  
  65.  
  66.         Polyline arrow = new Polyline();
  67.         arrow.SetDatabaseDefaults();
  68.         Point2d p1 = new Point2d(startPoint.X, startPoint.Y);
  69.         Point2d p2 = p1 + new Vector2d(perpDir.X, perpDir.Y) * stripeLength / 3.0 * 2.0;
  70.         Point2d p3 = p1 + new Vector2d(perpDir.X, perpDir.Y) * stripeLength;
  71.         arrow.AddVertexAt(0, p1, 0, 0, 0);
  72.         arrow.AddVertexAt(1, p2, 0, thickness, 0);
  73.         arrow.AddVertexAt(2, p3, 0, 0, 0);
  74.  
  75.         arrow.LineWeight = LineWeight.ByLineWeightDefault;
  76.         arrow.Layer = "0";
  77.         btr.AppendEntity(arrow);
  78.         tr.AddNewlyCreatedDBObject(arrow, true);
  79.         collection.Add(arrow.ObjectId);
  80.         tr.Commit();
  81.       }
  82.  
  83.     }
  84.     public static Point3d GetPointFromUser(string message)
  85.     {
  86.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  87.       Document doc = Application.DocumentManager.MdiActiveDocument;
  88.       Database db = doc.Database;
  89.       PromptPointOptions pickPoint = new PromptPointOptions(message);
  90.       PromptPointResult insertPoint = ed.GetPoint(pickPoint);
  91.       return insertPoint.Value;
  92.     }
  93.   }
  94. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение