ADN Club > Civil 3D API

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

<< < (2/2)

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:
При построении трассы из элементов сети можно выбрать начальный и конечный колодец, а трубы и колодцы между выбранными колодцами будут выбраны автоматически, я встречал код, но как формулировал запрос не помню, ни кто не подскажет?

Навигация

[0] Главная страница сообщений

[*] Предыдущая страница

Перейти к полной версии