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

gia_bach

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

    1.621
  • Đã tham gia

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

  • Ngày trúng

    122

Bài đăng được đăng bởi gia_bach


  1. 16 giờ trước, thanhduan2407 đã nói:

    Chào các bác!

    Em đang mò mẫm cách thức để tạo Boundary mà nó vẫn không triệt để.

    Cụ thể là em có các lưới ô vuông (dạng Polyline) riêng biệt và 1 đường Polyline khép kín khác Layer với lưới ô vuông.

    Em muốn tạo Boundary phần giao giữa từng lưới ô vuông với đường Polyline (Boundary này phải nằm phía trong của Polyline như hình đi kèm).

    Nhờ các bác gợi ý cho em thuật toán để làm được điều đó được không? Cảm ơn các bác nhiều.

    P/s: Hatch chỉ là mô tả các Boundary riêng biệt chứ không cần tạo Hatch.

    Link file:

    http://www.mediafire.com/file/9t4w1t8rksbwuob/TAO+BOUNDARY.dwg

    232_zpsi0rh63nt.jpg

    Vấn đề của bạn có thể đưa về dạng cơ bản là tìm boundary của 2 polyline.

    Cách 1:

     - nổ (explode) polyline màu trắng thành các đối tượng cơ bản (line, arc)

     - lần lượt tìm phần giao (bên trong) của các đối tượng cơ bản ở trên với polyline ô lưới

     - nối các phần giao ở trên thành các boundary (nếu tồn tại)

    Cách 2: (sử dụng command)

     - convert các polyline thành region, lệnh REGION

     - sử dụng lệnh INTERSECT để tìm giao của 2 region.

     

    Cách 2 có vẻ đơn giản nhưng tốc độ không bằng cách 1.

    • Like 1

  2. 6 giờ trước, lvchien.xd đã nói:

    Chào các bác. Em có tìm được 1 lisp trên mạng tính tổng chiều dài. Bình thường vẫn sử dụng rất tốt.

    Nhưng khi chuyển qua CAD 2019 thì không xài được nữa. Báo lỗi sau :

    Lisp em đính kèm. Cảm ơn các bác nhiều

    tl.lsp

    Lisp này chạy tốt với CAD2019.

    Chắc do cad của bạn có vấn đề ?!


  3. 5 giờ trước, nvson đã nói:

    Nhờ các anh trợ giúp: 

    Trong VB.NET tôi đã tạo ra 2 đường Polyline,

    Tối muốn kiểm tra nếu 2 đường này giao nhau > 2 điểm thì TRIM cái phần giao nhau đi (hoặc BREAK 1 đường).

    Cảm ơn các anh.

    Kiểm tra 2 đường có giao nhau: dùng hàm IntersectWith

    Break 1 đường: sử dụng hàm GetSplitCurves

    • Like 1

  4. 1 giờ} trướ}c, trieu12341 đã nói:

    à, thêm 1 cái nữa là tại sao sau (princ "\nm2") lại có (princ) vậy bác. k có thì có sao ko

    có sao hay không là do cảm nhận của mỗi người ?!

    chạy 2 lisp dưới đây để thấy sự khác biệt :

    (defun c:coPrinc(/)
      (princ"\nCo (princ).")
      (princ)
      )
    
    (defun c:koPrinc(/)
      (princ"\nKhong co (princ).")
      )
    1 giờ} trướ}c, trieu12341 đã nói:

    ........

    à mình nên dùng soft nào để tập viết lisp ạ, cty em xài zwcad k có visuallsip editor

    Muốn sài VisualLisp Editor thì phải cài AutoCAD.

    Có thể dùng Notepad++ để viết lisp nhưng không bằng Editor chính chủ của AutoCAD.

     

    Có 1 số hàm của visualLisp không chạy (hoặc chạy không chính xác) trên ZwCAD !


  5. Đính kèm source code cho anh em nào có nhu cầu tham khảo:

    using System;
    using Autodesk.AutoCAD.ApplicationServices;
    using Autodesk.AutoCAD.DatabaseServices;
    using Autodesk.AutoCAD.EditorInput;
    using Autodesk.AutoCAD.Geometry;
    using Autodesk.AutoCAD.Runtime;
    using AcadApp = Autodesk.AutoCAD.ApplicationServices.Application;
    [assembly: CommandClass(typeof(Gia_Bach.OffsetCmds))]
    
    namespace Gia_Bach
    {
        public class OffsetCmds
        {
            [CommandMethod("OffetRectangle")]
            public static void OffetRectangle()
            {
                var doc = AcadApp.DocumentManager.MdiActiveDocument;
                Database db = doc.Database;
                Editor ed = doc.Editor;
    
                PromptSelectionOptions psop = new PromptSelectionOptions();
                SelectionFilter filter = new SelectionFilter(new TypedValue[] { new TypedValue(0, "lwpolyline") });
                PromptSelectionResult psr = ed.GetSelection(psop, filter);
                if (psr.Status != PromptStatus.OK) return;
    
                using (var tr = db.TransactionManager.StartTransaction())
                {
                    var ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForWrite);
                    foreach (ObjectId id in psr.Value.GetObjectIds())
                    {
                        Polyline pline = (Polyline)tr.GetObject(id, OpenMode.ForRead);
                        Polyline oPline = OffetRectangle(pline, 4);
                        if (oPline != null)
                        {
                            ms.AppendEntity(oPline);
                            tr.AddNewlyCreatedDBObject(oPline, true);
                        }
                    }
    
                    tr.Commit();
                }
            }
    
            public static Polyline OffetRectangle(Polyline pline, int step)
            {
                if (pline.NumberOfVertices != 4)
                {
                    AcadApp.ShowAlertDialog("Select object does not a rectangle. Ignore!");
                    return null;
                }
    
                Point2d pt1 = pline.GetPoint2dAt(0);
                Point2d pt2 = pline.GetPoint2dAt(1);
                Point2d pt3 = pline.GetPoint2dAt(2);
                Point2d pt4 = pline.GetPoint2dAt(3);
    
                double width = pt1.GetDistanceTo(pt2);
                double height = pt1.GetDistanceTo(pt4);
    
                if (width < 150 || height < 150)
                {
                    AcadApp.ShowAlertDialog("Dimension of rectangle too small. Ignore!");
                    return null;
                }
    
                double width4 = Math.Ceiling(width / step / 50.0) * 50;
                double height4 = Math.Ceiling(height / step / 50.0) * 50;
    
                Point2d ptw4 = pt1 + pt1.GetVectorTo(pt2).GetNormal() * width4;
                Point2d pt14 = ptw4 + pt1.GetVectorTo(pt4).GetNormal() * height4;
    
                ptw4 = pt2 + pt2.GetVectorTo(pt1).GetNormal() * width4;
                Point2d pt24 = ptw4 + pt2.GetVectorTo(pt3).GetNormal() * height4;
    
                ptw4 = pt3 + pt3.GetVectorTo(pt4).GetNormal() * width4;
                Point2d pt34 = ptw4 + pt3.GetVectorTo(pt2).GetNormal() * height4;
    
                ptw4 = pt4 + pt4.GetVectorTo(pt3).GetNormal() * width4;
                Point2d pt44 = ptw4 + pt4.GetVectorTo(pt1).GetNormal() * height4;
    
                Polyline pline4 = new Polyline();
                pline4.AddVertexAt(0, pt14, 0, 0, 0);
                pline4.AddVertexAt(1, pt24, 0, 0, 0);
                pline4.AddVertexAt(2, pt34, 0, 0, 0);
                pline4.AddVertexAt(3, pt44, 0, 0, 0);
                pline4.Closed = true;
                pline4.Elevation = pline.Elevation;
                pline4.SetPropertiesFrom(pline);
    
                return pline4;
            }
        }
    }

     


  6. Chạy thử plug-in cho AutoCAD 2007 nhé.

     

    Cách sử dụng :
    1. giải nén và copy file "OffsetRectang.dll" vào hệ thống(đĩa cứng, USB, ...).
    2. Khởi động AutoCAD.
    3. Tại dấu nhắc (Command ) của CAD gõ lệnh NETLOAD và chỉ đến vị trí file "OffsetRectang.dll" vừa copy ở buớc 1, chọn OPEN để hoàn thành lệnh NETLOAD.
    4. gõ lệnh OffsetRectang để bắt đầu ...

    OffsetRectang.zip

    • Like 1
×