01/09/2017
Как выбрать грани соседствующие с выбранным ребром 3DSOLID
Используя BREP API, довольно просто получить смежные грани для выбранного ребра 3DSOLID.Мы будем использовать Boundary Loop, чтобы получить все петли, в которые входит выбранное ребро для получения соседних граней.
Код - C#: [Выделить]
- [CommandMethod("GAF")]
- static public void GetAdjacentFaces()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- PromptKeywordOptions pko =
- new PromptKeywordOptions("\nВыберите тип подобъекта:");
- pko.AllowNone = false;
- pko.Keywords.Add("Ребро");
- pko.Keywords.Default = "Ребро";
- PromptResult pkr = ed.GetKeywords(pko);
- if (pkr.Status != PromptStatus.OK)
- return;
- // Пользователь выбрал Ребро
- SubentityType subentityType = SubentityType.Edge;
- // Включаем выбор подобъектов
- PromptSelectionOptions pso = new PromptSelectionOptions();
- pso.MessageForAdding = "\nВыберите у твердого тела " +
- pkr.StringResult + ": ";
- pso.SingleOnly = true;
- pso.SinglePickInSpace = true;
- pso.ForceSubSelections = true;
- PromptSelectionResult psr = ed.GetSelection(pso);
- if (psr.Status != PromptStatus.OK)
- return;
- SelectionSet ss = psr.Value;
- SelectedObject so = ss[0];
- if (!so.ObjectId.ObjectClass.IsDerivedFrom(
- RXClass.GetClass(typeof(Solid3d))))
- {
- ed.WriteMessage(
- "\nВы не выбрали твердое тело - повторите пожалуйста...");
- return;
- }
- // Для сохранения соседних граней
- List<SubentityId> faceIds = new List<SubentityId>();
- using (Transaction Tx = db.TransactionManager.StartTransaction())
- {
- Solid3d solid = Tx.GetObject(so.ObjectId, OpenMode.ForWrite)
- as Solid3d;
- SelectedSubObject[] sso = so.GetSubentities();
- // Проверяем, что выбранный объект соответствует заданному типу
- if (subentityType != sso[0].FullSubentityPath.SubentId.Type)
- {
- ed.WriteMessage("\nНеправильный тип подобъекта: " +
- sso[0].FullSubentityPath.SubentId.Type +
- ", повторите снова...");
- return;
- }
- SubentityId subentityId = sso[0].FullSubentityPath.SubentId;
- // Создаём путь к подобъекту для использования в GetSubentity
- FullSubentityPath subEntityPath = new FullSubentityPath(
- new ObjectId[] { solid.ObjectId },
- subentityId);
- // Возвращаем примитив (не содержащийся в базе),
- // который представляет подобъект
- using (Entity entity = solid.GetSubentity(subEntityPath))
- {
- ed.WriteMessage("\nТип подобъекта: "
- + entity.ToString());
- }
- // Создаём путь для генерации объекта BREP
- FullSubentityPath entityPath = new FullSubentityPath(
- new ObjectId[] { solid.ObjectId },
- new SubentityId(SubentityType.Null, IntPtr.Zero));
- using (Edge edge = new Edge(subEntityPath))
- {
- if (subentityType == SubentityType.Edge)
- {
- if (subentityId == edge.SubentityPath.SubentId)
- {
- ed.WriteMessage("\nКривая: " + edge.Curve.ToString());
- // Теперь раскрасим грани.
- foreach (BoundaryLoop loop in edge.Loops)
- {
- // Для простейшего варианта нас будет интересовать внешняя петля
- if (loop.LoopType == LoopType.LoopExterior)
- {
- AcBr.Face face = loop.Face;
- faceIds.Add(face.SubentityPath.SubentId);
- }
- }
- if (faceIds.Count > 1)
- foreach (SubentityId subentId in faceIds)
- {
- Color col = Color.FromColorIndex(ColorMethod.ByColor, 1);
- solid.SetSubentityColor(subentId, col);
- }
- }
- }
- }
- Tx.Commit();
- }
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=7996
Опубликовано 01.09.2017