Chuyển đến nội dung
Diễn đàn CADViet

gia_bach

CADViet Team
  • Số lượng nội dung

    1.586
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    107

Mọi thứ được đăng bởi gia_bach

  1. gia_bach

    Array đơn hướng với góc tùy ý

    Hình như từ CAD 2012 mới có Associative Array.
  2. chủ đề hơn 10 năm rồi, tạm sửa thế này nhé. (defun c:2Csv (/ chdai dtich ent1 ent2 ent3 lst solo tmp ent21 enttype len pt) (vl-load-com) (while (setq ent1 (car (entsel "\nchon Text de lay So lo :"))) (and (= (cdr (assoc 0 (entget ent1))) "TEXT") (setq solo (vlax-get(vlax-Ename->Vla-Object ent1)'TextString)) (or (and (setq ent2 (car (entsel "\nchon doi tuong (lo dat) de lay Dien tich :"))) (setq ent2 (vlax-Ename->Vla-Object ent2)) (vlax-property-available-p ent2 'area) (setq dtich (vlax-get ent2 'Area) ) ) (and (setq pt (getpoint "\nPick diem (lo dat) de lay Dien tich :")) (vl-cmdf "-bhatch" "Advanced" "Island" "No" "Nearest" "" pt "") (setq ent2 (entlast)) (setq ent21 (vlax-Ename->Vla-Object ent2)) (vlax-property-available-p ent21 'area) (setq dtich (vlax-get ent21 'Area) ) (entdel ent2)) ) (setq chdai "") ;;; (while (setq ent3 (car (entsel "\nchon doi tuong de lay Khoang lui :"))) ;;;(setq enttype (cdr (assoc 0 (entget ent3)))) ;;;(cond ;;; ((eq enttype "TEXT") (setq len (vla-get-TextString (vlax-ename->vla-object ent3))) ) ;;; ((eq enttype "DIMENSION") (setq len (rtos(vla-get-Measurement (vlax-ename->vla-object ent3)))) ) ;;; (T (setq len (rtos (vlax-curve-getDistAtParam ent3 (vlax-curve-getEndParam ent3)))) ) ) ;;;(setq chdai (strcat chdai "," len)) ) (princ "\n") (princ (setq tmp (strcat solo "," (rtos dtich) chdai))) (setq lst (append lst (list tmp))) ) ) (if (setq tmp (getfiled "Ten file " (getvar "dwgprefix") "csv" 1)) (progn (setq tmp (open tmp "a")) (write-line "So lo,Dien tich,Khoang lui" tmp) (foreach txt lst (write-line txt tmp) ) (close tmp))) (princ))
  3. gia_bach

    [Yêu cầu] Lisp vẽ đoạn thẳng nối 2 đầu đoạn thẳng

    Tôi bổ sung thêm 2 nguyên nhân : - do đã có các lisp tương tự trên diễn đàn này. - do người yêu cầu viết ko rõ ràng, cứ phải chạy theo "xin" số liệu, có t/hợp y/cầu thay đổi hoàn toàn so với trước đó. (cứ nhắc đi nhắc lại bài "Viết yêu cầu và trả lời như thế nào?" cũng chán)
  4. Tạo 1 ứng dụng AutoCAD .NET với MS Visual C# Tạo Project : 1. Khởi động Microsoft Visual C# 2. Chọn menu : FILE → “New Project ...”. Hộp thoại New Project xuất hiện : 3. Chọn template “Class Lybrary” như trong hình và nhập tên vào mục Name, trong ví dụ này tôi để mặc định là : ClassLibrary1. 4. Một Project mới đuợc tạo và giao diện như sau : C# tạo 1 file có tên Class1.cs mà ta sẽ sử dụng ở buớc viết Code. Khai báo thư viện (Reference): 1. Tại cửa sổ Solution Explorer bên phải phía trên, chọn tag Reference 2. Click chuột phải lên tag Reference rồi chọn “Add Reference” trên menu xổ xuống . Hộp thoại “Add Reference” xuất hiện : 3. Chọn tag “ Browse” như trong hình và chỉ đến thư mục cài đặt AutoCad, ví dụ : C:\Program Files\AutoCAD 2010. 4. chọn 2 file : "acmgd.dll" và "acdbmgd.dll" , click OK để kết thúc. 5. Đặt thuộc tính “Copy Local” : Tại cửa sổ Solution Explorer, tag Reference click chuột phải lên file "acmgd.dll" chọn Properties : trong cửa sổ Properties, đặt thuộc tính “Copy Local” là False. Làm tuơng tự với file "acdbmgd.dll" Tạo lệnh Cad (viết code): Để tạo 1 lệnh mới, sử dụng thuộc tính CommandMethod ví dụ : [CommandMethod("CadViet")] Ví dụ 1 : khai báo lệnh CadViet1 thực hiện việc xuất ra màn hình thông báo “Chào mừng bạn đến với ứng dụng AutoCAD .NET API” Ví dụ 2 : khai báo lệnh CadViet2 thực hiện việc tạo 1 đối tuợng TEXT có nội dung : “Chào mừng bạn đến với ứng dụng AutoCAD .NET API”, tại vị trí do nguời dùng chọn. Bạn Copy và Paste toàn bộ đọan code sau vào file Class1.cs using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; namespace Gia_Bach { public class Cad_command { [CommandMethod("CadViet1")] public static void ex1() { Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Chào mừng bạn đến với ứng dụng AutoCAD .NET API!"); } [CommandMethod("CadViet2")] public static void ex2() { Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocume nt; Editor ed = doc.Editor; Database db = doc.Database; PromptPointResult Pr = ed.GetPoint("\nChọn điểm đặt Text : "); Point3d pt = Pr.Value; if (Pr.Status != PromptStatus.OK) return; // Start a transaction using (Transaction acTrans = db.TransactionManager.StartTransaction()) { // Open the Block table for read BlockTable acBlkTbl = acTrans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // Open the Block table record Model space for write BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[blockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Create a single-line text object DBText acText = new DBText(); acText.SetDatabaseDefaults(); acText.Position = pt; acText.Height = 0.5; acText.TextString = "Chào mừng bạn đến với ứng dụng AutoCAD .NET API!"; acBlkTblRec.AppendEntity(acText); acTrans.AddNewlyCreatedDBObject(acText, true); // Save the changes and dispose of the transaction acTrans.Commit(); } } } } Lưu Project : Chọn menu : FILE → “Save All ...”. Hộp thoại Save Project xuất hiện, chọn đuờng dẫn thích hợp, click Save để kết thúc. Build Project : Chọn menu : BUILD → “Build Solution” : để tạo 1 ứng dụng. Trong truờng hợp BUILD thành công, bạn sẽ có 1 file dll trùng tên với tên Project tại đuờng dẫn : - “ProjectName\bin\Release\ projectName.dll “ trong đó ProjectName là tên Project bạn đã đặt ở buớc Lưu Project Thực thi lệnh : (xem thành quả) 1. Khởi động AutoCAD 2. Tại dấu nhắc (Command ) của CAD gõ lệnh NETLOAD và chỉ đến vị trí file vừa BUILD ở trên, chọn OPEN để hoàn thành lệnh NETLOAD . 3. gõ lệnh CadViet1 hay CadViet2 để bắt đầu Chúc bạn thành công.
  5. gia_bach

    Tạo 1 ứng dụng AutoCAD .NET với MS Visual C#

    Không có cũng được, nhưng không thừa đâu! Bổ sung hàm getdouble (nhập số thực) và getpoint (chọn điểm): using System; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application; namespace Gia_Bach { public class Class1 { static double _deltaX = 4000; static double _deltaY = 5000; const double pi = System.Math.PI; const double dimBaseLine = 350; const double txtHeight = 175; [CommandMethod("test")] public static void AddLineDimTextCircle() { Document doc = AcadApp.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (var tr = db.TransactionManager.StartTransaction()) { PromptDoubleOptions pdo = new PromptDoubleOptions("\nNhập chiều dài phương ngang: "); pdo.DefaultValue = _deltaX; PromptDoubleResult res = ed.GetDouble(pdo); if (res.Status != PromptStatus.OK) return; _deltaX = res.Value; PromptPointResult ppr= ed.GetPoint("\nĐiểm chèn:"); if (ppr.Status != PromptStatus.OK) return; Point3d insPt = ppr.Value; // horizontal Point3d ptX = Polar(insPt, 0, _deltaX); // line Line line = new Line(insPt, ptX); line.ColorIndex = 3; AddToDataBase(db, line); // dim Point3d dimLinePt = Polar(insPt, pi / 2, dimBaseLine); AlignedDimension dim = new AlignedDimension(insPt, ptX, dimLinePt, "", db.Dimstyle); dim.ColorIndex = 4; AddToDataBase(db, dim); // text Point3d midPt = MidPoint(insPt, ptX); Point3d txtInsPt = Polar(midPt, pi / -2, txtHeight * 1.5); DBText txt = new DBText(); txt.Height = txtHeight; txt.TextString = "B"; txt.Position = txtInsPt; txt.HorizontalMode = TextHorizontalMode.TextCenter; txt.VerticalMode = TextVerticalMode.TextVerticalMid; txt.AlignmentPoint = txtInsPt; AddToDataBase(db, txt); // cicrle Circle cir = new Circle(txtInsPt, txt.Normal, txtHeight * 1.0); cir.ColorIndex = 1; AddToDataBase(db, cir); //Point3d ptY = Polar(insPt, pi / -4, _deltaY); //// line by Y //line = new Line(insPt, ptY); //line.ColorIndex = 3; //AddToDataBase(db, line); tr.Commit(); } } public static Point3d Polar(Point3d org, double angle, double distance) { return new Point3d( org.X + (distance * Math.Cos(angle)), org.Y + (distance * Math.Sin(angle)), org.Z); } static public Point3d MidPoint(Point3d P1, Point3d P2) { double x, y, z; x = (P1.X + P2.X) * 0.5; y = (P1.Y + P2.Y) * 0.5; z = (P1.Z + P2.Z) * 0.5; return new Point3d(x, y, z); } public static void AddToDataBase(Database db, Entity ent) { using (var tr = db.TransactionManager.StartTransaction()) { var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); curSpace.AppendEntity(ent); tr.AddNewlyCreatedDBObject(ent, true); tr.Commit(); } } } }
  6. gia_bach

    Tạo 1 ứng dụng AutoCAD .NET với MS Visual C#

    Bạn tham khảo hàm GetDouble ở đây:
  7. gia_bach

    Tạo 1 ứng dụng AutoCAD .NET với MS Visual C#

    Bạn tham khảo code này, tuy nó không xuất ra kết quả như bạn yêu cầu nhưng nó có tất cả các hàm để viết. using System; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application; namespace Gia_Bach { public class Class1 { static double _deltaX = 4000; static double _deltaY = 5000; const double pi = System.Math.PI; const double dimBaseLine = 350; const double txtHeight = 175; [CommandMethod("test")] public static void AddLineDimTextCircle() { Document doc = AcadApp.DocumentManager.MdiActiveDocument; Database db = doc.Database; using (var tr = db.TransactionManager.StartTransaction()) { Point3d insPt = new Point3d(6000, 6000, 0); Point3d ptX = Polar(insPt, 0, _deltaX); // line by X Line line = new Line(insPt, ptX); line.ColorIndex = 3; AddToDataBase(db, line); // dim Point3d dimLinePt = Polar(insPt, pi / 2, dimBaseLine); AlignedDimension dim = new AlignedDimension(insPt, ptX, dimLinePt, "", db.Dimstyle); dim.ColorIndex = 4; AddToDataBase(db, dim); // text Point3d midPt = MidPoint(insPt, ptX); Point3d txtInsPt = Polar(midPt, pi / -2, txtHeight * 1.5); DBText txt = new DBText(); txt.Height = txtHeight; txt.TextString = "B"; txt.Position = txtInsPt; txt.HorizontalMode = TextHorizontalMode.TextCenter; txt.VerticalMode = TextVerticalMode.TextVerticalMid; txt.AlignmentPoint = txtInsPt; AddToDataBase(db, txt); // cicrle Circle cir = new Circle(txtInsPt, txt.Normal, txtHeight * 1.0); cir.ColorIndex = 1; AddToDataBase(db, cir); //Point3d ptY = Polar(insPt, pi / -4, _deltaY); //// line by Y //line = new Line(insPt, ptY); //line.ColorIndex = 3; //AddToDataBase(db, line); tr.Commit(); } } public static Point3d Polar(Point3d org, double angle, double distance) { return new Point3d( org.X + (distance * Math.Cos(angle)), org.Y + (distance * Math.Sin(angle)), org.Z); } static public Point3d MidPoint(Point3d P1, Point3d P2) { double x, y, z; x = (P1.X + P2.X) * 0.5; y = (P1.Y + P2.Y) * 0.5; z = (P1.Z + P2.Z) * 0.5; return new Point3d(x, y, z); } public static void AddToDataBase(Database db, Entity ent) { using (var tr = db.TransactionManager.StartTransaction()) { var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); curSpace.AppendEntity(ent); tr.AddNewlyCreatedDBObject(ent, true); tr.Commit(); } } } }
  8. gia_bach

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

    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
  9. gia_bach

    Xin hỏi: tạo script mở file và chạy command

    Bạn thử đoạn script này: FILEDIA 0 OPEN "C:\BANVE.DWG" zoom c -180228.0,-57120.9,0.0 287185.0
  10. gia_bach

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

    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
  11. gia_bach

    [ Hỏi File cad bị lỗi ]

    Thầy bói đoán mò: có thể là AutoCAD Civil 3D.
  12. gia_bach

    Giúp đỡ lisp ẩn 1 layer cố định

    ObjectDBX (VisualLisp) làm tốt yêu cầu này.
  13. gia_bach

    XIN GIÚP ĐỠ VỀ OFFSET POLYLINE DẠNG RECTANG

    Offset 500 và -500 rồi so sánh 2 pline mới, thằng nào có diện tích (AREA) lớn hơn thì chọn, xóa thằng kia.
  14. gia_bach

    Viết VBA theo yêu cầu.............

    haiza, covid đến sau lưng rồi, viết lách gì được nữa!!!
  15. gia_bach

    Viết VBA theo yêu cầu.............

    T/hợp đáy không nằm ngang và cạnh bên không thẳng đứng?
×