카테고리 없음

[AutoCAD C#]오토캐드에서 객체를 선택하여 Color, Layer 변경하기

데브프로그라 2024. 2. 24. 22:24
반응형

AutoCAD에서 객체(Object)를 선택하여, 색상(Color), 레이어(Layer)를 변경하는 소스입니다.

Visual Studio와 AutoCAD .Net Wizard가 설치되어 있으시면 프로젝트(Project) 생성 후 새로운 Class를 만들어 작성해 주시면 쉽게 활용할 수 있습니다.

 

다음의 코드는 CHCL 라는 명령어를 정의하고, 선택한 객체들의 색상을 노란색로 변경하고, 레이어를 "PIPE"로 변경합니다. 만약 " PIPE "라는 이름의 레이어가 존재하지 않으면 새로 생성합니다.

AutoCAD에서 이 코드를 사용하려면 다음 단계를 따르십시오.
1. Visual Studio에서 새 C# 프로젝트를 만듭니다.
    참조에 accoremgd.dll, acdbmgd.dll, AcDbMgd.dll, AcMgd.dll을 추가합니다.
2. 아래의 코드를 복사하여 프로젝트에 붙여넣습니다.
     빌드하여 .dll 파일을 생성합니다.
3. AutoCAD에서 NETLOAD 명령을 실행하여 .dll 파일을 로드합니다.
4. CHCL 명령을 실행합니다.
5. AutoCAD에서 원하는 도면객체(들)을 선택하여 명령을 실행하면 선택한 객체들은 색상과 레이어(Layer)가 변경됩니다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

namespace ObjectProperties
{
    public class ObjectPropertiesCommands
    {
        [CommandMethod("CHCL")]
        public void ChangeObjectProperties()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            // 선택 옵션 설정
            PromptSelectionOptions selOpts = new PromptSelectionOptions();
            selOpts.MessageForAdding = "\n객체선택: ";

            // 객체 선택
            PromptSelectionResult selRes = ed.GetSelection(selOpts);
            if (selRes.Status != PromptStatus.OK) return;

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                SelectionSet selSet = selRes.Value;
                ObjectId[] objIds = selSet.GetObjectIds();

                // 색상 변경
                foreach (ObjectId objId in objIds)
                {
                    Entity ent = trans.GetObject(objId, OpenMode.ForWrite) as Entity;
                    if (ent != null)
                    {
                        ed.WriteMessage("\n객체명(Object): {0}", ent.GetType().ToString());

                        ed.WriteMessage("\n색상(Color): {0}", ent. ColorIndex.ToString());

                        ed.WriteMessage("\n레이어(Layer): {0}", ent. Layer.ToString());

                         //ent.Color = Autodesk.AutoCAD.Colors.Color.FromRgb(255, 0, 0); // 빨간색

                         ent.ColorIndex = 2; //노란색
                    }
                }

                // 레이어 변경
                LayerTable lt = trans.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
                if (lt != null)
                {
                    foreach (ObjectId objId in objIds)
                    {
                        Entity ent = trans.GetObject(objId, OpenMode.ForWrite) as Entity;
                        if (ent != null)
                        {
                            // 레이어가 없는 경우 새로 생성
                            if (!lt.Has("PIPE"))
                            {
                                LayerTableRecord ltr = new LayerTableRecord();
                                ltr.Name = "PIPE";
                                lt.UpgradeOpen();
                                ObjectId ltrId = lt.Add(ltr);
                                trans.AddNewlyCreatedDBObject(ltr, true);
                                ent.LayerId = ltrId;
                            }
                            else
                            {

                                //레이어가 존재할 경우 바로 변경한다.
                                ent.Layer = "PIPE";
                            }
                        }
                    }
                }

                trans.Commit();
            }
        }
    }
}

(명령으로 변경된 화면표시)

결과:

명령: CHCL
객체선택: 반대 구석 지정: 7개를 찾음
객체선택:
객체명(Object): Autodesk.AutoCAD.DatabaseServices.DBText
색상(Color): 256
레이어(Layer): 0
객체명(Object): Autodesk.AutoCAD.DatabaseServices.Ellipse
색상(Color): 256
레이어(Layer): 0
객체명(Object): Autodesk.AutoCAD.DatabaseServices.Line
색상(Color): 256
레이어(Layer): 0
객체명(Object): Autodesk.AutoCAD.DatabaseServices.Line
색상(Color): 256
레이어(Layer): 0
객체명(Object): Autodesk.AutoCAD.DatabaseServices.Arc
색상(Color): 256
레이어(Layer): 0
객체명(Object): Autodesk.AutoCAD.DatabaseServices.Polyline
색상(Color): 256
레이어(Layer): 0
객체명(Object): Autodesk.AutoCAD.DatabaseServices.Circle
색상(Color): 256
레이어(Layer): 0

 

 

반응형