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

Lisp Chamfer nhiều cạnh theo chiều dài

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

Sau quá nhiều bình luận mình vẫn cho rằng đã viết lisp thì không thể phiên phiến được kéo điểm, nối thêm nét... . phải chính xác

Dựa trên lý thuyết của bác @duy782006 là tạo ra 3 đường thẳng có các góc tạo ra bằng nhau thì mình viết 1 lisp chọn 2 đường line sau đó nhập độ dài 1 cạnh:

(defun c:test (/ ent1 ent2 ent pp1 pp2 ptx obj1 obj2 a1 a2 bankinh dis dis1 dis2)
  (setq 
    ent1 (entsel "\nChon DT1")
    ent2 (entsel "\nChon DT2")
    dis (getdist "\nDo dai cac doan thang")
    pp1 (trans (cadr ent1) 1 0 )
    pp2 (trans (cadr ent2) 1 0 )
    ent1 (vlax-ename->vla-object (car ent1))
    ent2 (vlax-ename->vla-object (car ent2))
    pp1 (vlax-curve-getclosestpointto ent1 pp1 )
    pp2 (vlax-curve-getclosestpointto ent2 pp2 )
    ptx (vlax-invoke ent1 'intersectwith ent2 acExtendBoth)
    a1 (angle ptx pp1)
    a2 (angle ptx pp2)
  )
  (if (> a1 a2)
    (if (< (- a1 a2) pi)
      (setq a1 (- a1 a2))
      (setq a1 (+ pi pi a2 (- a1)))
    )
    (if (< (- a2 a1) pi)
      (setq a1 (- a2 a1))
      (setq a1 (+ pi pi a1 (- a2)))
    )
  )
  (setq 
    a2 (+ (* 0.375 pi) (/ a1 8))
    bankinh (abs (/ dis 2 (cos a2)))
    dis1 (abs (* bankinh (sin a2)))
    dis2 (abs (- (* dis1 (cos (/ a1 2)) (/ 1 (sin (/ a1 2))) ) (/ dis 2)))
  )
  (vl-cmdf "offset" dis1 (vlax-vla-object->ename ent1) (trans pp2 0 1) "")
  (setq obj1 (vlax-ename->vla-object (entlast)))
  (vl-cmdf "offset" dis1 (vlax-vla-object->ename ent2) (trans pp1 0 1) "")
  (setq obj2 (vlax-ename->vla-object (entlast)))
  (setq ptx (vlax-invoke obj1 'intersectwith obj2 acExtendBoth))
  (vla-delete obj1)
  (vla-delete obj2)
  (setvar "CHAMFERA" dis2)
  (setvar "CHAMFERB" dis2)
  (vl-cmdf "CHAMFER" (trans pp1 0 1) (trans pp2 0 1))
  (setq 
    ent (entget (entlast))
    pp1 (cdr (assoc 10 ent))
    pp2 (cdr (assoc 11 ent))
  )
  (entdel (cdar ent))
  (setq 
    a1 (angle ptx pp1)
    a2 (angle ptx pp2)
    obj1 (vlax-ename->vla-object (entmakex (list '(0 . "ARC") (cons 10 ptx) (cons 40 bankinh) (cons 50 a1) (cons 51 a2))))
    obj2 (vlax-ename->vla-object (entmakex (list '(0 . "ARC") (cons 10 ptx) (cons 40 bankinh) (cons 50 a2) (cons 51 a1))))
  )
  (if (> (vlax-curve-getdistatparam obj1 (vlax-curve-getendparam obj1)) (vlax-curve-getdistatparam obj2 (vlax-curve-getendparam obj2)))
    (mapcar 'set '(obj1 obj2 pp1 pp2) (list obj2 obj1 pp2 pp1))
  )
  (vla-delete obj2)
  (setq 
    obj2 (vlax-curve-getdistatparam obj1 (vlax-curve-getendparam obj1))
    a1 (vlax-curve-getpointatdist obj1 (/ obj2 3))
    a2 (vlax-curve-getpointatdist obj1 (* 2 (/ obj2 3)))
  )
  (vla-delete obj1) 
  (entmakex (list '(0 . "LINE") (cons 10 pp1) (cons 11 a1)))
  (entmakex (list '(0 . "LINE") (cons 10 a1) (cons 11 a2)))
  (entmakex (list '(0 . "LINE") (cons 10 a2) (cons 11 pp2)))
  (princ)
)

 

  • 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
27 phút trước, cuongtk2 đã nói:

TEST

 

Bác muốn vẽ kiểu fillet 6 thì vẽ đường phân giác, offset qua 2 bên 1.7 là được 2 điểm giao. sau đó bác làm gì cũng dễ mà

image.png

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

Cái chủ đề này đang được xếp vào chủ đề hót đấy các bác ạ. Ban đầu thì mình mắc mệt với cái đề của chủ thớt, sau coi cái đề của bác @cuongtk2  thì mình nghỉ chắc 99% là ý chủ thớt là như vậy tại ảnh trình bày lủng củng quá thôi. Bây giờ hết mắc mệt chuyển qua mắc cười rồi. Chờ bác nào giải mình chôm 1 đoạn!

-Đã có cung tròn thì quan tâm gì đến góc nửa cứ bắt điểm giữa cung vẽ line vào tâm cung xong offset (đang nói thủ công). Mình đang chờ chôm đoạn lấy cung nằm trong PLINE!

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

Ném đá hội nghị miết cũng kỳ, mà chưa viết được cái đoạn chui vào pline để lấy cái ARC ra xử. Mình viết 1 đoạn xử cái ARC không thôi. 

-Lệnh A3L, chọn cái ARC (arc thường chứ đừng pline nhé), hỏi dài cạnh giữa, nó vẽ ra line dài như mới nhập vào 2 đầu chạm vào ARC và canh ngay giữa. Sau đó vẽ 2 CIRCLE có tâm là 2 đầu line vừa vẽ, bán kính là chiều dài vừa nhập.

-Đoạn còn lại lấy thêm hay bỏ bớt cho ra cái đường hoàn chỉnh thì quyết định bằng mắt và vẽ bằng tay vậy!

;----- ArcSine - Lee Mac, Args: -1 <= x <= 1
(defun asin (x) (cond ((< 1.0 (abs x)) nil) ((equal (abs x) 1.0 1e-8) (* x pi 0.5)) (T (atan x (sqrt (- 1.0 (* x x)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun c:a3l ()

(princ "\nChon ARC can chia!")
(setq doituong (entget (car (entsel))))

 (setq TAM (cdr (assoc 10 doituong)))
 (setq BANKINH (cdr (assoc 40 doituong)))
 (setq GOCBD (cdr (assoc 50 doituong)))
 (setq GOCKT (cdr (assoc 51 doituong)))

(cond
((< GOCBD GOCKT) (setq gocthem 0))
((> GOCBD GOCKT) (setq gocthem pi))
)

(setq daicanh (getreal "\nDo dai canh giua: "))
(setq sgoc (asin (/ daicanh 2 BANKINH)))
(setq goccung (/ (- GOCKT GOCBD) 2))
(setq gocgiua (+ GOCBD goccung))
(setq goctim (+ gocgiua sgoc))
(setq goctim1 (- gocgiua sgoc))

 (setq diemg4 (polar TAM (+ gocthem goctim) BANKINH))
 (setq diemg5 (polar TAM (+ gocthem goctim1) BANKINH))

(command ".line" "_none" diemg4 "_none" diemg5 "")
(command ".circle" "_none" diemg4 daicanh)
(command ".circle" "_none" diemg5 daicanh)
(Princ))

 

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
[CommandMethod("MChamfer")]
public static void MChamferCMD()
{
    Document doc = AcadApp.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    using (DocumentLock lk = doc.LockDocument())
    {
        PromptEntityOptions peo = new PromptEntityOptions("\nPick polyline");
        peo.SetRejectMessage("Please pick polyline");
        peo.AddAllowedClass(typeof(Polyline), false);
        var per = ed.GetEntity(peo);
        if (per.Status != PromptStatus.OK)
        {
            return;
        }

        var pdr = ed.GetDouble("\nChiều dài đoạn:");
        if (pdr.Status != PromptStatus.OK)
        {
            return;
        }
        var kc = pdr.Value;
        using (var tr = db.TransactionManager.StartTransaction())
        {
            var pl = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Polyline;
            var n = pl.NumberOfVertices;
            int m=0;
            for (int i = 0; i < n; i++) 
            {
                if (pl.GetBulgeAt(i) !=0)
                {
                    m = i;
                }   
            }
            if (m == 0) { return; }
            var d1 = (pl.GetDistanceAtParameter(m + 1) + pl.GetDistanceAtParameter(m)) / 2;
            var pmid = pl.GetPointAtDist(d1);

            var arc = pl.GetArcSegment2dAt(m);
            var radius = arc.Radius;
            var cent = arc.Center;
            var lcungall = Math.Abs((arc.EndAngle - arc.StartAngle) * radius) / 2;
            var lcung = Math.Asin(kc * 0.5 / radius) * 2 * radius;
            if (lcung > lcungall)
            {
                AcadApp.ShowAlertDialog("Chiều dài đoạn đã lớn hơn cung, bye bye");
                return;
            }

            var dcl = pl.GetSplitCurves(new Autodesk.AutoCAD.Geometry.Point3dCollection() { pmid });
            if (dcl.Count != 2) { return; }
            var pl1 = dcl[0] as Polyline;
            var pl2 = dcl[1] as Polyline;

            if (pl1.EndPoint.IsEqualTo(pmid, Tolerance.Global))
            { pl1.ReverseCurve(); }
            if (pl2.EndPoint.IsEqualTo(pmid, Tolerance.Global))
            { pl2.ReverseCurve(); }

            var ls1 = new List<Point3d>();
            var ls2 = new List<Point3d>();

            var n1 = (int)((lcungall - lcung * 0.5) / lcung);
            for (int i = 0; i <= n1; i++) 
            { 
                ls1.Add(pl1.GetPointAtDist(i * lcung + lcung / 2));
                ls2.Add(pl2.GetPointAtDist(i * lcung + lcung / 2));
            }

            var pcl1 = new Point3dCollection();

            var ci1 = new Circle(ls1.Last(), Vector3d.ZAxis, kc);
            ci1.IntersectWith(pl1, Intersect.ExtendThis, pcl1, IntPtr.Zero, IntPtr.Zero);
            foreach (Point3d p in pcl1)
            {
                if (pl1.GetParameterAtPoint(p) > 1)
                {
                    ls1.Add(p);
                }
            }
            pcl1 = new Point3dCollection();
            var ci2 = new Circle(ls2.Last(), Vector3d.ZAxis, kc);
            ci2.IntersectWith(pl2, Intersect.ExtendThis, pcl1, IntPtr.Zero, IntPtr.Zero);
            foreach (Point3d p in pcl1)
            {
                if (pl2.GetParameterAtPoint(p) > 1)
                {
                    ls2.Add(p);
                }
            }

            ls1.Reverse();
            foreach (Point3d p in ls2)
            { ls1.Add(p); }

            Polyline plnew = new Polyline();
            plnew.SetDatabaseDefaults();
            plnew.ColorIndex = 1;

            foreach (Point3d p in ls1)
            {
                plnew.AddVertexAt(plnew.NumberOfVertices, p.Convert2d(new Plane()), 0, 0, 0);
            }

            var cspace = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
            cspace.AppendEntity(plnew);
            tr.AddNewlyCreatedDBObject(plnew, true);

            pl1.Dispose();
            pl2.Dispose();
            pcl1.Dispose();                   

            tr.Commit();
        }

        



    }
}

 

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

Hỏi: Với cung tròn R6.0 , xếp được bao nhiêu phân đoạn 3.4 ?

Đáp: Tuỳ vào độ dài cung.

Như vậy đó bác.

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

Đến giờ này bác @cuongtk2 vẫn còn bám theo yêu cầu chủ thớt là chính giữa phải là 1 cạnh chứ ko phải một đỉnh nên chỉ xét  số đoạn thẳng theo số lẻ chứ ko thì còn phải tính trường hợp số đoạn thẳng là số chẵn nửa. Mà đến giờ chắc là đúng ý thớt rồi á. Còn lại mọi người mình chém và tự đặt đề cho nhau giải coi như là đề tài thú vị nghiên cứu chơi vậy thôi.

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

Trong thực tế bài toán chia đoạn tường rào theo đường cong là có thiệt. Nhưng mình thì rải đuổi 1 đầu, thiếu đủ anh cuối chịu tuỳ thực tế chứ ít chơi cả 2 đầu chịu lắm, và cũng hiếm khi không đủ lại lấy bên đường thẳng qua vì như vậy mất chút đất của ranh thẳng chủ đầu tư sẽ bắt đền đấy.

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

Đó là mình giả thuyết vậy thôi. Đoạn rào bố trí cho phép từ 2.7m-3.6m (chẵn đến decimet), với mình sẽ chia khoảng đều nhau ở phép tính gần đúng nhất có thể. Đoạn thừa (thiếu) sẽ để sang 2 bên với chiều dài đoạn đảm bảo.

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
3 giờ trước, duy782006 đã nói:

Trong thực tế bài toán chia đoạn tường rào theo đường cong là có thiệt. Nhưng mình thì rải đuổi 1 đầu, thiếu đủ anh cuối chịu tuỳ thực tế chứ ít chơi cả 2 đầu chịu lắm, và cũng hiếm khi không đủ lại lấy bên đường thẳng qua vì như vậy mất chút đất của ranh thẳng chủ đầu tư sẽ bắt đền đấy.

 

@duy782006 thực tế làm hàng rào theo ranh đất là không có vid ranh đất là các đoạn thẳng, chia hàng rào thì phải tính thêm khe lún (khe co dãn) giữa các phân đoạn rào

 

 

Vào lúc 24/4/2024 tại 16:40, thuyen mai đã nói:

Em chào các bác ạ!

Em đang cần tìm một lisp chia góc thành nhiều đoạn theo chiều dài cho trước (theo hình như bên dưới).

Các bác có thể giúp em viết lisp để xử lý bài toán này không ạ?

Em không biết gì về Lisp cả nên phải đi nhờ em cũng ngại lắm.

Rất mong được các bác giúp đỡ. Em cảm ơn nhiều ạ!

 

image.png.34e2203de5e0af278b513acb623de357.png

 

@thuyen mai trong video trên của mình chỉ cần nhập các số liệu: 3 điểm xác định góc, chiều dài đoạn, góc lệch giữa các đoạn liền kề ( hoặc nhập số phân đoạn ). Cách làm của Bạn là vẽ cung tròn rồi chia đoạn trên cung, bánh kính cung tròn để vẽ đã đúng chưa, đầu vào không đúng thì kết quả ra không đúng

 

@All làm cách nào để đưa video từ youtube vào cadviet mà không phải là đường link

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ủ nhà chạy mất tăm sau khi đặt ra đề toán mà khách khứa mỗi người hiểu một kiểu.
Khách khứa mang quà đến tặng nhưng không biết chủ nhà có nhận không.

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

×