ADN Club > Civil 3D API
Список элементов сети AutoCAD Civil
alz:
--- Цитата: D_TRex от 16-02-2023, 06:07:10 ---Да я уже понял что не всё так просто, вчера смог получить все имена сетей, потом семейства труб (колодцев), далее типоразмеры по выбранному семейству, а вот то что мне надо было получить для редактирования - отметка начала (конца) трубы и глубина заложения, пока ни как.
--- Конец цитаты ---
что бы получить эти сведения нужно получить саму трубу, либо через выбор пользователя, либо через network.GetPipeIds(); получаешь ObjectId всех труб и уже фильтруешь какая тебе нужна(можно получить связанные колодцы). Отметка доступна только центра трубы, находится в параметре pipe.StartPoint/pipe.EndPoint которые возвращают Point3D начала и конца трубы (оси) (отметку лотка или верха можно получить через параметры pipe.InnerDiameterOrWidth (внутренний диаметр) и pipe.WallThickness(толщина стенки)).
Глубину заложения можно получить получив отметку поверхности в соответствующей точке (StartPoint/EndPoint). Поверхность можно выбрать из списка всех поверхностей или получив собственно из сети, если в сети она выбрана (network.ReferenceSurfaceId - ObjectId связанной поверхности).
Семейства труб и типоразмеры могут пригодиться для замены труб на другой типоразмер или семейство.
D_TRex:
Да в общих чертах вот так, только не учёл что это отметка центра трубы, считать то смог, теперь надо редактировать.
Вопрос как завершить в данном случае транзакцию, а то чертёж плавает
Глубину заложения не понял как получить, я пробовал брать по колодцам, но колодец сам не всегда находится на поверхности
--- Код - vb.net [Выбрать] --- Using tr As Transaction = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction() Dim doc As CivilDocument = CivilApplication.ActiveDocument Dim oIdCollection As ObjectIdCollection = doc.GetPipeNetworkIds() Dim objId As ObjectId = oIdCollection(cmbNetwork.SelectedIndex) Dim oNetwork As Network = TryCast(tr.GetObject(objId, OpenMode.ForRead), Network) Dim pl As PartsList = tr.GetObject(oNetwork.PartsListId, OpenMode.ForRead, False, True) SelectPartFamily(pl.ObjectId, DomainType.Pipe, cmbPipeStyle, "pipe") SelectPartFamily(pl.ObjectId, DomainType.Structure, cmbStructureStyle, "struct") Dim pipeOIC As ObjectIdCollection = oNetwork.GetPipeIds() Dim structureOIC As ObjectIdCollection = oNetwork.GetStructureIds() lblStatus.Text = "Выбрана сеть - " & oNetwork.Name & ", содержит труб - " & pipeOIC.Count & " и колодцев - " & structureOIC.Count grdStruct.Rows.Clear() ' заполняю таблицу колодцев For i = 0 To structureOIC.Count - 1 Dim cStruct As [Structure] = tr.GetObject(structureOIC.Item(i), OpenMode.ForRead, False, True) grdStruct.Rows.Add() grdStruct.Rows(i).HeaderCell.Value = Str(i + 1) grdStruct.Item(colSIDS.Index, i).Value = cStruct.ObjectId grdStruct.Item(colSName.Index, i).Value = cStruct.Name grdStruct.Item(colSPrim.Index, i).Value = cStruct.Description grdStruct.Item(colSSurf.Index, i).Value = cStruct.RefSurfaceName grdStruct.Item(colSX.Index, i).Value = cStruct.Position(0) grdStruct.Item(colSY.Index, i).Value = cStruct.Position(1) grdStruct.Item(colSZ.Index, i).Value = cStruct.Position(2) Next grdPipe.Rows.Clear() ' заполняю таблицу труб Dim dlina(0 To 1) As Single dlina(0) = 0 dlina(1) = 0 For i = 0 To pipeOIC.Count - 1 Dim cPipe As Pipe = tr.GetObject(pipeOIC.Item(i), OpenMode.ForRead, False, True) grdPipe.Rows.Add() grdPipe.Rows(i).HeaderCell.Value = Str(i + 1) grdPipe.Item(colPIds.Index, i).Value = cPipe.ObjectId grdPipe.Item(colPName.Index, i).Value = cPipe.Name grdPipe.Item(colPPrim.Index, i).Value = cPipe.Description grdPipe.Item(colPSurf.Index, i).Value = cPipe.RefSurfaceName grdPipe.Item(colPUkon.Index, i).Value = cPipe.Slope * 1000 grdPipe.Item(colSurN.Index, i).Value = cPipe.StartStructureId grdPipe.Item(colXN.Index, i).Value = cPipe.StartPoint(0) grdPipe.Item(colYN.Index, i).Value = cPipe.StartPoint(1) grdPipe.Item(colPOtmN.Index, i).Value = cPipe.StartPoint(2) grdPipe.Item(colSurK.Index, i).Value = cPipe.EndStructureId grdPipe.Item(colXK.Index, i).Value = cPipe.EndPoint(0) grdPipe.Item(colYK.Index, i).Value = cPipe.EndPoint(1) grdPipe.Item(colPOtmK.Index, i).Value = cPipe.EndPoint(2) grdPipe.Item(colPDlina2.Index, i).Value = ((cPipe.StartPoint(0) - cPipe.EndPoint(0)) ^ 2 + (cPipe.StartPoint(1) - cPipe.EndPoint(1)) ^ 2) ^ 0.5 dlina(0) = dlina(0) + grdPipe.Item(colPDlina2.Index, i).Value 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 dlina(1) = dlina(1) + grdPipe.Item(colDlina3.Index, i).Value ' ищю колодец для получения глубины трубы X = 0 For pi = 0 To grdStruct.RowCount - 1 If cPipe.StartStructureId = grdStruct.Item(colSIDS.Index, pi).Value Then grdPipe.Item(colDethN.Index, i).Value = FormatNumber(grdStruct.Item(colSZ.Index, pi).Value - cPipe.StartPoint(2), 2) X = X + 1 End If If cPipe.EndStructureId = grdStruct.Item(colSIDS.Index, pi).Value Then grdPipe.Item(colDethK.Index, i).Value = FormatNumber(grdStruct.Item(colSZ.Index, pi).Value - cPipe.EndPoint(2), 2) X = X + 1 End If ' If X = 2 Then ' выхожу из цикла, по идее больше данных не должно быть ' Exit For ' End If Next Next lblStatus.Text = lblStatus.Text & ". 2D длина " & FormatNumber(dlina(0), 2) & ", 3D длина " & FormatNumber(dlina(1), 2) End Using
alz:
--- Цитата: D_TRex от 16-02-2023, 08:56:55 ---Вопрос как завершить в данном случае транзакцию, а то чертёж плавает
Глубину заложения не понял как получить, я пробовал брать по колодцам, но колодец сам не всегда находится на поверхности
--- Конец цитаты ---
VB я не знаю как язык, но что-то мне подсказывает не хватает tr.commit() перед End Using
По поводу глубины заложения я тебе написал выше, она считается от поверхности цивила Autodesk.Civil.DatabaseServices.Surface (если она конечно присутствует, если нет то о какой глубине заложения может идти речь?), не путать с автокадовским объектом Surface.
Получение отметок поверхности:
--- Код - C# [Выбрать] ---using (Transaction tr = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction()){ using (Autodesk.Civil.DatabaseServices.Surface base_surf = tr.GetObject(base_surf_id, OpenMode.ForRead, false, true) as Autodesk.Civil.DatabaseServices.Surface) { //устанавливаем отметку по поверхности, если за пределами то по средней отметке поверхности. try { start_height = base_surf.FindElevationAtXY(start_structure.Value.X, start_structure.Value.Y); } catch { GeneralSurfaceProperties gsp = base_surf.GetGeneralProperties(); start_height = gsp.MeanElevation; } try { end_height = base_surf.FindElevationAtXY(end_structure.Value.X, end_structure.Value.Y); } catch { GeneralSurfaceProperties gsp = base_surf.GetGeneralProperties(); end_height = gsp.MeanElevation; } } tr.Commit();}
D_TRex:
alz, Конечно решение это все Ваши советы, но пометить можно только одно. Спасибо большое.
D_TRex:
При построении трассы из элементов сети можно выбрать начальный и конечный колодец, а трубы и колодцы между выбранными колодцами будут выбраны автоматически, я встречал код, но как формулировал запрос не помню, ни кто не подскажет?
Навигация
Перейти к полной версии