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

tannguyen291

Thành viên
  • Số lượng nội dung

    449
  • Đã tham gia

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

  • Ngày trúng

    43

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


  1. Mình có thể viết được chương trình để 1 nút bấm xong toàn bộ. hoàn thành cả bảng cho bạn luôn.

    Gợi ý cho các bạn code nhé:

    - Chọn toàn bộ và lọc thành 2 list:

        text và phần còn lại.

    -  foreach item lst_text 

       sử dụng boudary (vl-cmdf "_.boundary" "a" "b" "n" lst_dt "I" "Y" "O" "P" "x" pt_text "")

      lấy được pline tại điểm text  và trích xuất độ dài các cạnh của pline đó.

    không khó phải không.

    nếu không có bạn nào giúp thớt thì liên lạc lại mình nhé.

     


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

    Cái này có cách nào khắc phục được không Các Bác Ơi ?

    mình fix lại rồi bạn xem thế nào nhé. 

    (defun c:test (/ lsttxt lstln item mx1 distan eng dis2 ang2)
      (foreach item (acet-ss-to-list (ssget '((0 . "TEXT,LINE,*POLYLINE"))))
        (if (= "TEXT" (cdr (assoc 0 (entget item))))
          (setq lsttxt (cons (cons item (cdr (assoc 10 (entget item)))) lsttxt))
          (setq lstln (cons (vlax-ename->vla-object item) lstln))
        )
      )
      (setq distan (getdist "\nKhoang cach text:"))
      (foreach item lsttxt
        (setq 
          mx1 (mapcar '(lambda (x / dis1 pt ) (vlax-curve-getClosestPointTo x (cdr item))) lstln)
          mx1 (car (vl-sort mx1 '(lambda (a b) (< (distance (cdr item) a) (distance (cdr item) b)))))
          eng (entget (car item))
          dis2 (cdr (assoc 40 eng))
          ang2 (cdr (assoc 50 eng))
        )
        (if (< (sin (- ang2 (angle (cdr item) mx1))) -1e-14)
          (setq mx1 (polar mx1 (angle mx1 (cdr item)) (+ distan dis2)))
          (setq mx1 (polar mx1 (angle mx1 (cdr item)) distan))
        )
        (vla-move (vlax-ename->vla-object (car item)) (vlax-3d-point (cdr item)) (vlax-3d-point mx1))
        ;(entmod (subst (cons 10 mx1) (assoc 10 eng) eng))
      )
      (princ)
    )

     

    • Like 2

  3. Chào các bạn mình là một kiến trúc sư quy hoạch.

    Đối với ngành nghề này có rất nhiều các công việc lặp đi lặp lại tốn nhiều thời gian và công sức.

    Hôm nay mình muốn giới thiệu tới các bạn 2 công cụ mình tự viết.

    A. Soft hỗ trợ vẽ Quy hoạch

    Soft này gồm 4 tính năng chính và một vài tính năng hỗ trợ

    1. Gán diện tích vào ô đất quy hoạch

    giphy.gifgiphy.gif

    Lựa chọn đặt tên tăng dần theo select set hoặc theo toạ độ trên dưới trái phải.

    Tự động nhập các thông số khác theo block vừa chọn như tên ô đất (tăng dần), mật độ xây dựng, hệ số sdd, tầng cao...

    Có tuỳ chọn về định dạng số liệu chấm phảy theo chuẩn việt nam.

    2. Gán tem thửa đất. 

    giphy.gifgiphy.gif

    Boundary và gán ten diện tích cùng tên thửa đất.

    Tự động nhận diện thửa không phải đất ở và loại trừ.

    Đề xuất thông minh tên ô đất cho vòng lặp tiếp theo. 

    3. Lập bảng thống kê ranh giới toạ độ

    giphy.gif

    Gán mốc toạ độ không hề mới.

    Tuy nhiên công cụ của mình không cần block mẫu, nhận diện edge là đường cong để thêm toạ độ tại đỉnh đường cong.

    Tự động di chuyển attout ra ngoài ranh giới dễ dàng trong việc in ấn và hiển thị. lập bảng thống kê trên cad và cũng có thể xuất ra excel.

    4. Công cụ trợ giúp lập bảng thống kê quy hoạch

    giphy.gif

    Sử dụng hàm Sum và vlookup cho công thức excel. hỗ trợ thống kê quy hoạch.

    Ngoài ra còn rất nhiêu tính năng hữu ích khác nữa...

    image.png.dc9be26baff75145e1668d4c995b9a35.png

     

    B. Soft hỗ trợ vẽ cảnh quan

    Soft hỗ trợ vẽ cảnh quan của mình các bạn xem tại video này nhé. 

     

    Gồm 5 chức năng quan chính:

    - Vẽ công trình mẫu liền kề, biệt thự, công trình góc (kể cả trên các ô đất méo, cong ...)

    - Rải block tương tự như Multi Scater trên các phần mềm khác.

    - Rải cây xanh theo tuyến. 

    - Vẽ vạch kẻ đường

    - Xuất các block trong cad sang định dạng Lumion có thể hiểu được. phục vụ công việc vẽ 3d phối cảnh.

    Cảm ơn các bạn đã đọc hết bài viết của mình!

     

    Liên hệ: Nguyễn Nhật Tân

    SĐT:      0395.218.999

    Email:    nguyennhattanpt@gmail.com

    Chân thành cảm ơn!

     

     

     

     

    • Like 4

  4. 2 phút trước, Hoanghung97 đã nói:

    đồng ý với quan điểm của bác. vd  như ở dưới hình khi nhập 1.5 thì khoảng cách từ đường line đến text đúng = khoảng cách nhập  (1.5) + height text (2.02)= 3.7

      

     

    Bạn nhanh tay quá. mình đã sửa lại lisp rồi. kk bạn xem code từ lúc chưa sửa.

    • Like 1

  5. Lisp như bạn mong muốn thì có thể viết được nhưng độ chính xác thì k cao lắm. vì phải so sánh tất cả các đường line hoặc pline để chọn ra đường chuẩn sau đó move text.

    Với bản vẽ đơn giản thì ok, nhưng với bản vẽ quá lớn. chương trình sẽ chạy chậm vì phải so sánh quá nhiều. ưu tiên chọn từng vùng để chạy lệnh

    (defun c:test (/ lsttxt lstln item mx1 distan eng dis2 ang2)
      (foreach item (acet-ss-to-list (ssget '((0 . "TEXT,LINE,*POLYLINE"))))
        (if (= "TEXT" (cdr (assoc 0 (entget item))))
          (setq lsttxt (cons (cons item (cdr (assoc 10 (entget item)))) lsttxt))
          (setq lstln (cons (vlax-ename->vla-object item) lstln))
        )
      )
      (setq distan (getdist "\nKhoang cach text:"))
      (foreach item lsttxt
        (setq 
          mx1 (mapcar '(lambda (x / dis1 pt ) (vlax-curve-getClosestPointTo x (cdr item))) lstln)
          mx1 (car (vl-sort mx1 '(lambda (a b) (< (distance (cdr item) a) (distance (cdr item) b)))))
          eng (entget (car item))
          dis2 (cdr (assoc 40 eng))
          ang2 (cdr (assoc 50 eng))
        )
        (if (< (sin (- ang2 (angle (cdr item) mx1))) -1e-14)
          (setq mx1 (polar mx1 (angle mx1 (cdr item)) (+ distan dis2)))
          (setq mx1 (polar mx1 (angle mx1 (cdr item)) distan))
        )
        (entmod (subst (cons 10 mx1) (assoc 10 eng) eng))
      )
      (princ)
    )

     

    • Like 1

  6. 5 giờ trước, Duong Nhat Duy đã nói:

    Nhân tiện mình muốn hỏi làm cách nào mà bạn tạo được cái linear parameter bắt điểm vào 2 bên đường tròn nhỉ

    cái này mình có một mẹo nhỏ thôi. mình vẽ 1 line rồi autoconstan vs đường cong. DIM Horizon sau đó ẩn line đi (không phải xoá đâu mình chỉ ẩn đi thôi.

    Drawing1.dwg

    • Like 1

  7. @NTHAHT Rất xin lỗi vì mình không nghĩ tới trường hợp này

    image.png.c58ac660f61bc2f98dce418a9a754f39.png

    chỉ cần bo ở vùng xanh nó tạo ra cả đường bên trong.

    nhưng không sao mình đã fix lại hàm của mình

    (defun BoundaryAreaPoint (pt / ent lst area)
      (setq ent (entlast))
      (vl-cmdf "_.boundary" "A" "I" "Y" "O" "R" "X" pt "")
      (while (setq ent (entnext ent))
        (setq lst (cons (vlax-ename->vla-object ent) lst))
      )
      (if (< 1 (length lst))
        (progn
          (setq lst (vl-sort lst '(lambda (a b) (> (vla-get-area a) (vla-get-area b)))))
          (foreach item (cddr lst)
            (vla-boolean (cadr lst) acunion item)
          )
          (vla-boolean (car lst) acsubtraction (cadr lst))
        )
      )
      (setq  area (vla-get-area (CAR lst)))
      (LIST area (CAR lst))
    )

    tks bạn nhé. mình chưa tính hết các khả năng

    còn việc thêm bộ lọc là tuỳ ở chủ thớt thích thêm cái nào thì thêm vậy.


  8. 1 giờ trước, NTHAHT đã nói:

    Với phương án Boundary có vẻ chưa được ổn.

    1. Khi có 3 miền kín lần lượt lồng vào nhau (ví dụ dễ hình dung nhất là 3 đường tròn đồng tâm có bán kính khác nhau, muốn pick tính dải ngoài cùng thì nó trừ luôn cả diện tích cả 2 đường tròn phía trong.

     2. Hàm BoundaryAreaPoint xử lý chưa triệt để nếu vùng pick tính  diện tích có MTEXT nằm trong đó.

    Vấn đề 1 không thể sảy ra.

    Vì mỗi lần pick đã kết thúc lệnh bo và tính toán diện tích rồi.

    lần pick thứ 2 lại kết thúc lệnh bo và tính lần tiếp theo

    sau đó mới công tổng các lần vừa rồi. không tính gộp

    bạn có thể test trực tiếp và đưa ra con số cho mình.

     

    Vấn đề thứ 2 bạn sảy ra cả khi dùng hatch và mình cũng có cách sửa cho nó.

     

    (setq ss  (ssget "all" '((0 . "LINE,*POLYLINE,CIRCLE,ARC,SPLINE"))))

    (VL-cmdf "_.boundary" "A" "B" "N" ss ......

     

    các bạn đọc kỹ code của mình rồi hãy phán. please

     

    • Vote giảm 1

  9. 8 phút trước, Duong Nhat Duy đã nói:

    Hê hê cảm ơn bạn nhé, để mình chỉnh sửa lại lisp cho ngon ngẻ :))

    chưa chắc đã ngon hơn đâu bạn

    Trong lập trình có 1 câu là cái gì đang hoạt động tốt thì đừng sửa nó. :)

    với file cad nhẹ nhàng lệnh của mình chạy nhanh hơn.

    nhưng với file nặng thì 1 lệnh command nặng sẽ nhanh hơn 10 lệnh command nhẹ.

    :))


  10. 49 phút trước, Duong Nhat Duy đã nói:

    Mình mới đọc qua thôi chưa test, mà tóm lại ntn: các lệnh DT3, 4 để tính S đối tượng thì dễ r khỏi bàn; lệnh DT1 thì có thể viết = nhiều cách; nhưng lệnh DT2 chủ ý của mình là pick được nhiều điểm cùng lúc, pick đâu highlight đến đó, như vậy bạn cải tiến nó lên để ko dùng command nữa đc ko, mình cảm ơn !

    Để tạo ra boundary không dùng command  thì mình có 1 hàm như vậy.

    thuật toán rất dài và chạy cũng k nhanh hơn command boundary.

    Cảm thấy như là dùng dao mổ trâu để giết con gà vậy.

    Vì command hatch chạy khá ì ạch nên mọi người cho rằng boundary sẽ nhanh hơn.

    Hàm phía trên của mình có thể áp dụng cho DT2 của bạn được đấy.

    (defun c:testdt2 (/ areaall ptx ss1 lst)
      (setq areaall 0)
      (while (setq ptx (getpoint))
        (setq 
          ss1 (BoundaryAreaPoint ptx)
          areaall (+ areaall (car ss1))
          lst (append lst (cdr ss1) )
        )
        (mapcar '(lambda (x) (redraw (vlax-vla-object->ename x) 3)) (cdr ss1))
      )
      (setq ptx (getpoint))
      (mapcar 'vla-delete lst)
      (entmake (list(cons 0 "TEXT")(cons 100 "AcDbEntity")(cons 100 "AcDbText")
                    (cons 1 (rtos areaall 2 2))(cons 10 ptx)(cons 40 2)(cons 41 1)(cons 50 0)))
      (princ)
    )

     

    • Like 1

  11. 13 phút trước, huunhantvxdts đã nói:

    Nhầm ý mình có người nói Thay Hatch bằng Polyline. mà như trường hợp trên có 2 polyline chồng nhau nên khó làm thôi.

    mình không hiểu ý bạn. 

    (defun c:testdt1 (/ pt1 sb str)
      (setq 
        pt1 (getpoint )
        sb (BoundaryAreaPoint pt1)
        str (rtos (car sb) 2 2)
      )
      (mapcar 'vla-delete (cdr sb))
      (entmake (list(cons 0 "TEXT")(cons 100 "AcDbEntity")(cons 100 "AcDbText")(cons 1 str)(cons 10 pt1)(cons 40 2)(cons 41 1)(cons 50 0)))
      (princ)
    )

    bạn thử đoạn test này của mình xem lỗi ở đâu

    • Like 1

  12. @Duong Nhat Duy

    bạn thử dùng hàm này của mình xem sao thay cho hatch.

    (defun BoundaryAreaPoint ( pt / ent lst area)
      (setq ent (entlast))
      (vl-cmdf "_.boundary" "A" "I" "Y" "O" "P" "X" pt "")
      (while (setq ent (entnext ent))
        (setq lst (cons (vlax-ename->vla-object ent) lst))
      )
      (setq 
        lst (vl-sort lst '(lambda (a b) (> (vla-get-area a) (vla-get-area b))))
        area (abs (apply '- (mapcar 'vla-get-area lst)))
      )
      (cons area lst)
    )

     

    • Like 1

  13. Vào lúc 25/12/2022 tại 10:30, Doan Van Ha đã nói:

    Test lisp SPA trên Cad2023 không thấy nhanh hơn tí nào.
    Lập 1 hàm chạy trên Cad2007 mất tầm 5 giây, nhưng trên Cd2023 mất tầm 12 giây. Không biết do những biến nào?
     Có ai test 2023 thử chưa vậy?

    Em đang dùng cad 2023 và thấy đúng như bác nói. nó k hề nhanh hơn chút nào và hiện tại đang hạnh phúc với mặc định của cad.

    Theo thông tin bề lề em đc biết thì từ đời 2023 đã ứng dụng multicore nên dùng khá thích.

    Chưa kể bây giờ bác nào cũng có card đồ hoạ cắm vào máy tính rồi thì lo gì mà phải làm nhẹ cad nữa (trong lisp spa chủ yếu tắt các tính năng hiển thị preview...).

    dùng cad đời thấp lại khó tương thích với các thiết bị hiện đại bây giờ.


  14. 23 giờ trước, 7o7 đã nói:

    (vla-AddHatch (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-Acad-Object))) acHatchPatternTypePreDefined "ANSI31" :vlax-True))

    Lệnh này sẽ không chạy được giống như DT1 của bác Duong Nhat Duy. Vì phải có đối tượng để dùng vla-appendouterloop

    Có thể thay thế lệnh hatch bằng  (bpoly  point ) tạo ra pline

    Nếu tạo ra nhiều hơn 1 đối tượng thì tính diện tích pline lớn nhất trừ đi các diện tích nhỏ hơn. 

    (mình không thích lệnh bpoly nhưng đây là sự lựa chọn đơn giản nhất)

     

×