Вставка блоков

Автор Тема: Вставка блоков  (Прочитано 4090 раз)

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

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Вставка блоков
« : 11-06-2020, 01:48:27 »
Всем привет! Вставляю два блока по очереди( крышка стола, и отверстие в нем), отверстие имеет закрепленные координаты вставки относительно крышки стола. Считываю координаты  и угол вставки крышки стола, добавляю к координатам отверстия, и вставляю под этим же углом. Но это все работает только в том случае,  если угол вставки равен нулю.  Если же я меняю угол вставки на 90 гр, то отверстие вставляется под правильным углом, но в неправильном месте. Я так понимаю, что мне как то надо использовать вектор, но не могу понять как его получить. Подскажите пожалуйста куда копать? Что почитать?

 На рисунке отображена моя проблема. 1- неправильно, 2 правильно


Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: Вставка блоков
« Ответ #1 : 11-06-2020, 07:04:12 »
Подскажите пожалуйста куда копать? Что почитать?

Ты лучше скажи, что нам почитать.
отверстие имеет закрепленные координаты вставки относительно крышки стола
закрепленные координаты, да еще и относительно крышки, а не координат крышки.

Блоков нет, точек вставок блоков не видно. Код не выложил, поэтому непонятно как высчитывал координаты и как поворачивал.
 
Судя по картинке можно предположить, что стол ты повернул относительно точки вставки, а блок отверстия нужно поворачивать не относительно точки вставки блока отверстия, а относительно точки вставки стола.


Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Вставка блоков
« Ответ #2 : 11-06-2020, 08:02:45 »
Если есть координаты вставки блока отверстия относительно точки вставки блока столешницы, то нужно взять матрицу трансформации у блока столешницы (у объекта класса BlockReference есть свойство BlockTransform) и пересчитать по ней координаты вставки блока отверстия, хотя там и повернуть сразу можно... но это уже от реализации зависит.

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка блоков
« Ответ #3 : 12-06-2020, 00:11:42 »
Координаты вставки столешницы выбираются пользователем, а координаты отверстия прописаны в xml файле(откуда я их и считываю).
На первом рисунке, столешница имеет точку вставки (0,0) и угол вставки тоже равен 0.

На втором рисунке, столешница имеет точку вставки (0,0) и угол вставки равен 90.

это как я вставляю столешницу
Код - C# [Выбрать]
  1.  BlockTableRecord btrPn;
  2.  Vector3d[] nodeVectors = null;
  3.  Vector3d firstVector;
  4.                        
  5.  btrPn = (BlockTableRecord)acTrans.GetObject(acBlkTbl[Symbol2D], OpenMode.ForRead);
  6.  firstVector = new Vector3d(btrPn.Origin.X, btrPn.Origin.Y, btrPn.Origin.Z);
  7.  nodeVectors = blockTools.Methods.getBlockReferenceNodeVectors(btrPn, acTrans, firstVector);
  8.  Dictionary<ObjectId, AttInfo> dictAttInfo = null;
  9.  
  10.  if (!brPn.ObjectId.IsNull)
  11.  {
  12.     dictAttInfo = Methods.getDictionaryAttributeInformation(acTrans, btrPn, brPn);
  13.  }
  14.  BlockJig bJig = new BlockJig(acTrans, brPn, dictAttInfo, nodeVectors);
  15.                              
  16. if (bJig.Run() != PromptStatus.OK)
  17.   {
  18.      bJig.Cleanup();
  19.      brPn.Erase();
  20.      acTrans.Commit();
  21.      return ObjectId.Null;
  22.    }
  23.                            
  24. bJig.Cleanup();

Это  как я поворачиваю
Код - C# [Выбрать]
  1. DBObject obj = acTrans.GetObject(insertPn.brPnId, OpenMode.ForRead);
  2. Entity ent = obj as Entity;
  3. insertPn.mgInsertionPoint3d = insertPn.rotationBasePoint;
  4. Point3d rotationPoint = insertPn.rotationBasePoint;
  5. double baseAngle = insertPn.GetStoredRotation(obj);
  6. Matrix3d ucs = acActiveDocEd.CurrentUserCoordinateSystem;
  7. if (ent != null)
  8. {
  9.     if (!insertPn.skipRotating)
  10.    {
  11.       RotateJig rJig = new RotateJig(ent, rotationPoint, baseAngle, ucs);
  12.       PromptResult res = acActiveDocEd.Drag(rJig);
  13.       if (res.Status == PromptStatus.OK)
  14.      {
  15.         rJig.Cleanup();
  16.         rJig.GetEntity().Dispose();                                  
  17.      }
  18.    }
  19.  Matrix3d trans = Matrix3d.Rotation(insertPn.rotationAngle - baseAngle, ucs.CoordinateSystem3d.Zaxis, rotationPoint);
  20.  ent.UpgradeOpen();
  21. ent.TransformBy(trans);
  22. }

