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

Nhờ viết lisp thông kê giá trị trong block ATT

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

Chào các bác và ACE trên DD, em xin được ké Topic này.

Em cũng có vấn đề với thống kê ATT BLOCK nhờ các bác trợ giúp <Xin cám ơn các bác trước!!!>.

Em đã tìm kiếm trên DD nhưng chưa có lisp nào phù hợp với nhu cầu của em, hoặc là chưa tìm ra... mong các bác thông cảm.

Cụ thể là:

+ Trên bản vẽ của em có 2 loại Att Block.

+ Mỗi Att Block có 2 Tag, 1 Tag là ký hiệu cửa (KYHIEU), 1 Tag là quy cách cửa (QUYCACH).

+ Trong Tag QUYCACH có ghi: 2S-1200-K250 hoặc 4D-1800-K150.

* Trong đó:

- Số đầu tiên là số cánh cửa (2 hay 4)

- Thứ 2 là (S or D) là (S) - cửa sổ, (D) - Cửa đi.

- Tiếp theo: 1200 or 1800 là chiều rộng cửa.

- Cuối cùng: 250 or 150 là 1 chiều của tiết diện khuôn cửa.

+ Block và bảng thống kê trong bản vẽ kèm theo.

Một lần nữa xin cám ơn các bác và ACE trước...!

file: http://www.cadviet.com/upfiles/4/141736_tkcua_1.dwg

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

Sử dụng hàm Trunc (real) trong formula.

Mình còn bị vướng một vấn đề mà tìm không ra được cách giải quyết, là ở chỗ nếu mà CHIỀU DÀI =<11700 thì kết quả trả về cũng kết quả là bằng 0, nên dùng hàm trunc không được. Mong bạn và mọi người chỉ mình cách tính trong formula giống như hàm if trong excel là:

IF(CHIỀU DÀI <= 17000,CHIỀU DÀI,CHIỀU DÀI + 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700)

(nếu chiều dài bé hơn hoặc bằng 11700 thì kết quả trả về là 11700, nếu chiều dài lớn hơn 11700 thì kết quả trả về là bằng 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700)

Cảm ơn bạn và mọi người trước nhé!

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

Mình còn bị vướng một vấn đề mà tìm không ra được cách giải quyết, là ở chỗ nếu mà CHIỀU DÀI =<11700 thì kết quả trả về cũng kết quả là bằng 0, nên dùng hàm trunc không được. Mong bạn và mọi người chỉ mình cách tính trong formula giống như hàm if trong excel là:

IF(CHIỀU DÀI <= 17000,CHIỀU DÀI,CHIỀU DÀI + 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700)

(nếu chiều dài bé hơn hoặc bằng 11700 thì kết quả trả về là 11700, nếu chiều dài lớn hơn 11700 thì kết quả trả về là bằng 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700)

Cảm ơn bạn và mọi người trước nhé!

 

Cái này lạ nghe!

- Nếu chiều dài <11700 thì trả về 11700 . Ví dụ chiều dài thanh thép có 1,0m thì trả về 11,7m thì lạ quá!

- Câu màu đỏ mâu thuẫn với câu màu xanh trong bài viết của bạn!

- Trong Formular không có if 

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

Theo đà này thì bác pawuta sẽ có thêm vướng mắc.

1. Chieudai/11700 = a (số nguyên hay không???).

Khi: 1 < a <= 2 luôn có 1 đoạn nối

Khi: a > 2

+ n < a <= (n+1) |=> đều có n-1 đoạn nối.

2. Khi đường kính thép là 8 hay 6 ???

...

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 này lạ nghe!

- Nếu chiều dài <11700 thì trả về 11700 . Ví dụ chiều dài thanh thép có 1,0m thì trả về 11,7m thì lạ quá!

- Câu màu đỏ mâu thuẫn với câu màu xanh trong bài viết của bạn!

- Trong Formular không có if 

Hehe, xin lỗi mình nhầm: nếu CHIỀU DÀI bé hơn hoặc bằng 11700 thì kết quả trả về là CHIỀU DÀI, nếu lớn hơn 11700 thì kết quả trả về là CHIỀU DÀI + 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700). Mình định đặt cái hàm này vô công thức tính chiều dài thép luôn, bạn có cách nào giải quyết không giúp mình với, chỉ còn mỗi chỗ này nữa thôi.

