Создание тела вращением

Автор Тема: Создание тела вращением  (Прочитано 6153 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Создание тела вращением
« : 26-07-2023, 20:48:39 »
Здравствуйте, блин понравилась тема позднего связывания, потому что быстро запускается на отладку и ошибки не глушат кад, короче не суть
Создаю замкнутый контур
Код - vb.net [Выбрать]
  1.         Dim AcadApp As AcadApplication = Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application") ' GetObject(, "Excel.Application")
  2.         Dim AcadDoc As AcadDocument = acadApp.ActiveDocument
  3.         Dim objEnt As Acad3DPolyline
  4.         Dim dblVertices((grdVal.Rows.Count - 1) * 3 - 1) As Double
  5.         For i = 0 To grdVal.Rows.Count - 2
  6.             dblVertices(i * 3) = grdVal.Rows(i).Cells(0).Value : dblVertices(i * 3 + 1) = grdVal.Rows(i).Cells(1).Value : dblVertices(i * 3 + 2) = grdVal.Rows(i).Cells(2).Value
  7.         Next
  8.         If AcadDoc.ActiveSpace = AcActiveSpace.acModelSpace Then
  9.             objEnt = AcadDoc.ModelSpace.Add3DPoly(dblVertices)
  10.         Else
  11.             objEnt = AcadDoc.PaperSpace.Add3DPoly(dblVertices)
  12.         End If
  13.         objEnt.Closed = True
  14.         objEnt.Update()

Далее хочу по этой области создать текст, но не могу понять (по ходу не подходит переменная), прошу подскажите код для моей 3d линии и вообще полез в 3d если есть расшифровки команд пожалуйста поделитесь.
Команда взята из справки
Код - vb.net [Выбрать]
  1. AddRevolvedSolid
, но там строится арка и линия замыкает арку, и его с со смещенным центром натягивают. Не могу адаптировать.
У меня замкнутый контур в плоскости XZ и вращать надо строго по оси Z

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Создание тела вращением
« Ответ #1 : 27-07-2023, 01:30:29 »
Ну, если ты считываешь с экселя то насколько я помню в экселе нумерация идет не с нуля а с единицы, то есть нулевых строки или столбца не бывает
dblVertices(i * 3) = grdVal.Rows(i).Cells(0).Value : dblVertices(i * 3 + 1) = grdVal.Rows(i).Cells(1).Value : dblVertices(i * 3 + 2) = grdVal.Rows(i).Cells(2).Value
вот тут надо так делать
dblVertices(i * 3) = grdVal.Rows(i + 1).Cells(1).Value : dblVertices(i * 3 + 1) = grdVal.Rows(i + 1).Cells(2).Value : dblVertices(i * 3 + 2) = grdVal.Rows(i + 1).Cells(3).Value

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Re: Создание тела вращением
« Ответ #2 : 27-07-2023, 17:33:38 »
alz, нет проблема именно в создании тела, полилиния создалась без проблем

' GetObject(, "Excel.Application") - если Вы про это то как фрагмент кода

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Создание тела вращением
« Ответ #3 : 27-07-2023, 22:45:27 »
D_TRex,
В том примере из справки сначала создается Arc, потом из него Region, а уже к нему применяется метод AddRevolvedSolid. Из 3DPoly ты не можешь сделать Region - его можно создать из массива содержащего только Line, Arc, Circle, Elliptical Arc, LightweightPolyline, Spline т.е. из плоских кривых.
« Последнее редактирование: 27-07-2023, 23:39:22 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Re: Создание тела вращением
« Ответ #4 : 28-07-2023, 07:26:48 »
Александр Ривилис, да хотел обмануть систему, но в принципе все получилось, спасибо за указание допустимых элементов.
Проблема была в создании области, без неё не хотел строить, вот код
Код - vb.net [Выбрать]
  1.         Dim AcadApp As AcadApplication = Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application")
  2.         Dim AcadDoc As AcadDocument = AcadApp.ActiveDocument
  3.         Dim curves(0 To 1) As AcadEntity
  4.  
  5.         ' считываю данные из таблицы и создаю полилинию
  6.         Dim dblVertices((grdVal.Rows.Count - 1) * 2 - 1) As Double
  7.         For i = 0 To grdVal.Rows.Count - 2
  8.             dblVertices(i * 2) = grdVal.Rows(i).Cells(0).Value : dblVertices(i * 2 + 1) = grdVal.Rows(i).Cells(2).Value
  9.         Next
  10.         curves(0) = AcadDoc.ModelSpace.AddLightWeightPolyline(dblVertices)
  11.  
  12.         ' почему то для создания региона надо что бы было два примитива, поэтому отдельно создаю замыкающую линию
  13.         ReDim dblVertices(0 To 3)
  14.         dblVertices(0) = grdVal.Rows(0).Cells(0).Value
  15.         dblVertices(1) = grdVal.Rows(0).Cells(2).Value
  16.         dblVertices(2) = grdVal.Rows(grdVal.Rows.Count - 2).Cells(0).Value
  17.         dblVertices(3) = grdVal.Rows(grdVal.Rows.Count - 2).Cells(2).Value
  18.         curves(1) = AcadDoc.ModelSpace.AddLightWeightPolyline(dblVertices)
  19.  
  20.         ' создаю область из созданных полилиний
  21.         Dim regionObj As Object
  22.         regionObj = AcadDoc.ModelSpace.AddRegion(curves)
  23.  
  24.         ' задаю ось вращения
  25.         Dim axisStart As Object
  26.         Dim axisEnd As Object
  27.         axisStart = CreatePoint(0, 0, 0) ' Начало оси
  28.         axisEnd = CreatePoint(0, 1, 0)   ' Конец оси
  29.         ' угол вращения
  30.         Dim angle As Double
  31.         angle = Math.PI * 2
  32.  
  33.         ' создаю тело
  34.         Dim solidObj As Acad3DSolid
  35.         solidObj = AcadDoc.ModelSpace.AddRevolvedSolid(regionObj(0), axisStart, axisEnd, angle)
  36.  
  37.         ' область не может быть по оси Z поэтому созданное тело вращаю по оси Х
  38.         axisStart = CreatePoint(0, 0, 0) ' Начало оси
  39.         axisEnd = CreatePoint(1, 0, 0)   ' Конец оси
  40.         solidObj.Rotate3D(axisStart, axisEnd, Math.PI * 0.5)
  41.  
  42.         ' удаляю примитивы, не могу выловить область, поэтому буду перебором удалять
  43.         curves(0).Delete()
  44.         curves(1).Delete()
  45.  
  46.         ' перебираю все примитывы для удаление области
  47.         Dim regionsToDelete As New Collection
  48.         ' Loop through all the entities in the model space
  49.         Dim entity As Object
  50.         For Each entity In AcadDoc.ModelSpace
  51.             ' Check if the entity is a region
  52.             If TypeOf entity Is AcadRegion Then
  53.                 ' Add the region to the collection of regions to delete
  54.                 regionsToDelete.Add(entity)
  55.             End If
  56.         Next entity
  57.         ' Loop through the collection of regions to delete and delete each region
  58.         Dim region As Object
  59.         For Each region In regionsToDelete
  60.             region.Delete
  61.         Next region
  62.  
  63.         ' Change the viewing direction of the viewport
  64.         Dim NewDirection(0 To 2) As Double
  65.         NewDirection(0) = -1 : NewDirection(1) = -1 : NewDirection(2) = 1
  66.         AcadDoc.ActiveViewport.Direction = NewDirection
  67.         AcadDoc.ActiveViewport = AcadDoc.ActiveViewport
  68.         AcadDoc.Regen(True)

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Re: Создание тела вращением
« Ответ #5 : 28-07-2023, 21:22:22 »
Но вот на прямую отправить LWPolyline не принимает и один примитив в область не переводит, не пойму в чём проблема и явно объявлял и через тип Object пробовал.

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Создание тела вращением
« Ответ #6 : 29-07-2023, 01:45:33 »
А почему бы не сделать так вместо перебора, вроде бы там просто массив регионов выдает этот метод?

Код - vb.net [Выбрать]
  1.  Dim region As Region
  2.         For Each region In regionObj
  3.             region.Delete
  4.         Next region

вместо

Код - vb.net [Выбрать]
  1.  Dim region As Object
  2.         For Each region In regionsToDelete
  3.             region.Delete
  4.         Next region
а по поводу почему из одного не создает, так потому что не замкнут, регион создается только из замкнутых элементов
надо добавить еще один вертикс в конце с координатами первого, то есть просто замкнуть полилинию, думаю примерно так, но я не спец в vb

Код - vb.net [Выбрать]
  1.  ' считываю данные из таблицы и создаю полилинию
  2.         Dim dblVertices((grdVal.Rows.Count - 1) * 2) As Double
  3.         For i = 0 To grdVal.Rows.Count - 2
  4.             dblVertices(i * 2) = grdVal.Rows(i).Cells(0).Value : dblVertices(i * 2 + 1) = grdVal.Rows(i).Cells(2).Value
  5.         Next
  6.         dblVertices(grdVal.Rows.Count - 1) = grdVal.Rows(0).Cells(0).Value : dblVertices(grdVal.Rows.Count) = grdVal.Rows(0).Cells(2).Value
  7.         curves(0) = AcadDoc.ModelSpace.AddLightWeightPolyline(dblVertices)


и вот ссылка на этот метод
https://help.autodesk.com/view/ACDLT/2024/ENU/?guid=GUID-74C8765E-EB4A-4773-ADD4-6C0F318FE6BE