ADN Club > Civil 3D API
Выделение и отображение примитива Civil
D_TRex:
В Civil есть возможность выделения и отображения (то есть фокусировки экрана) на примитиве из таблицы. Как это сделать программно? То есть я собрал таблицу элементов с нужным мне форматированием (просто штатная почему то ужасно тормозит), но что бы сохранить функционал нужно реализовать указанную задачу
alz:
Гугл сломался? ))) Задача то простая, накидал по быстрому, вроде работает, может даже когда-то пригодится)
--- Код - C# [Выбрать] ---Document aDoc = Application.DocumentManager.MdiActiveDocument;Editor ed = aDoc.Editor;Database db = aDoc.Database;using (Transaction tr = db.TransactionManager.StartTransaction()){ //получаем трубу using (Pipe pipe = tr.GetObject(obid, OpenMode.ForRead, false, true) as Pipe) { if (!pipe.OwnerId.Equals(db.CurrentSpaceId)) { tr.Commit(); return; } //если у трубы есть границы, фиг знает в каких случаях их нет но походу это возможно if (pipe.Bounds.HasValue) { Extents3d extents = pipe.Bounds.Value; //получаем текущий вид using (ViewTableRecord view = ed.GetCurrentView()) { // Translate WCS coordinates to DCS // кусок кода из интернета, получает матрицу для перевода координат мировой системы // в систему координат экрана и переводит координаты границ трубы в координаты экрана // как работает хз, разбираться надо Matrix3d matWCS2DCS; matWCS2DCS = Matrix3d.PlaneToWorld(view.ViewDirection); matWCS2DCS = Matrix3d.Displacement(view.Target - Point3d.Origin) * matWCS2DCS; matWCS2DCS = Matrix3d.Rotation(-view.ViewTwist, view.ViewDirection, view.Target) * matWCS2DCS; matWCS2DCS = matWCS2DCS.Inverse(); extents.TransformBy(matWCS2DCS); //устанавливаем центральную точку на центр объекта и габариты экрана на габариты объекта view.CenterPoint = new Point2d((extents.MinPoint.X + extents.MaxPoint.X)/2, (extents.MinPoint.Y + extents.MaxPoint.Y) / 2); view.Height = extents.MaxPoint.Y - extents.MinPoint.Y; view.Width = extents.MaxPoint.X - extents.MinPoint.X; //устанавливаем вид по исправленному ed.SetCurrentView(view); } } } ed.SetImpliedSelection(new List<ObjectId> { obid } .ToArray()); tr.Commit();}
D_TRex:
Здравствуйте, нет гугл не сломался, просто может потому что я ищу на VB потому и не нахожу, может запрос не верно пишу, спасибо Вам и за ответ и за намёк что лучше искать чем спрашивать на специализированном форуме. Нашёл я решение почти в тот же день в справке, вот может тоже кому пригодится
--- Код - vb.net [Выбрать] ---Public Sub Zoom(ByVal pMin As Point3d, ByVal pMax As Point3d, ByVal pCenter As Point3d, ByVal dFactor As Double) '' Get the current document and database Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument Dim acCurDb As Database = acDoc.Database Dim nCurVport As Integer = System.Convert.ToInt32(Application.GetSystemVariable("CVPORT")) '' Get the extents of the current space when no points '' or only a center point is provided '' Check to see if Model space is current If acCurDb.TileMode = True Then If pMin.Equals(New Point3d()) = True And pMax.Equals(New Point3d()) = True Then pMin = acCurDb.Extmin pMax = acCurDb.Extmax End If Else '' Check to see if Paper space is current If nCurVport = 1 Then If pMin.Equals(New Point3d()) = True And pMax.Equals(New Point3d()) = True Then pMin = acCurDb.Pextmin pMax = acCurDb.Pextmax End If Else '' Get the extents of Model space If pMin.Equals(New Point3d()) = True And pMax.Equals(New Point3d()) = True Then pMin = acCurDb.Extmin pMax = acCurDb.Extmax End If End If End If '' Start a transaction Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction() '' Get the current view Using acView As ViewTableRecord = acDoc.Editor.GetCurrentView() Dim eExtents As Extents3d '' Translate WCS coordinates to DCS Dim matWCS2DCS As Matrix3d matWCS2DCS = Matrix3d.PlaneToWorld(acView.ViewDirection) matWCS2DCS = Matrix3d.Displacement(acView.Target - Point3d.Origin) * matWCS2DCS matWCS2DCS = Matrix3d.Rotation(-acView.ViewTwist, acView.ViewDirection, acView.Target) * matWCS2DCS '' If a center point is specified, define the min and max '' point of the extents '' for Center and Scale modes If pCenter.DistanceTo(Point3d.Origin) <> 0 Then pMin = New Point3d(pCenter.X - (acView.Width / 2), pCenter.Y - (acView.Height / 2), 0) pMax = New Point3d((acView.Width / 2) + pCenter.X, (acView.Height / 2) + pCenter.Y, 0) End If '' Create an extents object using a line Using acLine As Line = New Line(pMin, pMax) eExtents = New Extents3d(acLine.Bounds.Value.MinPoint, acLine.Bounds.Value.MaxPoint) End Using '' Calculate the ratio between the width and height of the current view Dim dViewRatio As Double dViewRatio = (acView.Width / acView.Height) '' Tranform the extents of the view matWCS2DCS = matWCS2DCS.Inverse() eExtents.TransformBy(matWCS2DCS) Dim dWidth As Double Dim dHeight As Double Dim pNewCentPt As Point2d '' Check to see if a center point was provided (Center and Scale modes) If pCenter.DistanceTo(Point3d.Origin) <> 0 Then dWidth = acView.Width dHeight = acView.Height If dFactor = 0 Then pCenter = pCenter.TransformBy(matWCS2DCS) End If pNewCentPt = New Point2d(pCenter.X, pCenter.Y) Else '' Working in Window, Extents and Limits mode '' Calculate the new width and height of the current view dWidth = eExtents.MaxPoint.X - eExtents.MinPoint.X dHeight = eExtents.MaxPoint.Y - eExtents.MinPoint.Y '' Get the center of the view pNewCentPt = New Point2d(((eExtents.MaxPoint.X + eExtents.MinPoint.X) * 0.5), ((eExtents.MaxPoint.Y + eExtents.MinPoint.Y) * 0.5)) End If '' Check to see if the new width fits in current window If dWidth > (dHeight * dViewRatio) Then dHeight = dWidth / dViewRatio '' Resize and scale the view If dFactor <> 0 Then acView.Height = dHeight * dFactor acView.Width = dWidth * dFactor End If '' Set the center of the view acView.CenterPoint = pNewCentPt '' Set the current view acDoc.Editor.SetCurrentView(acView) End Using '' Commit the changes acTrans.Commit() End Using End SubВы мне в своё время очень помогли (если я правильно помню), потому что я после простого автокада ни как не мог понять как и к чему обращаться, но Ваш ответ не полный, мне нужно было не только приблизить, но и выделить элемент. Поэтому пометить решением ни как не могу.
alz:
--- Цитата: D_TRex от 28-02-2023, 05:27:35 ---мне нужно было не только приблизить, но и выделить элемент
--- Конец цитаты ---
Сори, не заметил про выделение, добавил одну строчку перед коммитом)
И кстати, если ты работаешь из таблицы, то есть по идее можешь хоть с листа пытаться выделить этот объект, то лучше еще сделать проверку где ты сейчас находишься после получения трубы что бы не пытаться перейти на какое то место на листе.
--- Код - C# [Выбрать] ---if (!pipe.OwnerId.Equals(db.CurrentSpaceId)) { tr.Commit(); return; }
D_TRex:
Обязательно попробую, правда пока по написанному не похожу на выделение элемента.
Я не то что бы работаю, для нормальной работы надо как то таблицу обновлять при изменении, просто родная кадовская таблица ужасно тормозит при перемещении, нет возможности группового редактирования семейства труб (колодцев) нет возможности задать глубину заложения - иногда отсутствует поверхность (не выдали ещё топографы) и все трубы и колодцы в отметке ноль (может я конечно просто не умею) но нет функции поднять трубы, только колодцы подтягиваются.
Не смог конвертировать эту строку, но без неё тоже работает, там ссылка на SelectionSet.
--- Код - vb.net [Выбрать] --- ed.SetImpliedSelection(new List<ObjectId> { obid } .ToArray());
а под выбором я вот что имел в виду, конечно это не критично, но тогда не надо панорамировать объект что бы изменить его свойства.
Навигация
Перейти к полной версии