Với lại xin phép phiền bạn và mọi nguời nếu có thời gian rãnh thì giúp mình sửa lại lisp bài #20 thành thế này nhé, để sử dụng cho việc bốc dự toán:

136880_capture_2.jpg

Cảm ơn bạn và mọi ngườ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

Theo đà này thì bác pawuta sẽ có thêm vướng mắc.

1. Chieudai/11700 = a (số nguyên hay không???).

Khi: 1 < a <= 2 luôn có 1 đoạn nối

Khi: a > 2

+ n < a <= (n+1) |=> đều có n-1 đoạn nối.

2. Khi đường kính thép là 8 hay 6 ???

...

Hehe, cảm ơn bạn đã góp ý:

1. là mình đã giải quyết bằng cách dùng hàm trunc để a luôn là số nguyên; nhưng chỉ sợ a = 1 thôi, vì a=1 thì n=0, cái này nhờ anh em giải quyết giúp, nếu được thì quá tuyệt vời

2. khi thống kê cho thép 6 hoặc 8 thì mình không cho hệ số a vào

Mình làm cái thống kê này chủ yếu là đặt công thức trong formula (field)nên bị hạn chế lắm

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

Hehe, xin lỗi mình nhầm: nếu CHIỀU DÀI bé hơn hoặc bằng 11700 thì kết quả trả về là CHIỀU DÀI, nếu lớn hơn 11700 thì kết quả trả về là CHIỀU DÀI + 30*ĐƯỜNG KÍNH*CHIỀU DÀI/11700). Mình định đặt cái hàm này vô công thức tính chiều dài thép luôn, bạn có cách nào giải quyết không giúp mình với, chỉ còn mỗi chỗ này nữa thôi.

................

Cảm ơn bạn và mọi người!

 

Hàm Trunc Giải quyết chỗ này tốt mà bạn!

Chiều dài + (trunc (CHIỀU DÀI/11700)*30*Đường kính)

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àm Trunc Giải quyết chỗ này tốt mà bạn!

Chiều dài + (trunc (CHIỀU DÀI/11700)*30*Đường kính)

Nếu CHIỀU DÀI = 11700 thì đâu có cộng thêm đoạn thép nối đâu bạn, chỉ khi chiều dài lớn hơn 11700 thì mới cộng thêm đoạn thép nối CHIỀU DÀI/11700)*30*Đường kính

Cụ thể là thế này:

