Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Nguyen Hoanh

Viết lisp theo yêu cầu [phần 2]

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

hdg2318    31
Chào bạn hdg2318,

Hình như bạn cũng là một thành viên có hạng của Cadviet rồi mà. Sao bạn không post một file mẫu cái bạn có và một file mẫu cái bạn cần lên cho mọi người dễ hình dung nhỉ???? Còn cách nói của bạn thì khó hình dung quá, đã có 3 cột rồi lại còn xuất kết quả vào cột thứ 3 là sao nhỉ????

Rồi muốn nhân nhiều số với 1 số, trả kết quả về đúng vị trí của text cần nhân là text nào vậy bạn.....

Đừng nghĩ rằng là ma cũ thì nói sao mọi người cũng phải hiểu, mà ngược lại nên cẩn trọng trong cách trình bày vấn đề bạn nhé.

Hề hề hề....

hề hề, làm gì mà bác nóng tính thế. em up cái hình lên đây, hy vọng biểu đạt được ý nguyện của mình

untitled_1.png

thực ra mình cũng đã viết 1 lisp để làm công việc nhân nhiều số với 1 số, nhưng nó vẫn còn 1 số hạn chế :

chưa áp dụng được cho số thực ( mình cũng đã chỉnh lại kiểu dữ liệu nhập vào là với số thực, nhưng chẳng hiểu sao lúc được lúc không, lúc lại cho ra KQ ko đúng)

nếu tích số nhận xong là số nguyên, nó không có ".0"

 

(defun c:tichso()
 (setq i (getint "\n Enter number to calculate :"))
 (prompt "Select objects:")
 (setq ss (ssget))
 (setq cnt 0)
  (progn
  (repeat (sslength ss)
(setq ent (entget (ssname ss cnt)))
(setq nd1 (cdr (assoc 1 ent)))
(setq nd2 (distof nd1))
(setq nd3 (/ nd2 i))
(setq nd4 (rtos nd3 2 1))
(setq nd nd4)
(setq ent (subst (cons 1 (strcat nd)) (assoc 1 ent) ent))
(entmod ent)
(setq cnt (1+ cnt))
   )
  )
 )

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
master_worse    87
thực ra mình cũng đã viết 1 lisp để làm công việc nhân nhiều số với 1 số, nhưng nó vẫn còn 1 số hạn chế :

chưa áp dụng được cho số thực ( mình cũng đã chỉnh lại kiểu dữ liệu nhập vào là với số thực, nhưng chẳng hiểu sao lúc được lúc không, lúc lại cho ra KQ ko đúng)

nếu tích số nhận xong là số nguyên, nó không có ".0"

Bạn tìm hiểu các biến hệ thống sau: dimzin, luprec và lunits có thể giải quyết vấn đề 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
Tue_NV    3.841
hề hề, làm gì mà bác nóng tính thế. em up cái hình lên đây, hy vọng biểu đạt được ý nguyện của mình

thực ra mình cũng đã viết 1 lisp để làm công việc nhân nhiều số với 1 số, nhưng nó vẫn còn 1 số hạn chế :

chưa áp dụng được cho số thực ( mình cũng đã chỉnh lại kiểu dữ liệu nhập vào là với số thực, nhưng chẳng hiểu sao lúc được lúc không, lúc lại cho ra KQ ko đúng)

nếu tích số nhận xong là số nguyên, nó không có ".0"

 

(defun c:tichso()
 (setq i (getint "\n Enter number to calculate :"))
 (prompt "Select objects:")
 (setq ss (ssget))
 (setq cnt 0)
  (progn
  (repeat (sslength ss)
(setq ent (entget (ssname ss cnt)))
(setq nd1 (cdr (assoc 1 ent)))
(setq nd2 (distof nd1))
(setq nd3 (/ nd2 i))
(setq nd4 (rtos nd3 2 1))
(setq nd nd4)
(setq ent (subst (cons 1 (strcat nd)) (assoc 1 ent) ent))
(entmod ent)
(setq cnt (1+ cnt))
   )
  )
 )

1. Bạn đã thử chức năng tìm kiếm của diễn đàn chưa? Hãy Tìm kiếm với từ khoá Nhan 2 cot so

->> nên sử dụng Table của CAD hơn là phải sử dụng Text như thế. Mình chỉ sử dụng Lisp này để kiểm tra lại mấy anh sử dụng Text để thống kê, chứ tuyệt đối không dùng Text để nhân 2 cột số vì nó không ưu điểm bằng Table của ACAD

 

2. Theo ý của bạn master_worse. hoặc sử dụng Lisp này của Tue_NV :

Chương trình tính toán Cộng trừ Nhân Chia giá trị của Block Attribute; Text với 1 số hoặc 1 biểu thức

Chương trình cũng có tính năng làm tròn số tới một số nào đó do User định trước

  • 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
phamthanhbinh    3.123
hề hề, làm gì mà bác nóng tính thế. em up cái hình lên đây, hy vọng biểu đạt được ý nguyện của mình

untitled_1.png

thực ra mình cũng đã viết 1 lisp để làm công việc nhân nhiều số với 1 số, nhưng nó vẫn còn 1 số hạn chế :

