ADN Club > Civil 3D API
Выделение и отображение примитива Civil
alz:
В общем немного непонятно что же надо, код выше прекрасно выделяет и фокусирует на объекте
Остальные вопросы к этой теме не относятся, по правилам нужно создавать отдельные темы, но просто советую изучить информацию отсюда
http://docs.autodesk.com/CIV3D/2018/ENU/API_Reference_Guide/index.html вот тут я нашел больше всего полезной информации
Autodesk.Civil.DatabaseServices Namespace в этом разделе по элементам(колодцы трубы сети поверхности)
Autodesk.Civil.DatabaseServices.Styles Namespace тут по стилям отображения всего что было выше указано
D_TRex:
Видео с ограниченным доступом - в общем мне не доступно.
У меня почему то код только фокусирует экран, но не выделяет, может быть огрехи конвертации - буду пробовать.
За ссылку отдельное спасибо.
Вопросов больше не было, просто Вы спросили что это, я в двух словах описал.
Хотя возможно вот тут недопонимание
--- Код - vb.net [Выбрать] ---using (Pipe pipe = tr.GetObject(obid, OpenMode.ForRead, false, true) as Pipe)
--- Код - vb.net [Выбрать] ---obid я беру из списка труб, у Вас я может не заметил где объявлен
alz:
Видео давно не выкладывал, там теперь доступ открывать, возрастные ограничения тд, вроде открыл. По поводу obid - это был кусок кода с конкретно этим функционалом obid это ObjectId трубы, каким образом его получать это другой вопрос, я получал из формы, вот полный код немного причесанный
--- Код - C# [Выбрать] ---using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.Runtime;using System.Collections.Generic; namespace test2{ public class Test99 { //переменная для принятия Id трубы с формы public static ObjectId part_id = ObjectId.Null; [CommandMethod("p_view")] public void start10012() { //обнуляем переменную part_id = ObjectId.Null; //создаем форму get_part get_Part = new get_part(); get_Part.ShowDialog(); //если с формы ObjectId не пришло то прекращаем if (part_id == ObjectId.Null) return; Document aDoc = Application.DocumentManager.MdiActiveDocument; Editor ed = aDoc.Editor; Database db = aDoc.Database; using (Transaction tr = db.TransactionManager.StartTransaction()) { //получаем объект, решил сделать через entyty что бы по отдельности трубы колодцы не обрабатывать using (Entity ent = tr.GetObject(part_id, OpenMode.ForRead, false, true) as Entity) { if (!ent.OwnerId.Equals(db.CurrentSpaceId)) { tr.Commit(); return; } //если есть границы, фиг знает в каких случаях их нет но походу это возможно if (ent.Bounds.HasValue) { Extents3d extents = ent.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> { part_id } .ToArray()); tr.Commit(); } } }}
--- Код - C# [Выбрать] ---ed.SetImpliedSelection(new List<ObjectId> { part_id } .ToArray());здесь нужно передать массив с ObjectId элементов и они будут выделены, как создать массив элементов со значениями напрямую фиг знает поэтому использую список, вот все по шагам
--- Код - C# [Выбрать] ---List<ObjectId> list = new List<ObjectId>();list.Add(part_id);и передаю этот список в виде массива
--- Код - C# [Выбрать] ---ed.SetImpliedSelection(list.ToArray())
D_TRex:
--- Код - vb.net [Выбрать] --- Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor Dim selectP(0 To grdPipe.RowCount - 1) As ObjectId For i = 0 To grdPipe.RowCount - 1 ' grdPipe.Item(colPIds.Index, i).Value тут я записал все элементы коллекции selectP(i) = grdPipe.Item(colPIds.Index, i).Value Next ed.SetImpliedSelection(selectP)Всё разобрался, может кому пригодится, просто идея была выбирать элемент без фокусировки внимания, ну и фокусировка тоже нужна. В общем там нужна по любому коллекция, в Вашем случае это был один элемент, в моем случае был только ObjectId, но надо что бы это была коллекция пусть даже с одним элементом. Теперь сделаю выбор в таблице строк и выделенные строки буду помещать в массив
Навигация
Перейти к полной версии