Список элементов сети AutoCAD Civil

Автор Тема: Список элементов сети AutoCAD Civil  (Прочитано 12689 раз)

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Здравствуйте видел макрос для редактирования труб и колодцев Civil, хочу сделать под свои задачи, для этого надо получить список труб (колодцев).

Собственно к вопросу. Ткните пожалуйста в пример получения списка труб, я находил но там пример создания труб (а мне это не надо), ещё хорошо бы знать какие библиотеки должны быть подключены.

Код - vb.net [Выбрать]
  1.     Public Sub AddPipe()
  2.         Dim doc As CivilDocument = CivilApplication.ActiveDocument
  3.         Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
  4.  
  5.         Using ts As Transaction = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction()
  6.             Dim oIdCollection As ObjectIdCollection = doc.GetPipeNetworkIds()
  7.             Dim objId As ObjectId = oIdCollection(0)
  8.             Dim oNetwork As Network = TryCast(ts.GetObject(objId, OpenMode.ForWrite), Network)
  9.             ed.WriteMessage("Pipe Network: {0}" & vbLf, oNetwork.Name)
  10.             Dim pid As ObjectId = oNetwork.PartsListId
  11.             Dim pl As PartsList = TryCast(ts.GetObject(pid, OpenMode.ForWrite), PartsList)
  12.             Dim oid As ObjectId = pl("Concrete Pipe")
  13.             Dim pfa As PartFamily = TryCast(ts.GetObject(oid, OpenMode.ForWrite), PartFamily)
  14.             Dim psize As ObjectId = pfa(0)
  15.             Dim line As LineSegment3d = New LineSegment3d(New Point3d(30, 9, 0), New Point3d(33, 7, 0))
  16.             Dim col As ObjectIdCollection = oNetwork.GetPipeIds()
  17.             Dim oidNewPipe As ObjectId = ObjectId.Null
  18.             oNetwork.AddLinePipe(oid, psize, line, oidNewPipe, False)
  19.             Dim oNewPipe As Pipe = TryCast(ts.GetObject(oidNewPipe, OpenMode.ForRead), Pipe)
  20.             ed.WriteMessage("Pipe created: {0}" & vbLf, oNewPipe.DisplayName)
  21.             ts.Commit()
  22.         End Using
  23.     End Sub
  24.  
Вот код создания труб из данного форума, (исходник само собой был не VB).

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Список элементов сети AutoCAD Civil
« Ответ #1 : 15-02-2023, 11:12:54 »
Ну собственно кусок моего кода, но ты точно уверен что в том разделе создал тему?