Здесь вставка отверстия
Код - C# [Выбрать]
  1.   brPn = new BlockReference(new Point3d(), btrPn.ObjectId);
  2. brPn.Position = point;
  3. brPn.Rotation = Degrees.ToRadians(degrees);
  4. space.AppendEntity(brPn);
  5. acTrans.AddNewlyCreatedDBObject(brPn, true);
  6. insertPn.brPnId = brPn.ObjectId;
  7. Dictionary<ObjectId, AttInfo> dictAttInfo = null;
  8.  if (!brPn.ObjectId.IsNull)
  9.    dictAttInfo = Methods.getDictionaryAttributeInformation(acTrans, btrPn, brPn);
  10.  insertPn.scaleBlockWithAllAttributes(brPn, dictAttInfo, acTrans);
  11.  using (aCommon.SysVarCache sysvars = new aCommon.SysVarCache())
  12.  {
  13.         insertPn.SetSnap();
  14.         BlockJig bJig = new BlockJig(acTrans, brPn, dictAttInfo, nodeVectors);
  15.         bJig.Cleanup();
  16.         insertPn.ResetSnap();
  17. }

Я понимаю что мне как то надо использовать переменную trans , и ее значения передавать при вставке отверстия, но как это сделать я не понимаю.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блоков
« Ответ #4 : 12-06-2020, 00:20:38 »
serhiy79,
А теперь все тоже самое, но с использованием только методов AutoCAD .NET API, а не самописных методов, код которых не предоставили.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 533
  • Карма: 117
Re: Вставка блоков
« Ответ #5 : 12-06-2020, 01:27:03 »
Я понимаю что мне как то надо использовать переменную trans
да, только использовать не переменную, а матрицу поворота, так правильнее
Судя по твоей задаче один раз высчитал и применяешь к каждому из двух блоков

и ее значения передавать при вставке отверстия, но как это сделать я не понимаю
а как должны понять другие, если код выложен не полный?

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка блоков
« Ответ #6 : 12-06-2020, 20:38:41 »
как я понял нужно выложить код этих функций
Код - C# [Выбрать]
  1. public BlockJig(Transaction _acTrans, BlockReference br, Dictionary<ObjectId, AttInfo> _dictAttInfo, Vector3d[] _nodeVectors) : base(br)
  2.         {
  3.             dictAttInfo = _dictAttInfo;
  4.             acTrans = _acTrans;
  5.             nodeVectors = _nodeVectors;
  6.            
  7.             newJigPosition = Point3d.Origin;
  8.             Matrix3d ucsRotation = AcApSrvApp.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;
  9.            
  10.             ucsRotation = ucsRotation.PostMultiplyBy(Matrix3d.Displacement(ucsRotation.Translation));
  11.            
  12.             Entity.TransformBy(ucsRotation);
  13.             nodeVertexIndex = 0;
  14.            
  15.             if (nodeVectors != null && nodeVectors.Length > 0)
  16.                 for (int i = 0; i < nodeVectors.Length; ++i)
  17.                 {
  18.                     nodeVectors[i] = nodeVectors[i].TransformBy(ucsRotation);
  19.                 }
  20.            
  21.             messageFilter = new JigMessageFilter();
  22.             System.Windows.Forms.Application.AddMessageFilter(messageFilter);
  23.             currentJig = this;
  24.         }

Код - C# [Выбрать]
  1.   public RotateJig(Entity ent, Point3d rotationPoint, double baseAngle, Matrix3d ucs) : base(ent.Clone() as Entity)
  2.         {
  3.             m_rotationPoint = rotationPoint;
  4.             m_baseAngle = baseAngle;
  5.             m_ucs = ucs;
  6.             mMsgFilter = new JigMessageFilter();
  7.             System.Windows.Forms.Application.AddMessageFilter(mMsgFilter);
  8.         }
извиняюсь заранее, если не правильно вас понял

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вставка блоков
« Ответ #7 : 12-06-2020, 20:52:04 »
serhiy79,
Понял неправильно. Выкладывай тестовый проект и тестовые блоки (dwg-файлы). Запиши видео (у меня в подписи) как у тебя происходит вставка. Тогда появятся шансы получить помощь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 41
  • Карма: 0
Re: Вставка блоков
« Ответ #8 : 16-06-2020, 02:18:43 »
Я нашел решение к своей проблеме, пришлось вспоминать курс тригонометрии.
А вот здесь точно описывается моя проблема https://abakbot.ru/online-2/91-rotate

В любом случае всем спасибо кто откликнулся и пытался помочь!