ADN Club > Civil 3D API

Выделение и отображение примитива Civil

(1/2) > >>

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());
а под выбором я вот что имел в виду, конечно это не критично, но тогда не надо панорамировать объект что бы изменить его свойства.

Навигация

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

[#] Следующая страница

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