You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复C#.NET ObjectARX中Autodesk.AutoCAD.BoundaryRepresentation异常

AutoCAD ObjectARX程序抛出BoundaryRepresentation异常问题

我在Visual Studio 2022中基于.NET Framework 4.8开发AutoCAD ObjectARX程序,运行时始终抛出“Autodesk.AutoCAD.BoundaryRepresentation.Exception was thrown.”异常。尝试过改写代码与调试,但问题仍未解决。相关代码如下:

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.BoundaryRepresentation;
using Autodesk.AutoCAD.Colors;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows.Input;

namespace _3Dinterface.ViewModels
{
    public class MainWindowViewModel : INotifyPropertyChanged
    {
        private string _selectedColor1;
        private string _selectedColor2;
        private Autodesk.AutoCAD.Colors.Color _color1;
        private Autodesk.AutoCAD.Colors.Color _color2;

        public string SelectedColor1
        {
            get => _selectedColor1;
            set { _selectedColor1 = value; OnPropertyChanged(nameof(SelectedColor1)); }
        }

        public string SelectedColor2
        {
            get => _selectedColor2;
            set { _selectedColor2 = value; OnPropertyChanged(nameof(SelectedColor2)); }
        }

        public ICommand SelectColor1Command { get; }
        public ICommand SelectColor2Command { get; }
        public ICommand ApplyColorsCommand { get; }

        public MainWindowViewModel()
        {
            SelectColor1Command = new RelayCommand(_ => SelectColor(1));
            SelectColor2Command = new RelayCommand(_ => SelectColor(2));
            ApplyColorsCommand = new RelayCommand(_ => ApplyColorsTo3DObject());
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private void SelectColor(int colorNumber)
        {
            var colorDialog = new Autodesk.AutoCAD.Windows.ColorDialog();
            if (colorDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if (colorNumber == 1)
                {
                    _color1 = colorDialog.Color;
                    SelectedColor1 = $"First 1: {_color1.ColorIndex}";
                }
                else
                {
                    _color2 = colorDialog.Color;
                    SelectedColor2 = $"Second 2: {_color2.ColorIndex}";
                }
            }
        }

        private void ApplyColorsTo3DObject()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            if (_color1 == null || _color2 == null)
            {
                ed.WriteMessage("\nPlease chose 2 color.");
                return;
            }

            using (var lck = doc.LockDocument())
            {
                PromptEntityOptions peo = new PromptEntityOptions("\nSelect 3D object:");
                peo.SetRejectMessage("\nNot Solid3d.");
                peo.AddAllowedClass(typeof(Solid3d), true);
                var per = ed.GetEntity(peo);

                if (per.Status != PromptStatus.OK)
                {
                    ed.WriteMessage("\nUnfound object.");
                    return;
                }

                using (Transaction tr = db.TransactionManager.StartTransaction())
                {
                    var solid3d = tr.GetObject(per.ObjectId, OpenMode.ForWrite) as Solid3d;
                    if (solid3d == null)
                    {
                        ed.WriteMessage("\nobject not Solid3d.");
                        return;
                    }

                    try
                    {
                        using (Brep brep = new Brep(solid3d))
                        {
                            int faceIndex = 0;

                            foreach (var face in brep.Faces)
                            {
                                try
                                {
                                    var colorToApply = (faceIndex % 2 == 0) ? _color1 : _color2;
                                    ApplyColorToFace(face, colorToApply);
                                    faceIndex++;
                                }
                                catch (System.Exception ex)
                                {
                                    ed.WriteMessage($"\nERROR: {ex.Message}");
                                }
                            }
                        }

                        ed.WriteMessage("\nSucceed .");
                    }
                    catch (System.Exception ex)
                    {
                        ed.WriteMessage($"\nError in Solid3d: {ex.Message}");
                    }

                    tr.Commit();
                }
            }
        }

        private void ApplyColorToFace(Autodesk.AutoCAD.BoundaryRepresentation.Face face, Autodesk.AutoCAD.Colors.Color color)
        {
            if (face != null)
            {
                try
                {
                    var subEntityPath = face.SubentityPath;
                    var entityId = subEntityPath.GetObjectIds().FirstOrDefault();

                    if (entityId.IsValid)
                    {
                        using (Transaction tr = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
                        {
                            Solid3d solid = tr.GetObject(entityId, OpenMode.ForWrite) as Solid3d;
                            ObjectId[] ids = new ObjectId[] { entityId };
                            FullSubentityPath path = new FullSubentityPath(ids, new SubentityId(SubentityType.Null, IntPtr.Zero));
                            List<SubentityId> SubentIds = new List<SubentityId>();
                            using(Autodesk.AutoCAD.BoundaryRepresentation.Brep brep = new Autodesk.AutoCAD.BoundaryRepresentation.Brep(path))
                            {
                                foreach (Autodesk.AutoCAD.BoundaryRepresentation.Edge edge in brep.Edges)
                                {
                                    SubentIds.Add(edge.SubentityPath.SubentId);
                                }
                            }
                            foreach (SubentityId subentId in SubentIds)
                            {
                                var entity = tr.GetObject(entityId, OpenMode.ForWrite) as Entity;
                                if (entity != null)
                                {
                                    entity.Color = color;
                                }
                                tr.Commit();
                            }
                        }
                    }
                }
                catch (System.Exception ex)
                {
                    Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"\nError in face: {ex.Message}");
                }
            }
        }

        public class RelayCommand : ICommand
        {
            private readonly Action<object> _execute;
            private readonly Predicate<object> _canExecute;

            public RelayCommand(Action<object> execute, Predicate<object> canExecute = null)
            {
                _execute = execute ?? throw new ArgumentNullException(nameof(execute));
                _canExecute = canExecute;
            }

            public bool CanExecute(object parameter) => _canExecute?.Invoke(parameter) ?? true;

            public void Execute(object parameter) => _execute(parameter);

            public event EventHandler CanExecuteChanged
            {
                add => CommandManager.RequerySuggested += value;
                remove => CommandManager.RequerySuggested -= value;
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者NgDinhThi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:57:02