chưa áp dụng được cho số thực ( mình cũng đã chỉnh lại kiểu dữ liệu nhập vào là với số thực, nhưng chẳng hiểu sao lúc được lúc không, lúc lại cho ra KQ ko đúng)

nếu tích số nhận xong là số nguyên, nó không có ".0"

Chào bạn hdg2318,

Hề hề hề, cứ thế có phải dễ người dễ ta không hỉ.

Đây là cái tớ xào nấu ra từ cái bạn gửi. Bạn coi có dùng được không, có cần thêm mắm muối chi nữa thì bạn cứ thêm cho vừa miệng hỉ.

Bạn lưu ý rằng việc nhập text theo bảng của bạn phải nhập cho đàng hoàng, hàng ra hàng mà cột ra cột chớ có lèm nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó. Khoảng rộng cột cần nhập ở đây chính là cái khoảng cách từ cốt thứ hai đến cột kết quả. Mình để cho bạn tùy nhập cho sướng, muốn chỗ mô cũng được . Hề hề hề.

Còn cái lisp bạn gửi là lisp chia chớ nhân cái chi đâu. Cái đó cũng không đúng với cái yêu cầu bạn post lắm vì nó chèn đúng vào chỗ số nhân chớ không cho ra cột kết quả khác như bạn post trên hình. Tuy nhiên với trình độ của bạn thì việc sửa nó chả khó gì mình để bạn tự làm nha.

