![](https://www.cadviet.com/forum/uploads/set_resources_1/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://www.cadviet.com/forum/uploads/monthly_2022_07/T_member_178294.png)
tannguyen291
-
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. Nếu bạn chỉ đơn giản là Dim arc thì học theo bác @Doan Nguyen Van
2. Nếu bạn đang định viết chương trình Dim theo polyline nên P1 P2 không theo quy luật thì tham khảo thêm về Bulge Polyline hoặc Bulge arc để rõ cái này hơn.
-
1
-
-
Mình có 1 cách rất hay mà nhiều anh em đều áp dụng:
Format disk and Reinstall windows os!
-
20 giờ trước, tranducanh18 đã nói:Mình cùng câu hỏi và cách sửa dấu chấm sang dấu phẩy để đưa vào exel? Tks b
Bạn có thể tham khảo bài viết của mình có tuỳ chọn unit và định dạng số liệu đầy đủ.
-
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é.
-
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) )
-
2
-
-
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
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.
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ạ độ
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
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...
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!
-
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.
-
1
-
-
10 phút trước, Duong Nhat Duy đã nói:Làm cách nào để hiện nó lên nhỉ, mình thử Unisolate Objects r mà ko đc
À cái này là chức năng hide của block. bạn gọi lệnh BVMODE nhập 1.
-
1
-
-
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) )
-
1
-
-
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.
-
1
-
-
-
@NTHAHT Rất xin lỗi vì mình không nghĩ tới trường hợp này
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.
-
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
-
1
-
-
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ẹ.
:))
-
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) )
-
1
-
-
Ý của bạn là dt4 của bác duy đó hả.
cái đó thì còn dễ hơn.
dùng vla-addregion xong rồi vla-boolean - acunion lại toàn bộ là xong. không cần dùng đến command luôn. :))
-
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
-
1
-
-
1 phút trước, huunhantvxdts đã nói:Nếu Polyline thì khó xét vùng giao nhau?
Boundary mà bạn. làm sao mà giao nhau??
-
dùng MLINE khá là thích
-
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) )
-
1
-
-
36 phút trước, Duong Nhat Duy đã nói:Cao nhân @tannguyen291 cho hỏi mình làm thế OK chưa, có cách nào bỏ 2 cái point rác trong block đó ko nhỉ ?
point tâm block thì không bỏ được rồi.
mình cũng góp 1 cái block
-
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ờ.
-
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)
-
bạn sẽ phát khóc khi nhìn cái này
-
1
-
2
-
Lisp entmake Arc length Dimension
trong AutoLisp
Đã đăng · Trả lời báo cáo
Mình cũng có 1 lisp dim all polyline giống như bạn. dim cả cạnh arc.
Explode ra đơn giản hiệu quả hơn.
Dùng cái này
(setq lst_edge (vlax-invoke obj 'Explode))
foreach item in lst_edge