получить 3d тело вращением по поперечному разрезу

Автор Тема: получить 3d тело вращением по поперечному разрезу  (Прочитано 10396 раз)

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

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

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
в AutoCAD API (2010-2015)
Подскажите есть ли в AutoCAD API методы с помощью которых можно было бы получить
объект 3dSolid, как тело вращения по замкнутому контуру поперечного разреза.
Т.е. программно сделать то, что делает команда _REVOLVE

 делаю так:

Код - vb.net [Выбрать]
  1. Imports CAD_DBS = Autodesk.AutoCAD.DatabaseServices
  2. Imports CAD_GEO = Autodesk.AutoCAD.Geometry
  3.             ' plcontur - полилиния замкнутая лежит в плоскости (X;Y)
  4.  Public Function acadnet_3d_primitive_set_3dBody_from_pline_contur(ByVal plcontur As CAD_DBS.Polyline)
  5.             Try
  6.                 Dim rot3dbody As CAD_DBS.Solid3d = New CAD_DBS.Solid3d
  7.                 ' получить тело вращения
  8.                 rot3dbody.CreateRevolvedSolid(plcontur, New CAD_GEO.Point3d(0, 0, 0), _
  9.                                               CAD_GEO.Vector3d.XAxis, 2 * Math.PI, 0, New CAD_DBS.RevolveOptions)
  10.                 Return rot3dbody
  11.             Catch ex As System.Exception
  12.                 MsgBox(ex.Message)
  13.                 Return Nothing
  14.             End Try
  15. End function

не могу понять почему ошибка ввода? какие параметры неверно передал
« Последнее редактирование: 19-02-2015, 11:53:04 от Алексей (IdeaSoft) »

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю что ошибка здесь: CAD_DBS.RevolveOptions
Передавать нужно значение, а не тип.
Посмотри пример: http://through-the-interface.typepad.com/through_the_interface/2010/09/revolving-an-autocad-solid-using-net.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
http://through-the-interface.typepad.com/through_the_interface/2010/09/revolving-an-autocad-solid-using-net.html

На эту страницу тоже заходил смотрел
делал так как написано
RevolveOptionsBuilder rob = new RevolveOptionsBuilder();
        rob.CloseToAxis = false;
        rob.DraftAngle = 0;
        rob.TwistAngle = 0;
и что-то тоже ошибка.

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Проверь полностью код Киана.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Проверь полностью код Киана.

Посмотрел код Киана (нужная команда "RAA")
В коде все стандартное вопросов нет стартует транзакцию, выбирает элементы, "делает дело" , добавляет примитив в базу, вызывает в конце комит.
Главная часть кода которая вращает тело вот:

        RevolveOptionsBuilder rob = new RevolveOptionsBuilder();
        rob.CloseToAxis = false;
        rob.DraftAngle = 0;
        rob.TwistAngle = 0;
 
        // Create our solid and revolve our profile
 
        Solid3d sol = new Solid3d();
 
        sol.RecordHistory = true;
 
        sol.CreateRevolvedSolid(
          prof,
          cur.StartPoint,
          cur.EndPoint.GetAsVector() - cur.StartPoint.GetAsVector(),
          2 * Math.PI, // Go all the way round
          0,
          rob.ToRevolveOptions()
        );

« Последнее редактирование: 19-02-2015, 23:59:40 от Алексей (IdeaSoft) »

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Я просил не посмотреть код, а проверить его работоспособность с твоими данными. Если код работает, то внимательно перепроверь свой. Если не работает, то нужно разбираться с данными.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Я просил не посмотреть код

Я проверил работу кода Киана - красавец все работает как всегда безупречен.
Значит буду у себя смотреть косяки
« Последнее редактирование: 19-02-2015, 23:59:26 от Алексей (IdeaSoft) »

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
У Киана задача в кода построена на том, что пользователь выбирает примитивы, а моя задача состоит в том,
чтобы примитив не выбирать, а к примеру, по его ObjectID получить Entity и передать в функцию вращения.

Я обратил внимание на то, что в коде у Киана есть вызовы метода AddAllowedClass

Метод AddAllowedClass связан с классом Autodesk.AutoCAD.EditorInput, а мне выбирать объекты не нужно.
Как обойти или найти замену этому методу AddAllowedClass пока не найду?

« Последнее редактирование: 19-02-2015, 23:59:13 от Алексей (IdeaSoft) »

Отмечено как Решение Алексей (IdeaSoft) 20-02-2015, 01:13:27

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Если тебе известно ObjectId, то ты пропускаеш этап выбора и просто используешь транзакцию для открытия объекта. Мне кажется, что ты это делал уже много раз и ничего сложного в этом я не вижу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Если тебе известно ObjectId, то ты пропускаеш этап выбора

Я так и сделал этап выбора пропустил.
Решил проблему так:
Взял маленький кусочек кода Киана, где делается поворот скомпилировал dll на C# и прикрепил
сборочку к своему проекту на VB.
Почему не работает код на VB понять не могу. Работает на C# и хорошо!
Из своего проекта на VB вызываю метод поворота передав известный мне id и все работает хорошо.
 

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Решил освежить в своей памяти эту задачку

