Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
gia_bach

AutoCAD.NET: Chọn các text trùng điểm chèn.

Các bài được khuyến nghị

Do trên Autodesk forum có 1 bạn hỏi về tìm các text trùng nhau, tôi post lên đây để mọi người tham khảo.

 

Code chọn các text trùng điểm chèn.

using System;
using System.Collections.Generic;

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;

namespace Gia_Bach
{
    public class TextDuplicatePosition
    {
        [CommandMethod("GetTextOverlap")]
        public void GetTextOverlap()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            PromptSelectionOptions pso = new PromptSelectionOptions();
            pso.AllowDuplicates = false;
            pso.MessageForAdding = "Select Text";
            pso.RejectObjectsOnLockedLayers = true;
            TypedValue[] tv = { new TypedValue((int)DxfCode.Start, "Text") };
            SelectionFilter sf = new SelectionFilter(tv);
            PromptSelectionResult psr = ed.GetSelection(pso, sf);
            if (psr.Status != PromptStatus.OK)
                return;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                Dictionary<Point3d, List<DBText>> dic = new Dictionary<Point3d, List<DBText>>();
                int sosole = 1;
                Point3d insPt;
                foreach (ObjectId oid in psr.Value.GetObjectIds())
                {
                    DBText txt = tr.GetObject(oid, OpenMode.ForRead) as DBText;
                    if (txt.Justify == AttachmentPoint.BaseLeft)
                        insPt = txt.Position;
                    else
                        insPt = txt.AlignmentPoint;

                    insPt = RoundAndFlaten(insPt, sosole);

                    if (dic.ContainsKey(insPt))
                    {
                        List<DBText> lst = dic[insPt];
                        lst.Add(txt);
                        dic[insPt] = lst;
                    }
                    else
                    {
                        dic.Add(insPt, new List<DBText>() { txt });
                    }
                }

                // đổi màu các text trùng nhau
                int color = 151;
                foreach (KeyValuePair<Point3d, List<DBText>> kvp in dic)
                {
                    List<DBText> txtLst = kvp.Value;
                    if (txtLst.Count > 1)
                    {
                        // đổi màu
                        foreach (DBText txt in txtLst)
                        {
                            txt.UpgradeOpen();
                            txt.ColorIndex = color;
                        }
                    }
                }

                tr.Commit();
            }
        }

        Point3d RoundAndFlaten(Point3d pt, int digits)
        {
            return new Point3d(Math.Round(pt.X, digits), Math.Round(pt.Y, digits), 0);
        }
    }
}

File dll cho CAD 2013~2021 cho các bạn sử dụng,

NETTLOAD để load dll vào CADvà gõ lệnh GetTextOverlap thực thi.

 

GetTextOverlap.zip

  • Like 1
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Vào lúc 20/7/2021 tại 13:33, gia_bach đã nói:

Do trên Autodesk forum có 1 bạn hỏi về tìm các text trùng nhau, tôi post lên đây để mọi người tham khảo.

 

Code chọn các text trùng điểm chèn.

  • cadvietlisp.lsp
    lisp help
  •  

using ;
using ;

using ;
using ;
using ;
using ;
using ;

namespace Gia_Bach
{
    public class TextDuplicatePosition
    {
        [CommandMethod("GetTextOverlap")]
        public void GetTextOverlap()
        {
            Document doc = ;
            Database db = ;
            Editor ed = ;

            PromptSelectionOptions pso = new PromptSelectionOptions();
            pso.AllowDuplicates = ;
            pso.MessageForAdding = "Select Text";
            pso.RejectObjectsOnLockedLayers = ;
            TypedValue[] tv = { new TypedValue((int)DxfCode.Start, "Text") ;
            SelectionFilter sf = new SelectionFilter(tv);
            PromptSelectionResult psr = ed.GetSelection(pso, sf);
            if (psr.Status != PromptStatus.OK)
                ;

            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                Dictionary<Point3d, List<DBText>> dic = new Dictionary<Point3d, List<DBText>>();
                int sosole = ;
                Point3d ;
                foreach (ObjectId oid in psr.Value.GetObjectIds())
                {
                    DBText txt = tr.GetObject(oid, OpenMode.ForRead) as ;
                    if (txt.Justify == AttachmentPoint.BaseLeft)
                        insPt = ;
                    else
                        insPt = ;

                    insPt = RoundAndFlaten(insPt, sosole);

                    if (dic.ContainsKey(insPt))
                    {
                        List<DBText> lst = ;
                        lst.Add(txt);
                        dic[insPt] = ;
                    }
                    else
                    {
                        dic.Add(insPt, new List<DBText>() { txt });
                    }
                }

                // đổi màu các text trùng nhau
                int color = ;
                foreach (KeyValuePair<Point3d, List<DBText>> kvp in dic)
                {
                    List<DBText> txtLst = ;
                    if (txtLst.Count > 1)
                    {
                        // đổi màu
                        foreach (DBText txt in txtLst)
                        {
                            txt.UpgradeOpen();
                            txt.ColorIndex = ;
                        }
                    }
                }

                tr.Commit();
            }
        }

        Point3d RoundAndFlaten(Point3d pt, int digits)
        {
            return new Point3d(Math.Round(pt.X, digits), Math.Round(pt.Y, digits), 0);
        }
    }

File dll cho CAD 2013~2021 cho các bạn sử dụng,

NETTLOAD để load dll vào CADvà gõ lệnh GetTextOverlap thực thi.

 

GetTextOverlap.zip

Có cách nào dùng có cho cad từ 2007-2010 không anh

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
24 phút trước, huyenle đã nói:

Có cách nào dùng có cho cad từ 2007-2010 không anh

Bạn dùng thử file này cho cad 2007-2010, tôi ko chắc lắm vì ko có cad 2007 để test.

GetTextOverlap_CAD2007.zip

  • Like 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào các Anh. Các Anh có thể chỉ giúp em viết 1 đoạn code. Tùy biên 2 đoạn thẳng giao nhau không ạ. VD Đoạn AB = 4m, BC =5m. em muốn thay đổi các thông số này 1 cách linh hoạt AB= m, BC=n. Và sau khi đưa ra man hình thì có luôn dim trong 2 đoạn thẳng được không ạ/ Em cảm ơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay
Đăng nhập để thực hiện theo  

×