CHIỀU DÀI <= 11700 thì kết quả của hàm (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 0

11700<CHIỀU DÀI <23400 thì kết quả trả về là (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 1

23400 <=CHIỀU DÀI < 35100 (hoặc cấp số nhân của 11700 trừ cấp số nhân là "1") thì kết quả (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 2

......

Hehe, mình không biết phải làm sao nữa, vấn đề là khi CHIỀU DÀI = 11700 thì (trunc (CHIỀU DÀI/11700)*30*Đường kính) = 0

mà CHIỀU DÀI = 23400 thì (trunc (CHIỀU DÀI/11700)*30*Đường kính) = 2

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ếu CHIỀU DÀI = 11700 thì đâu có cộng thêm đoạn thép nối đâu bạn, chỉ khi chiều dài lớn hơn 11700 thì mới cộng thêm đoạn thép nối CHIỀU DÀI/11700)*30*Đường kính

Cụ thể là thế này:

CHIỀU DÀI <= 11700 thì kết quả của hàm (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 0

11700<CHIỀU DÀI <23400 thì kết quả trả về là (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 1

-> sai <=23400 mới đúng

23400 <=CHIỀU DÀI < 35100 (hoặc cấp số nhân của 11700 trừ cấp số nhân là "1") thì kết quả (trunc (CHIỀU DÀI/11700)*30*Đường kính) phải = 2

-> sai 23400<chiều dài<=35100 mới đúng

......

Hehe, mình không biết phải làm sao nữa, vấn đề là khi CHIỀU DÀI = 11700 thì (trunc (CHIỀU DÀI/11700)*30*Đường kính) = 0

mà CHIỀU DÀI = 23400 thì (trunc (CHIỀU DÀI/11700)*30*Đường kính) = 2

 

Lợi dụng tính chất là kích thước thép buộc phải là số nguyên, bạn có thể làm như sau:

Chiều dài +(trunc((chiều dài-0.1)/11700)*30*D)

 

Không thể nào nhập thanh thép mà thanh nó có kích thước 11700.1 cả, phải không?

Mà thanh thép có L=11701 thì đương nhiên >11700 thì phải +30D rồi, pk? ^_^

 

PS: Mấy dòng mình bôi xanh trong bài viết của bạn là mấy dòng bạn viết có sự nhầm lẫn đó ^_^

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ợi dụng tính chất là kích thước thép buộc phải là số nguyên, bạn có thể làm như sau:

Chiều dài +(trunc((chiều dài-0.1)/11700)*30*D)

 

Không thể nào nhập thanh thép mà thanh nó có kích thước 11700.1 cả, phải không?

Mà thanh thép có L=11701 thì đương nhiên >11700 thì phải +30D rồi, pk? ^_^

 

PS: Mấy dòng mình bôi xanh trong bài viết của bạn là mấy dòng bạn viết có sự nhầm lẫn đó ^_^

Hehe, mấy bữa mình cũng nhiều cách và cũng đã làm như vậy nhưng không được tại vì mình không sai đâu.

ví dụ: bạn lấy 2 cây 11700 nối lại với nhau thì phải trừ đi 30d rồi, nên chỉ còn là 23400-30D, vậy khi muốn chiều dài là 23400 thì phải nối thêm một đoạn là (23400-30D)+30D. Cho nên nó bằng 2 mối nối, tương tự nếu muốn có chiều dài là 35100 thì phải có 3 mối nối.

Cái này chỉ còn khi thác ở chỗ bạn nói là không ai mà dùng thép số lẻ cả nhưng vậy thì nó lại khó ở chỗ là khi CHIỀU DÀI = 11700 và cấp số nhân của 11700

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

Hehe, mấy bữa mình cũng nhiều cách và cũng đã làm như vậy nhưng không được tại vì mình không sai đâu.

ví dụ: bạn lấy 2 cây 11700 nối lại với nhau thì phải trừ đi 30d rồi, nên chỉ còn là 23400-30D, vậy khi muốn chiều dài là 23400 thì phải nối thêm một đoạn là (23400-30D)+30D. Cho nên nó bằng 2 mối nối, tương tự nếu muốn có chiều dài là 35100 thì phải có 3 mối nối.

Cái này chỉ còn khi thác ở chỗ bạn nói là không ai mà dùng thép số lẻ cả nhưng vậy thì nó lại khó ở chỗ là khi CHIỀU DÀI = 11700 và cấp số nhân của 11700

 

Mình không hiểu ý bạn nói

Nếu như cây 23400 thì chỉ cần 2 cây 11700 nối đối đầu với nhau và chỉ cần 1 đoạn nối thôi chứ nhỉ?

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

Mình không hiểu ý bạn nói

Nếu như cây 23400 thì chỉ cần 2 cây 11700 nối đối đầu với nhau và chỉ cần 1 đoạn nối thôi chứ nhỉ?

Theo cách mình tính là nối 2 thanh thép chồng lên nhau một khoảng là 30D mà bạn, mình không sử dụng cách nối là có thêm thanh trung gian nếu như vậy đoạn thép nối phải là 60D lận.

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

Như vậy thì hàm trunc chỉ bị 1 lỗi ở thanh 11700 thôi, còn lại là đúng hết phai không bạn?

Thật đáng tiếc trong formular thì không có hàm if, dùng diesel trong field thì có hàm if nhưng nó không link tới các kích thước thành phần của thép được

Chắc chỉ có dùng Lisp tác động vào 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

Vấn đề nằm ở chỗ này...

Trường hợp 1: Nếu cần 1 thanh có chiều dài là: 23.400

+ Nối đối đầu: Thì cần thêm 1 thanh có chiều dài 60D (vì mỗi 30D được nối với 1 thanh).

+ Nối chồng (Kiểu bắt tay): Gồm 2 thanh 11.700, như vậy chiều dài còn thiếu 30D,

=>thêm 1 đoạn nữa => nếu nối chồng tiếp thì cần 1 thanh có chiều dài 30D+30D=60D

Trường hợp 2: Nếu cần 1 thanh có chiều dài là: 20.000

+ Nối đối đầu: Giống như trên

+ Nối chồng: 11.700+8.300+30D=20.000+30D (chỉ cần thêm 30D).

Các bác nghĩ sao???

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

Như vậy thì hàm trunc chỉ bị 1 lỗi ở thanh 11700 thôi, còn lại là đúng hết phai không bạn?

Thật đáng tiếc trong formular thì không có hàm if, dùng diesel trong field thì có hàm if nhưng nó không link tới các kích thước thành phần của thép được

Chắc chỉ có dùng Lisp tác động vào thôi

Đúng rồi bạn, mình chỉ bị vướng mỗi chỗ này thôi là oke rồi, làm công thức hoài mà vẫn không được, nếu có lisp tác động vào thì nó sẽ tác động như thế nào vậy bạn!

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

@Bác Tue_NV trong LISP em xử thế này liệu có ổn không?

 

(setq Kn (/ chieudai 11700))

(if (= Kn 0)

(setq sn 0)

(progn (setq n (fix Kn))

(setq m (/ n Kn))

(cond ((< m 1) (setq sn (* n 30)))

((= m 1) (setq sn (* (- n 1) 60))))))

(setq L_noi (* sn duongkinh)

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ào các bác và ACE trên DD, em xin được ké Topic này.

Em cũng có vấn đề với thống kê ATT BLOCK nhờ các bác trợ giúp <Xin cám ơn các bác trước!!!>.

Em đã tìm kiếm trên DD nhưng chưa có lisp nào phù hợp với nhu cầu của em, hoặc là chưa tìm ra... mong các bác thông cảm.

Cụ thể là:

+ Trên bản vẽ của em có 2 loại Att Block.

+ Mỗi Att Block có 2 Tag, 1 Tag là ký hiệu cửa (KYHIEU), 1 Tag là quy cách cửa (QUYCACH).

+ Trong Tag QUYCACH có ghi: 2S-1200-K250 hoặc 4D-1800-K150.

* Trong đó:

- Số đầu tiên là số cánh cửa (2 hay 4)

- Thứ 2 là (S or D) là (S) - cửa sổ, (D) - Cửa đi.

- Tiếp theo: 1200 or 1800 là chiều rộng cửa.

- Cuối cùng: 250 or 150 là 1 chiều của tiết diện khuôn cửa.

+ Block và bảng thống kê trong bản vẽ kèm theo.

Một lần nữa xin cám ơn các bác và ACE trước...!

file: http://www.cadviet.com/upfiles/4/141736_tkcua_1.dwg

Hề hề hề,

Lần này cho bạn ké, nhưng lần sau bạn không nên ké nữa bởi như vậy vấn đề của bạn sẽ ít được quan tâm hơn bởi mọi người thường chỉ quan tâm tới vấn đề của chủ thớt đặt ra. Bạn nên tạo một topic mới cho vấn đề của bạn thì vấn đề của bạn sẽ được nhiều người quan tâm hơn và sẽ nhanh có kết quả hơn.

Vấn đề của bạn mình đã thử viết cái lisp dưới đây, bạn dùng thử và cho ý kiến.

Lưu ý những điều sau khi sử dụng lisp này.

1/- Trên bản vẽ sử dụng lisp phải có style "KY-THUAT" với font là mscross.ttf như bản vẽ bạn gửi mẫu bởi nếu không có mình không đảm bảo là lisp sẽ chạy đúng.

2/- Bản vẽ sử dụng lisp phải có các block có tên block ,tên các thuộc tính, cũng như cấu tạo của block phải đúng như các block trên bản vẽ bạn đã gửi.

 

 

(defun c:tkc (/ ssl dlst e en k h kh txt n1 n2 name ltxt i dlst1 dlst2 ct pt p1 p2 p3 p4 p5 p6 p7 p8 )
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(alert "\n Hay chon toan bo cac block cua can thong ke")
(setq ssl (acet-ss-to-list (ssget (list (cons 0 "insert") (cons 66 1) (cons 2 "SH-CUASO,SH-CUADI")))))
(setq dlst (list))
(foreach bl ssl
   (setq e (cdr (assoc -2 (tblsearch "block" (cdr (assoc 2 (entget bl)))))))
   (while e
        (if (= (cdr (assoc 0 (entget e))) "TEXT")
            (setq k (cdr (assoc 1 (entget e))))
        )
        (setq e (entnext e))
   )
   (setq en (entnext bl))
   (while (/= (cdr (assoc 0 (entget en))) "SEQEND")
       (cond 
           ((and (= (cdr (assoc 0 (entget en))) "ATTRIB") (= (cdr (assoc 2 (entget en))) "KYHIEU")) (setq h (cdr (assoc 1 (entget en)))))
           ((and (= (cdr (assoc 0 (entget en))) "ATTRIB") (= (cdr (assoc 2 (entget en))) "QUYCACH")) (setq txt (cdr (assoc 1 (entget en)))))
           (T nil)
      )
      (setq en (entnext en))
   )
   (setq kh (strcat k h))
   (if (= k "S")
       (setq n1 "C\\U+1EECA S\\U+1ED4")
       (setq n1 "C\\U+1EECA ÐI")
   )
   (setq n2 (substr txt 1 1))
   (setq name (strcat n1 " " n2 " CÁNH"))
   (setq ltxt (separate txt "-")
             r (cadr ltxt)
             kc (substr (caddr ltxt) 2 ) 
             dlst (append dlst (list (list kh name r kc))) )
)
(setq dlst1 (list))
(While dlst
     (setq i 1)  
     (setq dlst2 (cdr dlst) )
     (foreach ds dlst2
          (if (equal ds (car dlst))
              (progn
                  (setq i (1+ i))
                  (setq dlst2 (vl-remove ds dlst2))
              )
          )
     )
     (setq dlst1 (append dlst1 (list (cons i (car dlst)))))
     (setq dlst dlst2)
)
dlst1 
(command "undo" "be") 
(while (not ct)
       (alert "\n Ban phai nhap chieu cao text trong bang thong ke")
       (setq  ct (getreal "\n Nhap chieu cao text trong bang thong ke <250> : "))
)
(setq pt (getpoint "\Chon diem dat bang thong ke")
          
          p1 (polar pt (* 1.5 pi) (* 4 ct))
          p2 (polar p1 0 (* 4 ct))
          p3 (polar p2 0 (* 8 ct))
          p4 (polar p3 0 (* 20 ct))
          p5 (polar p4 0 (* 10 ct))
          p6 (polar p5 0 (* 10 ct))
          p7 (polar p6 0 (* 10 ct))
          p8 (polar p7 (* 0.5 pi) (* 4 ct))
)   
(command "pline" pt p1 p7 p8 "c")
(command "pline" p2 (polar p2 (* 0.5 pi) (* 4 ct)) "")
(command "pline" p3 (polar p3 (* 0.5 pi) (* 4 ct)) "")
(command "pline" p4 (polar p4 (* 0.5 pi) (* 4 ct)) "")
(command "pline" p5 (polar p5 (* 0.5 pi) (* 4 ct)) "")
(command "pline" p6 (polar p6 (* 0.5 pi) (* 4 ct)) "")  
(command "style" "KY-THUAT" "micross.ttf" 0 1 0 "n" "n")
(command "text"  "J" "mc" (list (+ (car pt) (* 31 ct)) (+ (cadr pt) (* 3 ct))) (* 1.5 ct) 0 "B\\U+1EA2NG TH\\U+1ED0NG KÊ C\\U+1EECA")
(command "text"  "J" "mc" (list (+ (car p1) (* 2 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "STT")  
(command "text"  "J" "mc" (list (+ (car p2) (* 4 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "KÝ HI\\U+1EC6U") 
(command "text"  "J" "mc" (list (+ (car p3) (* 10 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "QUY CÁCH C\\U+1EECA")
(command "text"  "J" "mc" (list (+ (car p4) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "S\\U+1ED0 LU\\U+1EE2NG")
(command "text"  "J" "mc" (list (+ (car p5) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "CHI\\U+1EC0U R\\U+1ED8NG") 
(command "text"  "J" "mc" (list (+ (car p6) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "KHUÔN C\\U+1EECA")  
(setq i 1)
(foreach dl dlst1
       (setq  p1 (polar p1 (* 1.5 pi) (* 4 ct))
          p2 (polar p1 0 (* 4 ct))
          p3 (polar p2 0 (* 8 ct))
          p4 (polar p3 0 (* 20 ct))
          p5 (polar p4 0 (* 10 ct))
          p6 (polar p5 0 (* 10 ct))
          p7 (polar p6 0 (* 10 ct)) 
      )
      (command "pline" p1 (polar p1 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p2 (polar p2 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p3 (polar p3 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p4 (polar p4 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p5 (polar p5 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p6 (polar p6 (* 0.5 pi) (* 4 ct)) "") 
      (command "pline" p7 (polar p7 (* 0.5 pi) (* 4 ct)) "")   
      (command "text"  "J" "mc" (list (+ (car p1) (* 2 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (rtos i 2 ) )  
      (command "text"  "J" "mc" (list (+ (car p2) (* 4 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 1 dl)) 
      (command "text"  "J" "mc" (list (+ (car p3) (* 10 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 2 dl))
      (command "text"  "J" "mc" (list (+ (car p4) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 0 dl))
      (command "text"  "J" "mc" (list (+ (car p5) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 3 dl)) 
      (command "text"  "J" "mc" (list (+ (car p6) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 4 dl))
      (setq i (1+ i))
)
(command "pline" p1 p7 "")     
(command "undo" "e")   
(setvar "osmode" oldos)
(princ)         
)
      
      
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Separate (S sym / i L ch)
(setq i 0 L nil)
(while (< i (strlen S))
      (setq i (1+ i) ch (substr S i 1))
      (if (= ch sym) (progn
(setq
     L (append L (list (substr S 1 (- i 1))))
     S (substr S (1+ i) (- (strlen S) i))
     i 0
)
      )) 
)
(append L (list S))
)                
 
  • Vote tăng 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

Tuyệt vời...! Cám ơn bác phamthanhbinh đã nhắc nhở và cám ơn bác nhiều vì LISP.

Nhân đây, nhờ bác thêm việc nữa:

+ Sắp xếp thứ tự các loại cửa. Ví dụ: Đ1 ; Đ2; Đ3...; S1; S2; S3... theo thứ tự từ trên xuống (trong bảng thống kê).

+ Có cảnh báo khi nhỡ có nhầm khi cùng ký hiệu cửa nhưng quy cách khác nhau. Ví dụ như cùng S1 nhưng có cái thì 2 cánh, cái thì 3 cánh...

(Cảnh báo bằng thông báo hoặc đổi màu của ký hiệu...)

Một lần nữa xin cám ơn 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

Tuyệt vời...! Cám ơn bác phamthanhbinh đã nhắc nhở và cám ơn bác nhiều vì LISP.

Nhân đây, nhờ bác thêm việc nữa:

+ Sắp xếp thứ tự các loại cửa. Ví dụ: Đ1 ; Đ2; Đ3...; S1; S2; S3... theo thứ tự từ trên xuống (trong bảng thống kê).

+ Có cảnh báo khi nhỡ có nhầm khi cùng ký hiệu cửa nhưng quy cách khác nhau. Ví dụ như cùng S1 nhưng có cái thì 2 cánh, cái thì 3 cánh...

(Cảnh báo bằng thông báo hoặc đổi màu của ký hiệu...)

Một lần nữa xin cám ơn bác!

Hề hề hề,

Bạn down lại lisp dưới đây và test thử nhé.

 

(defun c:tkc (/ ssl dlst e en k h kh txt n1 n2 name ltxt i dlst1 dlst2 ct pt p1 p2 p3 p4 p5 p6 p7 p8 )
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(alert "\n Hay chon toan bo cac block cua can thong ke")
(setq ssl (acet-ss-to-list (ssget (list (cons 0 "insert") (cons 66 1) (cons 2 "SH-CUASO,SH-CUADI")))))
(setq dlst (list))
(foreach bl ssl
   (setq e (cdr (assoc -2 (tblsearch "block" (cdr (assoc 2 (entget bl)))))))
   (while e
        (if (= (cdr (assoc 0 (entget e))) "TEXT")
            (setq k (cdr (assoc 1 (entget e))))
        )
        (setq e (entnext e))
   )
   (setq en (entnext bl))
   (while (/= (cdr (assoc 0 (entget en))) "SEQEND")
       (cond 
           ((and (= (cdr (assoc 0 (entget en))) "ATTRIB") (= (cdr (assoc 2 (entget en))) "KYHIEU")) (setq h (cdr (assoc 1 (entget en)))))
           ((and (= (cdr (assoc 0 (entget en))) "ATTRIB") (= (cdr (assoc 2 (entget en))) "QUYCACH")) (setq txt (cdr (assoc 1 (entget en)))))
           (T nil)
      )
      (setq en (entnext en))
   )
   (setq kh (strcat k h))
   (if (= k "S")
       (setq n1 "C\\U+1EECA S\\U+1ED4")
       (setq n1 "C\\U+1EECA ÐI")
   )
   (setq n2 (substr txt 1 1))
   (setq name (strcat n1 " " n2 " CÁNH"))
   (setq ltxt (separate txt "-")
             r (cadr ltxt)
             kc (substr (caddr ltxt) 2 ) 
             dlst (append dlst (list (list kh name r kc))) )
)
(setq dlst1 (list))
(While dlst
     (setq i 1)  
     (setq dlst2 (cdr dlst) )
     (foreach ds dlst2
          (if (equal ds (car dlst))
              (progn
                  (setq i (1+ i))
                  (setq dlst2 (vl-remove ds dlst2))
              )
              (if (= (car ds) (caar dlst))
                  (alert (strcat "\n CHU Y !!! " "\n Loai cua " (car ds) " co nhieu quy cach. Hay kiem tra lai"))
              )
          )
     )
     (setq dlst1 (append dlst1 (list (cons i (car dlst)))))
     (setq dlst dlst2)
)
dlst1 
(setq dlst1 (vl-sort dlst1 '(lambda (x y) (< (cadr x) (cadr y))    )))
(setq dlst1 (vl-sort dlst1 '(lambda (x y) (> (substr (cadr x) 1 1) (substr (cadr y) 1 1))    )))
(command "undo" "be") 
(while (not ct)
       (alert "\n Ban phai nhap chieu cao text trong bang thong ke")
       (setq  ct (getreal "\n Nhap chieu cao text trong bang thong ke <250> : "))
)
(setq pt (getpoint "\Chon diem dat bang thong ke")
          
          p1 (polar pt (* 1.5 pi) (* 4 ct))
          p2 (polar p1 0 (* 4 ct))
          p3 (polar p2 0 (* 8 ct))
          p4 (polar p3 0 (* 20 ct))
          p5 (polar p4 0 (* 10 ct))
          p6 (polar p5 0 (* 10 ct))
          p7 (polar p6 0 (* 10 ct))
          p8 (polar p7 (* 0.5 pi) (* 4 ct))
)   
(command "pline" pt p1 p7 p8 "c")
(command "pline" p2 (polar p2 (* 0.5 pi) (* 4 ct)) "")
(command "pline" p3 (polar p3 (* 0.5 pi) (* 4 ct)) "")
(command "pline" p4 (polar p4 (* 0.5 pi) (* 4 ct)) "")
(command "pline" p5 (polar p5 (* 0.5 pi) (* 4 ct)) "")
(command "pline" p6 (polar p6 (* 0.5 pi) (* 4 ct)) "")  
(command "style" "KY-THUAT" "micross.ttf" 0 1 0 "n" "n")
(command "text"  "J" "mc" (list (+ (car pt) (* 31 ct)) (+ (cadr pt) (* 3 ct))) (* 1.5 ct) 0 "B\\U+1EA2NG TH\\U+1ED0NG KÊ C\\U+1EECA")
(command "text"  "J" "mc" (list (+ (car p1) (* 2 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "STT")  
(command "text"  "J" "mc" (list (+ (car p2) (* 4 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "KÝ HI\\U+1EC6U") 
(command "text"  "J" "mc" (list (+ (car p3) (* 10 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "QUY CÁCH C\\U+1EECA")
(command "text"  "J" "mc" (list (+ (car p4) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "S\\U+1ED0 LU\\U+1EE2NG")
(command "text"  "J" "mc" (list (+ (car p5) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "CHI\\U+1EC0U R\\U+1ED8NG") 
(command "text"  "J" "mc" (list (+ (car p6) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 "KHUÔN C\\U+1EECA")  
(setq i 1)
(foreach dl dlst1
       (setq  p1 (polar p1 (* 1.5 pi) (* 4 ct))
          p2 (polar p1 0 (* 4 ct))
          p3 (polar p2 0 (* 8 ct))
          p4 (polar p3 0 (* 20 ct))
          p5 (polar p4 0 (* 10 ct))
          p6 (polar p5 0 (* 10 ct))
          p7 (polar p6 0 (* 10 ct)) 
      )
      (command "pline" p1 (polar p1 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p2 (polar p2 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p3 (polar p3 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p4 (polar p4 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p5 (polar p5 (* 0.5 pi) (* 4 ct)) "")
      (command "pline" p6 (polar p6 (* 0.5 pi) (* 4 ct)) "") 
      (command "pline" p7 (polar p7 (* 0.5 pi) (* 4 ct)) "")   
      (command "text"  "J" "mc" (list (+ (car p1) (* 2 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (rtos i 2 ) )  
      (command "text"  "J" "mc" (list (+ (car p2) (* 4 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 1 dl)) 
      (command "text"  "J" "mc" (list (+ (car p3) (* 10 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 2 dl))
      (command "text"  "J" "mc" (list (+ (car p4) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 0 dl))
      (command "text"  "J" "mc" (list (+ (car p5) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 3 dl)) 
      (command "text"  "J" "mc" (list (+ (car p6) (* 5 ct)) (+ (cadr p1) (* 2 ct))) ct 0 (nth 4 dl))
      (setq i (1+ i))
)
(command "pline" p1 p7 "")     
(command "undo" "e")   
(setvar "osmode" oldos)
(princ)         
)
      
      
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Separate (S sym / i L ch)
(setq i 0 L nil)
(while (< i (strlen S))
      (setq i (1+ i) ch (substr S i 1))
      (if (= ch sym) (progn
(setq
     L (append L (list (substr S 1 (- i 1))))
     S (substr S (1+ i) (- (strlen S) i))
     i 0
)
      )) 
)
(append L (list S))
)                
  • Vote tăng 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

Các bạn dịch mấy chữ ĐƯỜNG KÍNH, CHIỀU DÀI, KHỐI LƯỢNG này giống thế này: "S\\U+1ED0 LU\\U+1EE2NG" = SỐ LƯỢNG giúp mình với. Tại viết kiểu này thì khi chạy lisp sẽ không lỗi font

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

Oke, than

 

\U+0110\U+01AF\U+1EDCNG K\U+00CDNH = ĐƯỜNG KÍNH.
CHI\U+1EC0U D\U+00C0I = CHIỀU DÀI.
KH\U+1ED0I L\U+01AF\U+1EE2NG = KHỐI LƯỢNG.

Oke, thanks bạn nhiều nhé! cái này dùng mã Unicode C String rồi sửa lại nữa hả bạn?

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

Oke, than

 

Oke, thanks bạn nhiều nhé! cái này dùng mã Unicode C String rồi sửa lại nữa hả bạn?

Hề hề hề,

Cái ni chỉ dùng cho các loại CAD đời 2007 trở lên thôi , với CAd đời thấp hơn thì còn phụ thuộc loại font nữa. Tỷ như CAD 2004 của mình thì nhiều lúc vẫn bó tay đấ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

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


×