(defun c:nhantxt (/ ss1 ss2 lsn1 lsn2 lsn wid y y1 k m as h g l p pt kq num num1)
(command "undo" "be")
(alert "\n Chon cot text thu nhat")
(setq ss1 (ssget (list (cons 0 "TEXT"))))
(txt2n ss1)
(setq lsn1 lsn)
(alert "\n Chon cot text thu hai")
(setq ss2 (ssget (list (cons 0 "TEXT"))))
(txt2n ss2)
(setq lsn2 lsn
       wid (getreal "\n Nhap khoang rong cot can nhap: ")
)
(foreach num lsn1
(setq y (caddr (assoc 10 (entget (car num))))
        k (cadr num)
)
(foreach num1 lsn2
(setq y1 (caddr (assoc 10 (entget (car num1))))
       m (cadr num1)
)
(if (= y1 y)
  (progn
   (setq kq (* m k)
           as (entget (car num1))
           h (cdr (assoc 40 as))
           g (cdr (assoc 50 as))
           l (cdr (assoc 8 as))
           p (assoc 10 as)
           pt (list (+ wid (cadr p)) y1 (cadddr p))
   )
   (entmake (list (cons 0 "TEXT") (cons 1 (rtos kq 2 1)) (cons 10 pt) (cons 40 h) (cons 50 g) (cons 8 l)))
   )
)
)
)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun txt2n (ss / n i num e el ) 
(setq n (sslength ss )
       i 0
       lsn (list)
)
(While (       (setq e (ssname ss i)
              el (entget e)
              num (atof (cdr (assoc 1 el)))
              lsn (append lsn (list (list e num)))
              i (1+ i)
      )
)
lsn
)

Hề hề hề

chúc bạn vui.

  • 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
nguyentieu    0

Em đang tìm lisp thực hiện việc gióng các đường dim cho thẳng hàng (đứng và ngang). Lệnh này khi e dùng SpeedCad của anh Ghost thì nó có lệnh tắt là VD. Em tìm trên diển đàn nhưng ko thấy?? Mong các ACE giúp đỡ.

 

Thanks!!

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
phamthanhbinh    3.123
Em đang tìm lisp thực hiện việc gióng các đường dim cho thẳng hàng (đứng và ngang). Lệnh này khi e dùng SpeedCad của anh Ghost thì nó có lệnh tắt là VD. Em tìm trên diển đàn nhưng ko thấy?? Mong các ACE giúp đỡ.

 

Thanks!!

Chào bạn nguyentieu,

Đây là lisp sắp xếp dim của bác nguyenhoanh, bạn dùng thử nhé.

http://www.cadviet.com/cadtips/11266_Dan_d...3333333333/124/

  • 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
Tue_NV    3.841
Chào bạn hdg2318,

Hề hề hề, cứ thế có phải dễ người dễ ta không hỉ.

Đây là cái tớ xào nấu ra từ cái bạn gửi. Bạn coi có dùng được không, có cần thêm mắm muối chi nữa thì bạn cứ thêm cho vừa miệng hỉ.

Bạn lưu ý rằng việc nhập text theo bảng của bạn phải nhập cho đàng hoàng, hàng ra hàng mà cột ra cột chớ có lèm nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó. Khoảng rộng cột cần nhập ở đây chính là cái khoảng cách từ cốt thứ hai đến cột kết quả. Mình để cho bạn tùy nhập cho sướng, muốn chỗ mô cũng được . Hề hề hề.

Còn cái lisp bạn gửi là lisp chia chớ nhân cái chi đâu. Cái đó cũng không đúng với cái yêu cầu bạn post lắm vì nó chèn đúng vào chỗ số nhân chớ không cho ra cột kết quả khác như bạn post trên hình. Tuy nhiên với trình độ của bạn thì việc sửa nó chả khó gì mình để bạn tự làm nha.

(foreach num lsn1
(setq y (caddr (assoc 10 (entget (car num))))
        k (cadr num)
)
(foreach num1 lsn2
(setq y1 (caddr (assoc 10 (entget (car num1))))
       m (cadr num1)
)
(if (= y1 y)
  (progn
   (setq kq (* m k)
           as (entget (car num1))
           h (cdr (assoc 40 as))
           g (cdr (assoc 50 as))
           l (cdr (assoc 8 as))
           p (assoc 10 as)
           pt (list (+ wid (cadr p)) y1 (cadddr p))
   )
   (entmake (list (cons 0 "TEXT") (cons 1 (rtos kq 2 1)) (cons 10 pt) (cons 40 h) (cons 50 g) (cons 8 l)))
   )
)
)
)
......

Chào bác Bình

Thấy đoạn code trên thì Tue_NV có góp ý đôi chút ạ :

Bạn lưu ý rằng việc nhập text theo bảng của bạn phải nhập cho đàng hoàng, hàng ra hàng mà cột ra cột chớ có lèm nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó

Đúng là nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó. Nhưng đúng hơn phải nói rằng Tung độ y của số ở cột thứ nhất phải đúng bằng tung độ y của số ở cột thứ hai thì Lísp mới chạy được thể hiện ở đoạn này của bác (if (= y1 y)..... . Tue_NV nghĩ xử lý cái này không khó lắm. Chỉ là việc sắp xếp lại các số theo thứ tự tung độ Y theo thứ tự mà thôi.

 

2. Là mình nên kiểm tra độ dài của 2 cột số do user chọn. Nếu số phần tử của cột thứ nhất không bằng số phần tử của cột thứ hai thì hiện thông báo

 

3. Tue_NV khuyên các bạn không nên sử dụng cách này để nhân 2 cột số bằng cách dùng Text mà nên sử dụng Table của CAD vì nó có nhiều ưu điểm hơn

  • Vote tăng 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
hochoaivandot    108
Chào bác Bình

Thấy đoạn code trên thì Tue_NV có góp ý đôi chút ạ :

Bạn lưu ý rằng việc nhập text theo bảng của bạn phải nhập cho đàng hoàng, hàng ra hàng mà cột ra cột chớ có lèm nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó

Đúng là nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó. Nhưng đúng hơn phải nói rằng Tung độ y của số ở cột thứ nhất phải đúng bằng tung độ y của số ở cột thứ hai thì Lísp mới chạy được thể hiện ở đoạn này của bác (if (= y1 y)..... . Tue_NV nghĩ xử lý cái này không khó lắm. Chỉ là việc sắp xếp lại các số theo thứ tự tung độ Y theo thứ tự mà thôi.

 

2. Là mình nên kiểm tra độ dài của 2 cột số do user chọn. Nếu số phần tử của cột thứ nhất không bằng số phần tử của cột thứ hai thì hiện thông báo

 

3. Tue_NV khuyên các bạn không nên sử dụng cách này để nhân 2 cột số bằng cách dùng Text mà nên sử dụng Table của CAD vì nó có nhiều ưu điểm hơn

 

Sao anh Tue_NV không diễn đạt những điều đó rõ hơn bằng 1 lisp đính kèm nữa 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
congdung04    0
Em có việc này nhờ các cao thủ, em đã search trên diễn đàn và biết được bác NguyenHoanh có viết một đoạn code mà khi pick chọn một DIM sẽ xuất ra text các thông số của DIM đó, ví dụ DIMSCALE........... nhưng giờ em muốn thay vì xuất ra text như thế các bác có thể viết giúp em một lisp mà sau khi pick chọn DIM đó sẽ ra một dòng nhắc người dùng các giá trị hiện tại (cụ thể em chỉ cần giá trị Dim scale overal) và yêu cầu nhập giá trị mới cần thay đổi. sau khi người dùng nhập thì sẽ áp dụng giá trị đó cho DIM.

Cảm ơn các bác rât nhiều.

 

sao không thấy bác nào giúp em?

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
Tue_NV    3.841
Sao anh Tue_NV không diễn đạt những điều đó rõ hơn bằng 1 lisp đính kèm nữa nhỉ?

Lisp đó đã có rồi nên mình không viết nữa

Nhan 2 cot so

với lại mình cũng ít dùng đến nó mà sử dụng Table vì nó ưu điểm hơ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
phamngoctukts    708

Mình đã xây dựng được code của lệnh Ironpat như thế này

stb.jpg

(DEFUN stretchblock()
(batdau)  
 (princ "chon doi tuong: ")
 (setq ss0 (ssget))
 (initget 1)
 (setq hs (getreal "Cho biet he so STRETCH: "))
 (setq P01 (getpoint "\nChon diem chen: "))
(delblock)
 (command "-Block" "vkc_temp1" "0,0" ss0 "")
 (command "-insert" "vkc_temp1" "0,0" "" "" "")
 (setq sstt1 (entlast))
 (setq sstt (ssget "l"))
(blockrectang)
 (setq re1 (entlast))
 (setq tt (entget re1)) 
 (setq tt (vl-remove-if '(lambda (x) (/= 10 (car x))) tt)) 
 (setq dinh1 (cdr (nth 0 tt)))
 (setq dinh2 (cdr (nth 1 tt)))
 (command "_.erase" "l" "")
 (command "_.copy" sstt1 "" "0,0" "0,0")
 (command "_.explode" "l")
 (setq ss00 (ssget "p"))
 (Command "_.Explode" sstt1)
 (command "-Block" "vkc_temp1" "y" dinh1 ss00 "")
 (command "line" dinh2 dinh1 "")
 (setq re (ssget "l"))
 (command "_.move" re "" dinh1 p01)
 (command "_.rotate" re "" p01 "45")
 (command "-insert" "vkc_temp1" "r" "45" p01 "" "")
 (setq blgoc (entlast))
 (Command "Explode" blgoc)
 (setq bl (ssget "p")) 
 (command "-Block" "vkc_temp2" P01 re "")
 (command "-Block" "vkc_temp3" P01 bl "")
 (Command "-Insert" "vkc_temp3" P01 "" hs "")  
 (setq dt1 (entlast))
 (Command "-Insert" "vkc_temp2" P01 "" hs "")  
 (Command "_.Explode" "l" "")
 (setq dt2 (entlast))
 (setq tt1 (entget dt2))
 (setq tt1 (vl-remove-if '(lambda (x) (/= 10 (car x))) tt1))
 (setq dinh11 (cdr (nth 0 tt1)))
 (command "_.align" dt1 "" p01 dinh1 dinh11 dinh2 "" "y")
 (command "_.erase" dt2 "")
 (command "_.move" dt1 "" dinh1 p01)
 (Command "_.Explode" "l")
(ketthuc)
 (princ)
)
;**************************************************************
(defun c:stb ()
(stretchblock)
)

(defun batdau ()
 (command "undo" "be")
 (setvar "cmdecho" 0)
 (while (/= (logand (getvar "cmdactive") 31) 0)(command pause))
)
;**************************************************************
(defun ketthuc ()
 (command "undo" "e")
 (setvar "cmdecho" 1)
)
;**************************************************************
(defun delblock ()
(Command "-Purge" "B" "vkc_temp1" "Y" "Y")
(Command "-Purge" "B" "vkc_temp2" "Y" "Y")
(Command "-Purge" "B" "vkc_temp3" "Y" "Y")
)
;**************************************************************       
(defun blockrectang ()
(while (setq e (ssname sstt 0))
(setq sstt (ssdel e sstt)
tmp (vla-getboundingbox (vlax-ename->vla-object e) 'p1 'p3)
p1 (vlax-safearray->list p1)
p3 (vlax-safearray->list p3) 
p1 (list (car p1) (cadr p1))
p3 (list (car p3) (cadr p3))
p2 (list (car p1) (cadr p3))
p4 (list (car p3) (cadr p1))
tmp (list
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity") 
(cons 100 "AcDbPolyline") 
(cons 90 4)
(cons 70 1)
(cons 10 p1)
(cons 10 p2)
(cons 10 p3)
(cons 10 p4)
)
)
(entmake tmp)
) 
)

Code cua mình có một số lỗi sau mà không biết khắc phục thế nào.

1. Nếu sử dụng cho đối tượng đã block thì chỉ dùng được 1 lần. Vì không explode được block đã scale theo trục.

2. không khống chế được hệ số stretch theo ý muốn được.

3. lệnh stb chỉ dử dụng được 4 lần là báo lỗi "FATAL ERROR: commands may not be nested more than 4 deep"

Mình mới học Autolisp nên còn gà quá code viết khá dài dòng do mình biết ít code quá. Các bạn giúp mình rút gọn code lại được không. Xin cám ơn !

  • 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
phamthanhbinh    3.123
Chào bác Bình

Thấy đoạn code trên thì Tue_NV có góp ý đôi chút ạ :

Bạn lưu ý rằng việc nhập text theo bảng của bạn phải nhập cho đàng hoàng, hàng ra hàng mà cột ra cột chớ có lèm nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó

Đúng là nhèm thò ra thụt vô, nhấp lên nhỏm xuống là lisp nó chê đó. Nhưng đúng hơn phải nói rằng Tung độ y của số ở cột thứ nhất phải đúng bằng tung độ y của số ở cột thứ hai thì Lísp mới chạy được thể hiện ở đoạn này của bác (if (= y1 y)..... . Tue_NV nghĩ xử lý cái này không khó lắm. Chỉ là việc sắp xếp lại các số theo thứ tự tung độ Y theo thứ tự mà thôi.

 

2. Là mình nên kiểm tra độ dài của 2 cột số do user chọn. Nếu số phần tử của cột thứ nhất không bằng số phần tử của cột thứ hai thì hiện thông báo

 

3. Tue_NV khuyên các bạn không nên sử dụng cách này để nhân 2 cột số bằng cách dùng Text mà nên sử dụng Table của CAD vì nó có nhiều ưu điểm hơn

Hề hề hề,

Chào bác Tue_NV,

Bác góp ý chí phải, song quả thực nó còn có những rắc rối khác, tỷ như cột 1 và cột 2 không có cùng số lượng đối tượng nhưng vẫn muốn có kết quả. Khi đó tại cái vị trí không có text ấy biết đàng mô mà nhân

Hơn nữa do chọn đối tượng theo hàm ssget nên có giời mới biết các đối tượng này đứng thứ mấy vì các thầy nhà ta thích sẽ chỉnh sửa tùm lum các số liệu này.

Vả lại cái việc sắp xếp lại dữ liệu theo tung độ, tuy không khó lắm như bác nói, nhưng vớ phải các cột có dăm anh trống hơ trống hoắc mà lại không trùng tung độ với nhau cũng có thể gây ra kết quả trật chìa bác ạ.

Chính vì nghĩ như vậy nên mình mới xài cái kiểu ni, cứ anh nào có đủ ở hai cột thì mới nhân còn không thì mặc thây nó, kệ các thầy muốn xử lý ra răng thì tùy. Bạn hdg2318 chớ có cười mình nghen.....

 

Cuối cùng nữa là như bác đã nhắc nhở là hổng nên xài ( cái ni mình đọc được từ bài post của bác trước khi làm lisp này cơ) nên mình mới viết để mà cấp cứu cho các trường hợp quá bí bách chưa xài được cái table của CAD mà thôi chứ chắc là chả có được ứng dụng bi nhiêu nên mình cũng lười nghĩ thêm cái vụ sắp xếp lại tập chọn bác ạ. Với bác có thể cái vụ sắp xếp này ngon chớ với mình cũng còn lúng túng lắm vì cái hàm vl-sort và mapcar, lambda mình vẫn cứ rối mù bác ạ, dùng nó lúc trúng lúc trật do chả hiểu hết về các biến, sợ đáo để. Túm lại cũng chỉ là bỏ khó chọn dễ thôi bác à. Cái tật lười này nó hại mình không ít rồi nhưng vẫn chửa bỏ được bác ạ.

Hề hề hề,......

  • Vote tăng 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
nguyentieu    0
Chào bạn nguyentieu,

Đây là lisp sắp xếp dim của bác nguyenhoanh, bạn dùng thử nhé.

http://www.cadviet.com/cadtips/11266_Dan_d...3333333333/124/

 

Lisp này là giãn dim theo khoảng cách. E muốn dim thực hiện thao tác như trên hình e up kèm theo sau đây:

 

giongdim.jpg

 

Mong các ACE giúp đỡ!

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
Tue_NV    3.841
Hề hề hề,

Chào bác Tue_NV,

Bác góp ý chí phải, song quả thực nó còn có những rắc rối khác, tỷ như cột 1 và cột 2 không có cùng số lượng đối tượng nhưng vẫn muốn có kết quả. Khi đó tại cái vị trí không có text ấy biết đàng mô mà nhân

Hơn nữa do chọn đối tượng theo hàm ssget nên có giời mới biết các đối tượng này đứng thứ mấy vì các thầy nhà ta thích sẽ chỉnh sửa tùm lum các số liệu này.

Vả lại cái việc sắp xếp lại dữ liệu theo tung độ, tuy không khó lắm như bác nói, nhưng vớ phải các cột có dăm anh trống hơ trống hoắc mà lại không trùng tung độ với nhau cũng có thể gây ra kết quả trật chìa bác ạ.

Chính vì nghĩ như vậy nên mình mới xài cái kiểu ni, cứ anh nào có đủ ở hai cột thì mới nhân còn không thì mặc thây nó, kệ các thầy muốn xử lý ra răng thì tùy. Bạn hdg2318 chớ có cười mình nghen.....

--------

Hề hề hề,......

Chào bác Bình

Nếu ý của bác như vậy thì Tue_NV nghĩ rằng bác không nên sử dụng dòng code này (if (= y1 y) ..... bởi vì nó tuyệt đối quá phải không bác? Bác cho nó "li lai" đi 1 ít, "tương đối" thôi bác ạ, anh nào không vượt quá giới hạn cho phép thì mới thực thi câu lệnh sau hàm if.

Bác có thể thay dòng (= y1 y)

bằng dòng : (equal y y1 (cdr(assoc 40 (entget (car num1)))))

Nếu bác muốn thu hẹp "giới hạn cho phép" lại thì bác có thể nhân trị số (cdr(assoc 40 (entget (car num1))))) với hệ số K:rolleyes:

 

@CongDung04 : Bạn đã sử dụng lệnh DOV (DIMOVERRIDE) chưa? Hãy tìm kiếm lệnh này trên diễn đàn và tìm cách sử dụng nó. Tue_NV đã có vài bài viết về lệnh này rồi.

 

@nguyên tiêu : Lisp như điều bạn muốn đã có trên diễn đàn rồi. Bạn chịu khó Tìm kiếm vậy.

 

@PhamngocTu : Bạn có thể upload 1 file .dwg có minh họa đầy đủ dữ kiện input và kết quả output mà bạn muốn. Vậy nhé

  • 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
phamngoctukts    708

Cuối cùng thì mình cũng hoàn thành viết code cho lệnh Ironpat như mình đã trình bày ở trên.

Vấn đề này hình như không được mọi người quan tâm lắm nhưng mình vẫn port lên đây nếu ai có hứng thú thì sử dụng.

code mình viết khá tiện lợi khi sử dụng. Chỉ cần chọn đối tượng gốc, chọn điểm chèn, chọn hướng là ok.

đây là hình minh hoạ.

complete.jpg

còn đây là code

(defun nhapsolieu ()
(setq goc1 (getangle p01 "chon diem thu 2 theo huong bac: "))
(setq goc (/ (* goc1 180) pi))
(setq xulygoc (- 45 (/ goc 2)))
(setq gocra (/ (* pi xulygoc) 180))
(setq sina (sin gocra))
(setq cosa (sqrt (- 1 (expt sina 2))))
(setq tang (/ sina cosa))
(setq a (distance dinh2 dinh3))
(setq duongcheo (* a (sqrt 2)))
(setq b (/ duongcheo (* 2 tang)))
(setq anso (- b (/ duongcheo 2)))
(setq x (* anso 2))
(setq hs (+ (/ x duongcheo) 1))
)

(DEFUN stretchblock()
(batdau)  
 (princ "chon doi tuong: ")
 (setq ss0 (ssget))
 (initget 1)
 (setq P01 (getpoint "\nChon diem chen: "))
(delblock)
 (command "-Block" "vkc_temp1" "0,0" ss0 "")
 (command "-insert" "vkc_temp1" "0,0" "" "" "")
 (setq sstt1 (entlast))
 (setq sstt (ssget "l"))
(blockrectang)
 (setq re1 (entlast))
 (setq tt (entget re1)) 
 (setq tt (vl-remove-if '(lambda (x) (/= 10 (car x))) tt)) 
 (setq dinh1 (cdr (nth 0 tt)))
 (setq dinh2 (cdr (nth 1 tt)))
 (setq dinh3 (cdr (nth 2 tt)))
 (command "_.erase" "l" "")
(nhapsolieu)
 (command "_.copy" sstt1 "" "0,0" "0,0")
 (command "_.explode" "l")
 (setq ss00 (ssget "p"))
 (Command "_.Explode" sstt1)
 (command "-Block" "vkc_temp1" "y" dinh1 ss00 "")
 (command "line" dinh2 dinh1 "")
 (setq re (ssget "l"))
 (command "_.move" re "" dinh1 p01)
 (command "_.rotate" re "" p01 "45")
 (command "-insert" "vkc_temp1" "r" "45" p01 "" "")
 (setq blgoc (entlast))
 (Command "Explode" blgoc)
 (setq bl (ssget "p")) 
 (command "-Block" "vkc_temp2" P01 re "")
 (command "-Block" "vkc_temp3" P01 bl "")
 (Command "-Insert" "vkc_temp3" P01 "" hs "")  
 (setq dt1 (entlast))
 (Command "-Insert" "vkc_temp2" P01 "" hs "")  
 (Command "_.Explode" "l" "")
 (setq dt2 (entlast))
 (setq tt1 (entget dt2))
 (setq tt1 (vl-remove-if '(lambda (x) (/= 10 (car x))) tt1))
 (setq dinh11 (cdr (nth 0 tt1)))
 (command "_.align" dt1 "" p01 dinh1 dinh11 dinh2 "" "y")
 (command "_.erase" dt2 "")
 (command "_.move" dt1 "" dinh1 p01)
 (Command "_.Explode" "l")
(ketthuc)
 (princ)
)

(defun c:stb ()
(stretchblock)
)

(defun batdau ()
 (command "undo" "be")
 (setvar "cmdecho" 0)
 (while (/= (logand (getvar "cmdactive") 31) 0)(command pause))
)

(defun ketthuc ()
 (command "undo" "e")
 (setvar "cmdecho" 1)
)
(defun delblock ()
(Command "-Purge" "B" "vkc_temp1" "Y" "Y")
(Command "-Purge" "B" "vkc_temp2" "Y" "Y")
(Command "-Purge" "B" "vkc_temp3" "Y" "Y")
)

(defun blockrectang ()
(while (setq e (ssname sstt 0))
(setq sstt (ssdel e sstt)
tmp (vla-getboundingbox (vlax-ename->vla-object e) 'p1 'p3)
p1 (vlax-safearray->list p1)
p3 (vlax-safearray->list p3) 
p1 (list (car p1) (cadr p1))
p3 (list (car p3) (cadr p3))
p2 (list (car p1) (cadr p3))
p4 (list (car p3) (cadr p1))
tmp (list
(cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity") 
(cons 100 "AcDbPolyline") 
(cons 90 4)
(cons 70 1)
(cons 10 p1)
(cons 10 p2)
(cons 10 p3)
(cons 10 p4)
)
)
(entmake tmp)
) 
)

Tiện thể bác nào cho em hỏi cái:

Làm thế nào để khi mình chọn nhóm đối tượng thì lọc ra những đối tượng là block. Nếu đối tượng nào là block thì explode nó ra.

  • Vote tăng 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
lamtaclk8    0

bạn nào có lisp như thế này cho mình xin nhé:

Từ 1 điểm cho trước vẽ được 2 đường thẳng song song, cách đều điểm đó.

Thanks trước :undecided:

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
phamthanhbinh    3.123
Cuối cùng thì mình cũng hoàn thành viết code cho lệnh Ironpat như mình đã trình bày ở trên.

Vấn đề này hình như không được mọi người quan tâm lắm nhưng mình vẫn port lên đây nếu ai có hứng thú thì sử dụng.

code mình viết khá tiện lợi khi sử dụng. Chỉ cần chọn đối tượng gốc, chọn điểm chèn, chọn hướng là ok.

Tiện thể bác nào cho em hỏi cái:

Làm thế nào để khi mình chọn nhóm đối tượng thì lọc ra những đối tượng là block. Nếu đối tượng nào là block thì explode nó ra.

Chào bạn phamngoctukts,

Bạn xài thử đoạn code này nhé:

(defun c:exbl ()
(setq ssb (ssget (list (cons 0 "INSERT")))
        n (sslength ssb)
        i 0
)
(while ((setq ent (ssname ssb i))
(command "explode" ent "")
(setq i (1+ i))
)
)

Bạn hãy đọc thêm về cách sử dụng hàm ssget bạn nhé. Trong đó việc sử dụng filter list rất chi là lợi hại, hãy thử xem.......

Chúc bạn vui.

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
congdung04    0
@CongDung04 : Bạn đã sử dụng lệnh DOV (DIMOVERRIDE) chưa? Hãy tìm kiếm lệnh này trên diễn đàn và tìm cách sử dụng nó. Tue_NV đã có vài bài viết về lệnh này rồi.

 

Theo gợi ý của bác em đã tìm lệnh này, mặc dù tìm không ra :bigsmile: nhưng em cũng mò ra đuợc một mục đích chỉnh DIM scale overal.

Sau khi gõ lệnh DOV, ta gõ tiếp biến "SCALE" rồi gõ giá trị cần thay đổi vào rồi chọn đối tuợng.

Như vậy nói về mục đích sử dụng là được nhưng mất hơi nhiều thao tác và một nhược điểm là nó không cho pick chọn truớc DIM để xem Current Dim scale overal.

Vậy em mong bác cùng các cao thủ trợ giúp chỉ cần một lisp nhỏ vài để tiết kiệm nhiều thao tác :undecided:

 

Em xin phép nói lại mục đích là thay đổi giá trị dim scale overal, khi gõ lệnh sẽ yêu cầu chọn DIM, sau khi chọn lệnh sẽ cho ra giá trị Current Dim scale overal và yêu cầu nhập giá trị cần thay đổi, rồi áp dụng giá trị mới nhập vào cho DIM đó.

 

trân trọng cảm ơn các 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
phamthanhbinh    3.123
bạn nào có lisp như thế này cho mình xin nhé:

Từ 1 điểm cho trước vẽ được 2 đường thẳng song song, cách đều điểm đó.

Thanks trước :undecided:

Hề hề hề,

Muốn nhận cái thanks của bạn mà sao khó quá, hề hề hề.

Này nhé: song song thì OK rồi, nhưng theo phương nào nhỉ?????

Cách đều điểm đó cũng được đi nhưng cách bao nhiêu???

Cuối cùng là cái đường song song này bắt đầu từ cái chỗ mô hỉ??? Tây, tàu hay malai hử bạn????

Hề hề hề....

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
congdung04    0
bạn nào có lisp như thế này cho mình xin nhé:

Từ 1 điểm cho trước vẽ được 2 đường thẳng song song, cách đều điểm đó.

Thanks trước :undecided:

không cần lisp lệnh MLINE (ML) sẵn có của CAD cũng làm đuợc 100% yêu cầu của 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
truongthanh    7

Cho mình hỏi có lisp nào như thế này ko?mình đã search rồi mà ko thấy!

ví dụ mình có bản vẽ có 100 bóng đèn, đã bị explode ra rồi, vậy giờ có cách nào quét chọn lại hết các bóng đèn đó thì nó trở lại thành block ko?(mỗi bóng đèn là một 1 block, tất cả các block cùng 1 tên,tên block do mình đặt!)

Thankss!

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
phamthanhbinh    3.123
Theo gợi ý của bác em đã tìm lệnh này, mặc dù tìm không ra :bigsmile: nhưng em cũng mò ra đuợc một mục đích chỉnh DIM scale overal.

Sau khi gõ lệnh DOV, ta gõ tiếp biến "SCALE" rồi gõ giá trị cần thay đổi vào rồi chọn đối tuợng.

Như vậy nói về mục đích sử dụng là được nhưng mất hơi nhiều thao tác và một nhược điểm là nó không cho pick chọn truớc DIM để xem Current Dim scale overal.

Vậy em mong bác cùng các cao thủ trợ giúp chỉ cần một lisp nhỏ vài để tiết kiệm nhiều thao tác :undecided:

 

Em xin phép nói lại mục đích là thay đổi giá trị dim scale overal, khi gõ lệnh sẽ yêu cầu chọn DIM, sau khi chọn lệnh sẽ cho ra giá trị Current Dim scale overal và yêu cầu nhập giá trị cần thay đổi, rồi áp dụng giá trị mới nhập vào cho DIM đó.

 

trân trọng cảm ơn các bác.

Chào bạn condung04,

Bạn dùng thử cái này. Về cơ bản có thể nó đáp ứng cái yêu cầu của bạn, tuy nhiên cũng như cái lisp mình đã viết cho bạn nguyentuyen6 thì nó chỉ đổi kích thước trong díplay mà thôi, còn trong properties thì bạn chả thấy thay đổi gì. Phần lấy giá trị bạn có thể sử dụng lisp của bác Hoành, còn lisp này yêu cầu bạn nhập giá trị mới và nó đổi phóc luôn chứ chả có thông báo chi đâu nhé.

(defun C:chovrl ()
(setq ent (car (entsel)))
(command "dimoverride" "scale" (getstring "/n nhap ty le: ") "" ent "")
)

Cái vụ đổi cả trong properties thì mình cũng đang mò thêm. Hy vọng sẽ sớm có kết quả.

Chúc bạn vui.

  • 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
phamngoctukts    708
Chào bạn phamngoctukts,

Bạn xài thử đoạn code này nhé:

Bạn hãy đọc thêm về cách sử dụng hàm ssget bạn nhé. Trong đó việc sử dụng filter list rất chi là lợi hại, hãy thử xem.......

Chúc bạn vui.

Chào bạn Phamthanhbinh bạn chưa hiểu ý mình rồi.

với code để chỉ chọn block thì mình đã biết rồi.

Ý mình là chọn tất cả các đồi tượng gọi tắt là nhóm1. Kiểm tra trong nhóm đó có block hay không. nếu có thì explode nó ra. Nếu không có thì 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
phamthanhbinh    3.123
Theo gợi ý của bác em đã tìm lệnh này, mặc dù tìm không ra :bigsmile: nhưng em cũng mò ra đuợc một mục đích chỉnh DIM scale overal.

Sau khi gõ lệnh DOV, ta gõ tiếp biến "SCALE" rồi gõ giá trị cần thay đổi vào rồi chọn đối tuợng.

Như vậy nói về mục đích sử dụng là được nhưng mất hơi nhiều thao tác và một nhược điểm là nó không cho pick chọn truớc DIM để xem Current Dim scale overal.

Vậy em mong bác cùng các cao thủ trợ giúp chỉ cần một lisp nhỏ vài để tiết kiệm nhiều thao tác :undecided:

 

Em xin phép nói lại mục đích là thay đổi giá trị dim scale overal, khi gõ lệnh sẽ yêu cầu chọn DIM, sau khi chọn lệnh sẽ cho ra giá trị Current Dim scale overal và yêu cầu nhập giá trị cần thay đổi, rồi áp dụng giá trị mới nhập vào cho DIM đó.

 

trân trọng cảm ơn các bác.

Hề hề hề,

Với sự giúp sức của bác Master_Worse. mình mới mót được cái nè, hay lắm lắm. Biếu bạn dùng chơi:

(defun c:chovr ()
(vl-load-com)
(command "undo" "be")
(setq di (vlax-ename->vla-object (car (entsel "/n Chon doi tuong dim can thay doi"))))
(alert  (strcat "Chieu cao text cua doi tuong hien tai la: " (rtos (vla-get-textheight di))))
(setq new (getreal "\n Nhap chieu cao text moi: "))
(vla-put-textheight di new)
(command "undo" "e")
)

Cái này chỉ thay đổi chiều cao text chứ không thay đổi biến dim overal scale nên các mũi tên không bị thay đổi. Nếu muốn chúng thay đổi thì phải chờ mình mót thêm. Hề hề hề....

 

 

@ nguyentuyen6: Bạn có thể xài cái này cho trường hợp của bạn. Nếu bạn không thể hãy post lên 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
phamthanhbinh    3.123
Chào bạn Phamthanhbinh bạn chưa hiểu ý mình rồi.

với code để chỉ chọn block thì mình đã biết rồi.

Ý mình là chọn tất cả các đồi tượng gọi tắt là nhóm1. Kiểm tra trong nhóm đó có block hay không. nếu có thì explode nó ra. Nếu không có thì thôi.

Hề hề hề,

Vậy là bạn biết rồi, xin lỗi vì mình cầm đèn chạy trước ô tô. Hề hề hề.

Cái ý của bạn như vậy bạn có thể làm như sau:

1/- Chọn tập hợp gồm tất cả các đối tượng bạn muốn kiểm tra.

2/- Dùng vòng lặp while lặp qua tất cả các đối tượng có trong tập hợp đối tượng đã được chọn.

3/-trong quá trình lặp này bạn dùng hàm if để kiểm tra xem đối tượng có phải là block không, nếu đúng bạn explode nó ra, còn nếu không thì mặc xác nó bơ vơ.

4/- kết thúc vòng lặp.

 

Do bạn cũng đã có khả năng viết được nên bạn hãy thử viết theo hướng như tren xem sao. Nếu gặp khó khăn hãy post lên mọi nhười sẽ giúp bạn 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×