объект за мышью при перемещении/копировании

Автор Тема: объект за мышью при перемещении/копировании  (Прочитано 4471 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
собственно говоря это и вопрос.
как сделать, что бы при перемещении/копировании программном объект двигался за мышью, как в автокаде.
здесь пробы пера так сказать, кривые наверняка.
Код - C# [Выбрать]
  1.        
  2. public static void FuncBlockRef(ObjectId oId)
  3.         {
  4.            
  5.             if (oId.IsNull) return;
  6.             Database bdb = oId.Database;
  7.             ed.WriteMessage("\nID Block  : {0}", oId);
  8.             if (bdb != null)
  9.             {
  10.                 using (Transaction bltr = bdb.TransactionManager.StartTransaction())
  11.                 {
  12.                     BlockTableRecord acBtr = (BlockTableRecord)bltr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  13.                     BlockReference br = bltr.GetObject(oId, OpenMode.ForRead) as BlockReference;
  14.                     ed.WriteMessage("***{0}", br.GetType());
  15.                     BlockTableRecord btr =
  16.                         bltr.GetObject(br.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  17.                     try
  18.                     {
  19.                         //BlockTableRecord btr =
  20.                         //    bltr.GetObject(oId, OpenMode.ForRead) as BlockTableRecord;
  21.                         ed.WriteMessage("\nType object btr : {0}", btr.GetType());
  22.                         var brefs = btr.GetBlockReferenceIds(true, true);
  23.                         ed.WriteMessage("\nCount Blocks : {0}", brefs.Count);
  24.                         if (brefs != null && brefs.Count > 0)
  25.                         {
  26.                             foreach (ObjectId id in brefs)
  27.                             {
  28.                                 if (oId.Equals(id))
  29.                                 {
  30.                                     BlockReference brid
  31.                                         = bltr.GetObject(id, OpenMode.ForWrite) as BlockReference;
  32.                                     ed.WriteMessage("\ncomplite to erase.");
  33.                                     Point3d pt = brid.Position;
  34.                                     brid.UpgradeOpen();
  35.                                     //brid.Erase(true);
  36.                                     BlockReference newblk = brid.Clone() as BlockReference;
  37.                                     acBtr.AppendEntity(newblk);
  38.                                     bltr.AddNewlyCreatedDBObject(newblk, true);
  39.                                     PromptPointOptions ppo = new PromptPointOptions("\nSelect point.");
  40.                                     ppo.UseBasePoint = true;
  41.                                     ppo.BasePoint = pt;
  42.                                     ppo.AllowNone = true;
  43.                                     PromptPointResult ppr = ed.GetPoint(ppo);
  44.                                     //newblk.Position = ppr.Value;
  45.                                     var acVector3d = pt.GetVectorTo(ppr.Value);
  46.                                     newblk.TransformBy(Matrix3d.Displacement(acVector3d));
  47.                                 }
  48.                             }
  49.                         }
  50.                        
  51.                     }
  52.                     catch
  53.                     {
  54.                         ed.WriteMessage("\nНичего не получилось.");
  55.                     }
  56.                     bltr.Commit();
  57.                 }
  58.             }
  59.         }
Лень - двигатель прогресса.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Код даже смотреть не стал, так как это какая-то ересь.
Для таких вещей используется Jig (EntityJig или DrawJig). Ну в крайнем случае Editor.Drag (пример здесь: http://through-the-interface.typepad.com/through_the_interface/2010/06/allowing-interactive-dragging-of-a-selection-of-autocad-objects-using-net.html)
Для Jig есть несколько примеров и здесь на форуме. Смотри и изучай.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 53
  • Карма: 0
  • Skype: leoleo3172
Код даже смотреть не стал, так как это какая-то ересь.
Да я представляю. Ну, Москва не сразу строилась.
За наводку спасибо.
Лень - двигатель прогресса.