сделал проект C#

Использую в проектах API acad 2012 64 bit

вот код класса проекта

Код - C# [Выбрать]
  1. using CAD_GEO = Autodesk.AutoCAD.Geometry;
  2. using CAD_DBS = Autodesk.AutoCAD.DatabaseServices;
  3.  
  4. namespace psm_cfunc
  5. {
  6.     public class psm_functions  {
  7.         public CAD_DBS.Solid3d acadnet_craete_Body_revol(CAD_DBS.Entity profObj,
  8.                                                          CAD_GEO.Point3d p1,
  9.                                                          CAD_GEO.Point3d p2,
  10.                                                          double Ang) {
  11.             CAD_DBS.RevolveOptionsBuilder rob = new CAD_DBS.RevolveOptionsBuilder();
  12.             rob.CloseToAxis = false;
  13.             rob.DraftAngle = 0;
  14.             rob.TwistAngle = 0;
  15.             CAD_DBS.Solid3d sol = new CAD_DBS.Solid3d();
  16.             sol.RecordHistory = true;
  17.             sol.CreateRevolvedSolid(profObj, p1,
  18.                                     p2.GetAsVector() - p1.GetAsVector(),
  19.                                     Ang, 0, rob.ToRevolveOptions());
  20.             return sol;
  21.         }
  22.     }
  23. }


Тестовый пример вызываю из проекта на VB
вот так:

Код - vb.net [Выбрать]
  1. Imports CFunc = psm_cfunc.psm_functions ' импорт проекта из C#
  2.  
  3. ...
  4.  
  5. Dim CF As CFunc = New CFunc
  6. ...
  7.  
  8.                Dim Prof As CAD_DBS.Entity = acadnet_Primitive_GetByHandle(GetH) ' беру примитив профиля сечения тут все норм объект есть в чертеже
  9.                 Try
  10.                     '  точки оси вращения Z
  11.                     Dim pz1 = New CAD_GEO.Point3d(0, 0, -1)
  12.                     Dim pz2 = New CAD_GEO.Point3d(0, 0, 1)
  13.                     Dim ent As CAD_DBS.Entity = CF.acadnet_craete_Body_revol(Prof, pz1, pz2, Math.PI * 2)
  14.                 Catch ex As Exception
  15.                     MsgBox(ex.Message) '   ????? сообщает ошибку еInvalidInput
  16.                 End Try
  17.  

Сообщает ошибку еInvalidInput
Какие аргументы я неверно передал в функцию acadnet_craete_Body_revol?





Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Вообщем разобрался.
Похоже функция CreateRevolvedSolid работает только с объектами,
которые были добавлены в базу
Если просто передать Prof и Cur в функцию (как объекты Entity) , то eInvalidInput

Вот такой код у меня заработал

Только один вопрос остался:

Функция возвращает объект CAD_DBS.Entity.
Нужно отслеживать чтобы не было утечки памяти возвращаемого объекта.


Код - C# [Выбрать]
  1.        
  2. public CAD_DBS.Entity RevolveAroundAxis_1(CAD_DBS.ObjectId idProf,
  3.                                                   CAD_DBS.ObjectId idcur,
  4.                                                   CAD_DBS.Database db,
  5.                                                   double Ang,
  6.                                                   double StartAng )  {
  7.             Transaction tr =  db.TransactionManager.StartTransaction();
  8.             using (tr) {
  9.                 Entity prof = (Entity)tr.GetObject(idProf, OpenMode.ForRead);
  10.                 Curve cur = (Curve)tr.GetObject(idcur, OpenMode.ForRead);
  11.                 RevolveOptionsBuilder rob = new RevolveOptionsBuilder();
  12.                 rob.CloseToAxis = false;
  13.                 rob.DraftAngle = 0;
  14.                 rob.TwistAngle = 0;
  15.                 Solid3d sol = new Solid3d();
  16.                 sol.RecordHistory = true;
  17.                 sol.CreateRevolvedSolid(
  18.                     prof, cur.StartPoint,
  19.                     cur.EndPoint.GetAsVector() - cur.StartPoint.GetAsVector(),
  20.                     Ang, StartAng, rob.ToRevolveOptions());
  21.                 tr.Commit();
  22.                 return sol;
  23.             }
  24.         }

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

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Вообщем разобрался.
Похоже функция CreateRevolvedSolid работает только с объектами,
которые были добавлены в базу
Если просто передать Prof и Cur в функцию (как объекты Entity) , то eInvalidInput
Судя по этому коду ты не прав: http://adndevblog.typepad.com/autocad/2015/07/how-to-remove-the-profile-to-revolve-after-forming-the-revolved-solid.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Судя по этому коды ты не прав
Этот код я тоже рассматривал ранее.
Тогда еще раз проверю может и действительно не обязательно добавлять объекты в базу данных.
А то сам понимаешь добавлять объекты профиля и оси вращения (как временные)
в базу, для того чтобы потом их удалить - как-то не хорошо.

 

« Последнее редактирование: 29-11-2016, 09:25:10 от Алексей (IdeaSoft) »