Код - C# [Выбрать]
  1. using (Transaction tr = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  2. {
  3.         //получаем сеть
  4.         using (Network network = tr.GetObject(networkId, OpenMode.ForRead, false, true) as Network)
  5.         {
  6.               //получаем список труб и колодцев
  7.               PartsList partsList = tr.GetObject(network.PartsListId, OpenMode.ForRead, false, true) as PartsList;
  8.               if (partsList != null)
  9.               {
  10.                      //создаем коллекцию                                
  11.                      ObjectIdCollection pipe_ids = partsList.GetPartFamilyIdsByDomain(DomainType.Pipe);
  12.                      ObjectIdCollection structure_ids = partsList.GetPartFamilyIdsByDomain(DomainType.Structure);
  13.                }
  14.          }
  15.          tr.commit();
  16. }

Из библиотек именно цивила вроде как AecBaseMgd и AeccDbMgd должно хватить.

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Re: Список элементов сети AutoCAD Civil
« Ответ #2 : 15-02-2023, 11:33:41 »
но ты точно уверен что в том разделе создал тему
Только увидел что есть Civil.Api

 Спасибо, список получил, уже хорошо, теперь буду пробовать как это использовать (если возможно)
« Последнее редактирование: 15-02-2023, 12:07:21 от D_TRex »

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Список элементов сети AutoCAD Civil
« Ответ #3 : 15-02-2023, 21:19:00 »
 Спасибо, список получил, уже хорошо, теперь буду пробовать как это использовать (если возможно)

Что-то я сразу немного не понял что для редактирования.
Текущие элементы в сети получаются методами network.GetPipeIds(); и network.GetStructureIds(); Возвращают ObjectIdCollection.
Код выше позволяет получить базовые части и их размеры для использования в создании новых или редактировании существующих труб и колодцев.

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Re: Список элементов сети AutoCAD Civil
« Ответ #4 : 16-02-2023, 06:07:10 »
Да я уже понял что не всё так просто, вчера смог получить все имена сетей, потом семейства труб (колодцев), далее типоразмеры по выбранному семейству, а вот то что мне надо было получить для редактирования - отметка начала (конца) трубы и глубина заложения, пока ни как.

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Список элементов сети AutoCAD Civil
« Ответ #5 : 16-02-2023, 07:07:57 »
Да я уже понял что не всё так просто, вчера смог получить все имена сетей, потом семейства труб (колодцев), далее типоразмеры по выбранному семейству, а вот то что мне надо было получить для редактирования - отметка начала (конца) трубы и глубина заложения, пока ни как.
что бы получить эти сведения нужно получить саму трубу, либо через выбор пользователя, либо через network.GetPipeIds(); получаешь ObjectId всех труб и уже фильтруешь какая тебе нужна(можно получить связанные колодцы). Отметка доступна только центра трубы, находится в параметре pipe.StartPoint/pipe.EndPoint которые возвращают Point3D начала и конца трубы (оси) (отметку лотка или верха можно получить через параметры pipe.InnerDiameterOrWidth (внутренний диаметр) и pipe.WallThickness(толщина стенки)).
Глубину заложения можно получить получив отметку поверхности в соответствующей точке (StartPoint/EndPoint). Поверхность можно выбрать из списка всех поверхностей или получив собственно из сети, если в сети она выбрана (network.ReferenceSurfaceId - ObjectId связанной поверхности).
Семейства труб и типоразмеры могут пригодиться для замены труб на другой типоразмер или семейство.

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Re: Список элементов сети AutoCAD Civil
« Ответ #6 : 16-02-2023, 08:56:55 »
Да в общих чертах вот так, только не учёл что это отметка центра трубы, считать то смог, теперь надо редактировать.
Вопрос как завершить в данном случае транзакцию, а то чертёж плавает
Глубину заложения не понял как получить, я пробовал брать по колодцам, но колодец сам не всегда находится на поверхности
Код - vb.net [Выбрать]
  1.       Using tr As Transaction = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction()
  2.             Dim doc As CivilDocument = CivilApplication.ActiveDocument
  3.             Dim oIdCollection As ObjectIdCollection = doc.GetPipeNetworkIds()
  4.             Dim objId As ObjectId = oIdCollection(cmbNetwork.SelectedIndex)
  5.             Dim oNetwork As Network = TryCast(tr.GetObject(objId, OpenMode.ForRead), Network)
  6.             Dim pl As PartsList = tr.GetObject(oNetwork.PartsListId, OpenMode.ForRead, False, True)
  7.             SelectPartFamily(pl.ObjectId, DomainType.Pipe, cmbPipeStyle, "pipe")
  8.             SelectPartFamily(pl.ObjectId, DomainType.Structure, cmbStructureStyle, "struct")
  9.             Dim pipeOIC As ObjectIdCollection = oNetwork.GetPipeIds()
  10.             Dim structureOIC As ObjectIdCollection = oNetwork.GetStructureIds()
  11.             lblStatus.Text = "Выбрана сеть - " & oNetwork.Name & ", содержит труб - " & pipeOIC.Count & " и колодцев - " & structureOIC.Count
  12.  
  13.             grdStruct.Rows.Clear() ' заполняю таблицу колодцев
  14.             For i = 0 To structureOIC.Count - 1
  15.                 Dim cStruct As [Structure] = tr.GetObject(structureOIC.Item(i), OpenMode.ForRead, False, True)
  16.                 grdStruct.Rows.Add()
  17.                 grdStruct.Rows(i).HeaderCell.Value = Str(i + 1)
  18.                 grdStruct.Item(colSIDS.Index, i).Value = cStruct.ObjectId
  19.                 grdStruct.Item(colSName.Index, i).Value = cStruct.Name
  20.                 grdStruct.Item(colSPrim.Index, i).Value = cStruct.Description
  21.                 grdStruct.Item(colSSurf.Index, i).Value = cStruct.RefSurfaceName
  22.                 grdStruct.Item(colSX.Index, i).Value = cStruct.Position(0)
  23.                 grdStruct.Item(colSY.Index, i).Value = cStruct.Position(1)
  24.                 grdStruct.Item(colSZ.Index, i).Value = cStruct.Position(2)
  25.             Next
  26.  
  27.             grdPipe.Rows.Clear() ' заполняю таблицу труб
  28.             Dim dlina(0 To 1) As Single
  29.             dlina(0) = 0
  30.             dlina(1) = 0
  31.             For i = 0 To pipeOIC.Count - 1
  32.                 Dim cPipe As Pipe = tr.GetObject(pipeOIC.Item(i), OpenMode.ForRead, False, True)
  33.                 grdPipe.Rows.Add()
  34.                 grdPipe.Rows(i).HeaderCell.Value = Str(i + 1)
  35.                 grdPipe.Item(colPIds.Index, i).Value = cPipe.ObjectId
  36.                 grdPipe.Item(colPName.Index, i).Value = cPipe.Name
  37.                 grdPipe.Item(colPPrim.Index, i).Value = cPipe.Description
  38.                 grdPipe.Item(colPSurf.Index, i).Value = cPipe.RefSurfaceName
  39.                 grdPipe.Item(colPUkon.Index, i).Value = cPipe.Slope * 1000
  40.                 grdPipe.Item(colSurN.Index, i).Value = cPipe.StartStructureId
  41.                 grdPipe.Item(colXN.Index, i).Value = cPipe.StartPoint(0)
  42.                 grdPipe.Item(colYN.Index, i).Value = cPipe.StartPoint(1)
  43.                 grdPipe.Item(colPOtmN.Index, i).Value = cPipe.StartPoint(2)
  44.                 grdPipe.Item(colSurK.Index, i).Value = cPipe.EndStructureId
  45.                 grdPipe.Item(colXK.Index, i).Value = cPipe.EndPoint(0)
  46.                 grdPipe.Item(colYK.Index, i).Value = cPipe.EndPoint(1)
  47.                 grdPipe.Item(colPOtmK.Index, i).Value = cPipe.EndPoint(2)
  48.                 grdPipe.Item(colPDlina2.Index, i).Value = ((cPipe.StartPoint(0) - cPipe.EndPoint(0)) ^ 2 + (cPipe.StartPoint(1) - cPipe.EndPoint(1)) ^ 2) ^ 0.5
  49.                 dlina(0) = dlina(0) + grdPipe.Item(colPDlina2.Index, i).Value
  50.                 grdPipe.Item(colDlina3.Index, i).Value = ((cPipe.StartPoint(0) - cPipe.EndPoint(0)) ^ 2 + (cPipe.StartPoint(1) - cPipe.EndPoint(1)) ^ 2 + (cPipe.StartPoint(2) - cPipe.EndPoint(2)) ^ 2) ^ 0.5
  51.                 dlina(1) = dlina(1) + grdPipe.Item(colDlina3.Index, i).Value
  52.                 ' ищю колодец для получения глубины трубы
  53.                 X = 0
  54.                 For pi = 0 To grdStruct.RowCount - 1
  55.                     If cPipe.StartStructureId = grdStruct.Item(colSIDS.Index, pi).Value Then
  56.                         grdPipe.Item(colDethN.Index, i).Value = FormatNumber(grdStruct.Item(colSZ.Index, pi).Value - cPipe.StartPoint(2), 2)
  57.                         X = X + 1
  58.                     End If
  59.                     If cPipe.EndStructureId = grdStruct.Item(colSIDS.Index, pi).Value Then
  60.                         grdPipe.Item(colDethK.Index, i).Value = FormatNumber(grdStruct.Item(colSZ.Index, pi).Value - cPipe.EndPoint(2), 2)
  61.                         X = X + 1
  62.                     End If
  63.                     ' If X = 2 Then
  64.                     ' выхожу из цикла, по идее больше данных не должно быть
  65.                     ' Exit For
  66.                     ' End If
  67.                 Next
  68.             Next
  69.             lblStatus.Text = lblStatus.Text & ". 2D длина " & FormatNumber(dlina(0), 2) & ", 3D длина " & FormatNumber(dlina(1), 2)
  70.         End Using
« Последнее редактирование: 16-02-2023, 09:29:08 от D_TRex »

Отмечено как Решение D_TRex 16-02-2023, 13:08:03

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Список элементов сети AutoCAD Civil
« Ответ #7 : 16-02-2023, 09:49:44 »
Вопрос как завершить в данном случае транзакцию, а то чертёж плавает
Глубину заложения не понял как получить, я пробовал брать по колодцам, но колодец сам не всегда находится на поверхности
VB я не знаю как язык, но что-то мне подсказывает не хватает tr.commit() перед End Using

По поводу глубины заложения я тебе написал выше, она считается от поверхности цивила Autodesk.Civil.DatabaseServices.Surface (если она конечно присутствует, если нет то о какой глубине заложения может идти речь?), не путать с автокадовским объектом Surface.
Получение отметок поверхности:
Код - C# [Выбрать]
  1. using (Transaction tr = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  2. {
  3.     using (Autodesk.Civil.DatabaseServices.Surface base_surf = tr.GetObject(base_surf_id, OpenMode.ForRead, false, true) as Autodesk.Civil.DatabaseServices.Surface)
  4.     {
  5.  
  6.         //устанавливаем отметку по поверхности, если за пределами то по средней отметке поверхности.
  7.         try
  8.         {
  9.             start_height = base_surf.FindElevationAtXY(start_structure.Value.X, start_structure.Value.Y);
  10.         }
  11.         catch
  12.         {
  13.             GeneralSurfaceProperties gsp = base_surf.GetGeneralProperties();
  14.             start_height = gsp.MeanElevation;
  15.         }
  16.         try
  17.         {
  18.             end_height = base_surf.FindElevationAtXY(end_structure.Value.X, end_structure.Value.Y);
  19.         }
  20.         catch
  21.         {
  22.             GeneralSurfaceProperties gsp = base_surf.GetGeneralProperties();
  23.             end_height = gsp.MeanElevation;
  24.         }
  25.     }
  26.     tr.Commit();
  27. }

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Re: Список элементов сети AutoCAD Civil
« Ответ #8 : 16-02-2023, 13:09:22 »
alz, Конечно решение это все Ваши советы, но пометить можно только одно. Спасибо большое.

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

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Re: Список элементов сети AutoCAD Civil
« Ответ #9 : 23-03-2023, 16:44:28 »
При построении трассы из элементов сети можно выбрать начальный и конечный колодец, а трубы и колодцы между выбранными колодцами будут выбраны автоматически, я встречал код, но как формулировал запрос не помню, ни кто не подскажет?