카테고리 없음

[AutoCAD C#]AutoCAD에서 두 선이 연결되어 있는지 확인하는 C# 코드

데브프로그라 2024. 2. 26. 21:32
반응형

 AutoCAD에서 두 선이 연결되어 있는지 확인하는 C# 코드입니다. 
이 코드는 두 선이 서로의 끝점이 연결되어 있는지 확인하고, 연결되어 있다면 true를 반환합니다.
2개의 Line (선)을 선택하여 판단하게 합니다.
이전 코드와 다른 점은 2개를 선택하여 연결처리를 확인합니다.
두 코드를 비교하면 쉽게 차이를 알 수 있으며, 더 쉽게 공부를 할 수 있습니다.

AutoCAD에서 이 코드를 사용하려면 다음 단계로 실행해 보세요.
1. Visual Studio에서 새 C# 프로젝트를 만듭니다.
    참조에 accoremgd.dll, acdbmgd.dll, AcDbMgd.dll, AcMgd.dll을 추가합니다.
2. 아래의 코드를 복사하여 프로젝트에 붙여넣습니다.
     빌드하여 .dll 파일을 생성합니다.
3. AutoCAD에서 NETLOAD 명령을 실행하여 .dll 파일을 로드합니다.
4. CLCN명령을 실행합니다.
5. AutoCAD에서 원하는 선을 선택하면 연결된 선을 노란색으로 변경해 줍니다.

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

namespace test
{
    public class Util
    {
        [CommandMethod("CLCN")]
        public void CheckLineConnection()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            // 두 개의 선 선택해야 합니다.
            PromptSelectionOptions selOpts = new PromptSelectionOptions();
            selOpts.MessageForAdding = "\nSelect the first line: ";

            PromptSelectionResult selRes = ed.GetSelection(selOpts);
            if (selRes.Status != PromptStatus.OK) return;

            ObjectId[] objIds = selRes.Value.GetObjectIds();

            //2개의 선을 선택하지 않으면 반환합니다.
            if (objIds.Length != 2)
            {
                ed.WriteMessage("\nPlease select two lines.");
                return;
            }

            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                // 첫 번째 선과 두 번째 선 가져오기
                // Line 객체
                Line line1 = trans.GetObject(objIds[0], OpenMode.ForRead) as Line;
                Line line2 = trans.GetObject(objIds[1], OpenMode.ForRead) as Line;

                if (line1 != null && line2 != null)
                {
                    // 두 선의 시작점과 끝점 가져오기
                    Point3d startPoint1 = line1.StartPoint;
                    Point3d endPoint1 = line1.EndPoint;
                    Point3d startPoint2 = line2.StartPoint;
                    Point3d endPoint2 = line2.EndPoint;

                    // 두 선이 연결되어 있는지 확인한다.
                    if (startPoint1.DistanceTo(startPoint2) < Tolerance.Global.EqualPoint &&
                        endPoint1.DistanceTo(endPoint2) < Tolerance.Global.EqualPoint)
                    {
                        //메지시 대신 다른 기능을 삽입합니다.
                        ed.WriteMessage("\nThe lines are connected.");
                    }
                    else if (startPoint1.DistanceTo(endPoint2) < Tolerance.Global.EqualPoint &&
                             endPoint1.DistanceTo(startPoint2) < Tolerance.Global.EqualPoint)
                    {
                        //메지시 대신 다른 기능을 삽입합니다.
                        ed.WriteMessage("\nThe lines are connected.");
                    }
                    else
                    {
                        ed.WriteMessage("\nThe lines are not connected.");
                    }
                }
                else
                {
                    ed.WriteMessage("\nFailed to retrieve lines.");
                }
                trans.Commit();
            }
        }
    }
}

반응형