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

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

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

Chào mọi người!

 

Em đang có 1 ý mà không biết viết như thế nào, nhờ mọi người giúp đỡ.

E muốn copy 1 đối tượng đến các điểm trên 1 đường polyline sao cho các đối tượng được copy cách nhau 1 khoảng cho trước nhập vào.

- Chọn dtượng để copy

- chọn pline

- Hỏi khoảng cách giữa các đối tượng sau khi được copy

 

Mong mọi người 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

chào các bác. e mới tham gia diễn đàn. Mới học cad nên còn nhiều bỡ ngỡ nhất là với lisp. e cần các bác giúp e một vấn đền: e vẽ 1 đường pline nét mảnh, nhưng sau này cần chuyển đường pline thành nét đậm. e không biết phải làm sao. các bác giúp e với. e chân thành cảm ơ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

Chào mọi người!

 

Em đang có 1 ý mà không biết viết như thế nào, nhờ mọi người giúp đỡ.

E muốn copy 1 đối tượng đến các điểm trên 1 đường polyline sao cho các đối tượng được copy cách nhau 1 khoảng cho trước nhập vào.

- Chọn dtượng để copy

- chọn pline

- Hỏi khoảng cách giữa các đối tượng sau khi được copy

 

Mong mọi người giúp...

Hề hề hề,

Vấn đề này trên diễn đàn đã có kha khá lisp rồi bạn ạ. Bạn hãy cố gắng tìm kiếm với từ khóa là copy thử xem. Nếu tất cả các lisp đã có chưa thể đáp ứng yêu cầu của bạn thì hãy post một ví dụ cụ thể về cái bạn cần lên nhé. Nhớ là post cả file DWG trước và sau khi dùng lisp nhé để mọi người tiện nghiên cứu, tránh tình trạng bị lạc đề bạn hỉ....

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

chào các bác. e mới tham gia diễn đàn. Mới học cad nên còn nhiều bỡ ngỡ nhất là với lisp. e cần các bác giúp e một vấn đền: e vẽ 1 đường pline nét mảnh, nhưng sau này cần chuyển đường pline thành nét đậm. e không biết phải làm sao. các bác giúp e với. e chân thành cảm ơn.

Hề hề hề,

Bạn thử xài thằng pedit xem sao 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

Hề hề hề,

Cái vụ lỗi này lần đầu tiên mình gặp nên cũng không rõ nó bị sao nữa. Cái hàm (vl-load-com) là hàm dùng để tải các chức năng mở rộng của Autolisp sử dụng Visual Lisp. Nó có sẵn trong Help của CAD rồi nên hơi vô lý khi Cad của bạn không đọc được cái hàm này.

Trong lisp của mình đâu có cái hàm (C:CD) nào đâu mà chỉ có đoạn code (defun c:cd ( ) .... mà thôi. Đó là định nghĩa của cái hàm cd dược dùng như một lệnh trong CAD. Vậy nên có thể việc bạn tải hay copy cái lisp của mình có vấn đề bạn ạ. Hãy kiểm tra lại đoạn code bạn xài có đầy đủ như trong bài pót của mình hay không bạn nhé.

 

Theo mình hiểu thì cái lisp mình viết cũng dùng được cho việc cấy điểm lên các 2dPolyline đấy bạn ạ. Hãy kiểm tra lại code và dùng thử xem sao. Nếu vẫn không được thì có nhẽ CAd của bạn có vấn đề vì đoạn code trên mình dùng thử với bản vẽ bạn đã post thì hoàn toàn tốt bạn ạ.

Chúc bạn vui,

 

 

Đúng như bác gia_bach nói, mình sử dụng cad14 nên bị lỗi do cad không hỗ trợ Visual Lisp!

Khi chạy cad2008 thì lisp chạy ko báo lỗi, nhưng chắc do ban đầu mình chưa đề cập chi tiết về nội dung thực hiện của lisp nên cũng chưa rõ để bác Bình viết hoàn thiện ngay được!

Mình có upload lại file cad mong bác Bình editcode giùm lại nha

http://www.cadviet.com/upfiles/3/3dpoly_chi_tiet.dwg

Thanks …các bác nhiều! Mình mong nhận được sự giúp đỡ và góp ý của các bác nhiều

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

Đúng như bác gia_bach nói, mình sử dụng cad14 nên bị lỗi do cad không hỗ trợ Visual Lisp!

Khi chạy cad2008 thì lisp chạy ko báo lỗi, nhưng chắc do ban đầu mình chưa đề cập chi tiết về nội dung thực hiện của lisp nên cũng chưa rõ để bác Bình viết hoàn thiện ngay được!

Mình có upload lại file cad mong bác Bình editcode giùm lại nha

http://www.cadviet.com/upfiles/3/3dpoly_chi_tiet.dwg

Thanks …các bác nhiều! Mình mong nhận được sự giúp đỡ và góp ý của các bác nhiều

Hề hề hề,

Bạn xem cái này xài được không nhé, mình sửa lại thêm một chút từ líp cũ.

(defun c:cd ( / pm tenlop lop en obj dis kc kc1 pt pt0 pt1 end m mo
                  elev lelev relev txt j i n gr gd )
(vl-load-com)
(command "undo" "be")
(setq PM (getvar "pdmode"))
(setq tenlop (getstring t "\n Hay nhap ten layer diem cay ban muon: "))
(if (= (tblsearch "layer" tenlop) nil)
(command "layer" "n" tenlop "c" "1" tenlop "lt" "continuous" tenlop "")
)
(setq tenlop1 (getstring t "\n Hay nhap ten layer nhan khoang cach ban muon: "))
(if (= (tblsearch "layer" tenlop1) nil)
(command "layer" "n" tenlop1 "c" "7" tenlop1 "lt" "continuous" tenlop1 "")
)
(setq lop (getvar "clayer"))
(setvar "clayer" tenlop1)
(setq en (car (entsel "\n Chon doi tuong 3dpolyline"))
       obj (vlax-ename->vla-object en)
       dis (vlax-curve-getdistatpoint obj (vlax-curve-getendpoint obj))
        n (vlax-curve-getendParam obj)
        i 1)
(alert (strcat "\n Chieu dai duong 3dpolyline la " (rtos dis 2 2)))
(setq kc (getdist "\n Hay nhap khoang cach giua cac diem ban can cay: "))
(setq kc1 (getdist "\n Hay nhap khoang cach tu text toi polyline : "))
;;;;;;;(setvar "cecolor" "7") 
(setq pt (vlax-curve-getstartpoint obj))
(gotang obj pt)
(setq pt0 (list (car pt) (cadr pt) 0.0))
(setq pt1 (polar pt0 (+ gr (/ pi 2)) kc1))
(command "text" "j" "c" pt1 gd "0+000" ) 
(setq pt (vlax-curve-getendpoint obj))
(gotang obj pt)
(setq pt0 (list (car pt) (cadr pt) 0.0))
(setq pt1 (polar pt0 (+ gr (/ pi 2)) kc1))
(setq end (rtos dis 2 0)
        m (strlen end))
(if (>= m 4)
   (setq txt (strcat (substr end 1 (- m 3)) "+" (substr end (- m 2) 3)) )
   (setq txt (strcat "0+" end))
)     
(command "text" "j" "c" pt1 gd txt )      
(while (and (< (* i kc) dis) (> kc 0) (/= kc nil))
        (setvar "clayer" tenlop1)
        (setq pt (vlax-curve-getpointatdist obj (* i kc)))         
        (setq elev (rtos (caddr pt) 2 2)
                 j 1)
        (while (/= (substr elev j 1) ".")
                 (setq j (1+ j))
        )
        (setq lelev (substr elev 1 j)
                relev (substr elev j))

        (gotang obj pt)
        (setq pt0 (list (car pt) (cadr pt) 0.0))
        (setq pt1 (polar pt0 (+ gr (/ pi 2)) kc1)) 
        (setq mo  (rtos (* i kc) 2 0)
                 m (strlen mo))
        (if (>= m 4)
            (setq txt (strcat (substr mo 1 (- m 3)) "+" (substr mo (- m 2) 3)) )
            (if (= m 3)
                (setq txt (strcat "0+" mo))
                (if (= m 2)
                    (setq txt (strcat "0+0" mo))
                    (if (= m 1)
                        (setq txt (strcat "0+00" mo))
                    )
                )
            )  
        )     

       ;;;;;;; (entmake (list (cons 0 "TEXT") (cons 1 (rtos (* i kc) 2 2)) (cons 10 pt1) (cons 40 2) 
                            ;;;;;;;; (cons 50 gr) (cons 72 1) (cons 8 "STALBL") ))
        (command "text" "j" "c" pt1 gd txt )
        (setq i (1+ i))
        (setvar "clayer" tenlop)
        (command "insert" "Pointx" pt "1" "1" "" (rtos (+ n i) 2 0) lelev relev "DH" )
)
(setvar "clayer" lop)
(command "undo" "e")
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun gotang (obj pt)
(setq vtt (vlax-curve-getfirstderiv obj (vlax-curve-getparamatpoint obj pt)))
        (if (/= (car vtt) 0)
            (setq gr (atan (/ (cadr vtt) (car vtt))))
            (setq gr (/ pi 2))
        )
        (setq gd (* 180 (/ gr pi)))
)

Hy vọng đúng với yêu cầu của ban. Mình đã chạy thử với cái bản vẽ bạn pót sau cùng thì thấy kết quả gần giống với cái bạn làm thủ công.

Chỉnh sửa theo phamthanhbinh
Sửa lại theo góp ý của bác Tue_NV và yêu cầu bổ sung của bạn applekangter

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ề hề hề,

Bạn xem cái này xài được không nhé, mình sửa lại thêm một chút từ líp cũ.

 

Hy vọng đúng với yêu cầu của ban. Mình đã chạy thử với cái bản vẽ bạn pót sau cùng thì thấy kết quả gần giống với cái bạn làm thủ công.

 

Thanks bác Bình nhiều, thật nhiều ….

Mình vừa chạy lisp xong, vượt qua cả mong đợi của mình ban đầu. Lisp chạy cực chuẩn.

Ah! Mong bác Bình sửa hộ em 1 điểm nhỏ thôi, đó là cái nhãn của khoảng cách bác cho em vào luôn cái layer”nhan” chẳng hạn. Để sau này tiện quản lý thôi.

Thanks…bác + forum ! Chúc forum ngày một phát triể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

[quote name=phamthanhbinh' date='08 March 2011 - 07:34 PM' timestamp='1299587654'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defun getangle (obj pt)

(setq vtt (vlax-curve-getfirstderiv obj (vlax-curve-getparamatpoint obj pt)))

(if (/= (car vtt) 0)

(setq gr (atan (/ (cadr vtt) (car vtt))))

(setq gr (/ pi 2))

)

(setq gd (* 180 (/ gr pi)))

)

;;;;;;

Chào bác Bình

Có 1 nguyên tắc khi viết Lisp là không nên đặt tên hàm do mình định nghĩa trùng với hàm của Lisp. Hàm getangle do bác lập ra trùng với hàm của Lisp rồi ạ.

  • 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

Chào bác Bình

Có 1 nguyên tắc khi viết Lisp là không nên đặt tên hàm do mình định nghĩa trùng với hàm của Lisp. Hàm getangle do bác lập ra trùng với hàm của Lisp rồi ạ.

Chào bác Tue_NV,

Rất cám ơn bác đã nhắc nhở. Do cẩu thả mà mình quên mất cả những nguyên tắc sơ đẳng khi viết lisp. Mình đã sửa lại lisp trong bài post trên.

Rất mong bác thông cảm và hết lòng 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

Chào bác Tue_NV,

Rất cám ơn bác đã nhắc nhở. Do cẩu thả mà mình quên mất cả những nguyên tắc sơ đẳng khi viết lisp. Mình đã sửa lại lisp trong bài post trên.

Rất mong bác thông cảm và hết lòng giúp đỡ.

Bác sử dụng Visual Lisp Editor (gõ Vlide vào command) -> Các từ có màu xanh lá là các từ khóa (mình tránh đặt tên trùng là được bác à). Ngoài ra Visual Lisp Editor còn có chức năng bắt lỗi nữa và nhiều chức năng khác. Em chưa biết hết nữa bác ạ :unsure:

Em nhớ là có 1 topic hình như là của bác VUVUZELA lập ra nói về cái này.

Chúc bác 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

Chào bác Tue_NV,

Rất cám ơn bác đã nhắc nhở. Do cẩu thả mà mình quên mất cả những nguyên tắc sơ đẳng khi viết lisp. Mình đã sửa lại lisp trong bài post trên.

Rất mong bác thông cảm và hết lòng giúp đỡ.

Em thì các hàm con hay đặt theo kiểu tiếng việt không dấu và dài thòn. Như thế sau này đọc lại còn có cơ may hiểu và dùng chung lisp của người khác ít bị trùng hàm con. Tất nhiên kiêuểu này đọc code có hơi nông dân nhưng em thích thế. :lol:

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 sử dụng Visual Lisp Editor (gõ Vlide vào command) -> Các từ có màu xanh lá là các từ khóa (mình tránh đặt tên trùng là được bác à). Ngoài ra Visual Lisp Editor còn có chức năng bắt lỗi nữa và nhiều chức năng khác. Em chưa biết hết nữa bác ạ :unsure:

Em nhớ là có 1 topic hình như là của bác VUVUZELA lập ra nói về cái này.

Chúc bác vui.

Hề hề hề,

Thực sự là mình toàn viết lisp trên notepad chứ chưa biết xài cái Vlide. Đã mấy lần vào đó dùng thử nhưng chả hiểu hết được mấy cái chức năng trên thanh công cụ nên dùng cứ thấy nó vướng víu lắm nên chán bác ạ. Bài của bác vuvuzela mình cũng có đọc rùi nhưng áp dụng vẫn thấy nó sao sao đó. Có nhẽ cái bệnh lười nó lại tái phát nên cứ theo thói quen mà dùng chớ chả dám vọc vạch gì thêm bác ạ. Khổ thế...

Để dùng được nó, chắc có nhẽ phải qua một lớp bài bản mới xong chớ cái kiểu mót của mình thì chắc cũng hơi lâu mới có hy vọng bác nhể....

Cám ơn bác vì đã chỉ bảo tận tì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

E vẫn viết trên Notepad++, check trên vlide, thấy cũng tiện bác ạ. THậm chí k check trên vlide cũng được.Sai thì lại vò đầu tìm hiểu ^^

  • 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

Bạn Ketxu cũng giống mình. toàn viết trên notepad ++ vào vlide check. Cái notepad có vài cái thấy tiện hơn vlide

Trước mình cũng dùng nodepat nhưng sau khi được bác Tue_VN đả thông kinh mạch giờ đã chuyển sang vlide. Dùng vlide có rất nhiều thuận lợi mà trước đây mình cũng không biết (hỗ trợ tìm kiếm các hàm, kiểm tra các dấu (), quản lý biến...). Nới chung là có dùng mới thấy nó hay ... he he

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ờ các anh trên diễn đàn xem giúp em file cad này: http://www.cadviet.com/upfiles/3/ranh_thhoa_1.rar mỗi lần mở lên hiện bảng thông báo "PRODUCE BY AN AUTODESK EDUCATIONAL PRODUCET"

Do you want to continue? nhấn yes, yes nữa mới mở được file. file này khi in ra có dòng chữ:

"PRODUCE BY AN AUTODESK EDUCATIONAL PRODUCET" ở 4 cạnh của tờ giấy nên không thể nào in giao sản phấm được. có anh nào biết file này bị lỗi gì không? chỉ dùm cách khắc phục mình cám ơn nhiều

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ờ các anh trên diễn đàn xem giúp em file cad này: http://www.cadviet.com/upfiles/3/ranh_thhoa_1.rar mỗi lần mở lên hiện bảng thông báo "PRODUCE BY AN AUTODESK EDUCATIONAL PRODUCET"

Do you want to continue? nhấn yes, yes nữa mới mở được file. file này khi in ra có dòng chữ:

"PRODUCE BY AN AUTODESK EDUCATIONAL PRODUCET" ở 4 cạnh của tờ giấy nên không thể nào in giao sản phấm được. có anh nào biết file này bị lỗi gì không? chỉ dùm cách khắc phục mình cám ơn nhiều

Bạn tham khảo tại đây mong bạn lần sau trước khi post bài hãy search trên diễn đàn.

http://www.cadviet.com/forum/index.php?showtopic=31093&mode=threaded

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 bản vẽ không có yêu cầu, Att Block bạn cũng đã tạo ra rồi, vậy thì lisp phải làm cái j ^^

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 khi gõ lệnh cd chẳng hạn nó sẽ tự động vẽ hình cao độ phía trái trong file sau đó sẽ tạo block att thành hình phía phải,nét bao là layer tên 1,hatch là layer tên 2,chữ là layer tên 3.Mong bạn giúp giù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

Nếu như bạn miêu tả thì cái số cos cao độ ấy nó tạo ra theo quy luật nào :o Hay là cứ ra bừa 1 số để bạn sửa sau ???

Còn những nét để có trong Block att đó là cố định rồi, thì bạn tạo thủ công 1 lần là được chứ nhỉ.

Đánh cd rồi, nó vẽ những nét bên trái, rồi tạo ra Block bên phải, rồi thì những nét bên trái có bỏ đi không ? Những nét ấy là trên bản vẽ có rồi hay là bạn muốn tạo 1 form như thế ??

 

Mình thì chưa dám nói là giúp được, nhưng tại chưa hiểu ý của bạn nên cứ chúi vào hỏi thôi ^^ Trên 4room có kha khá lisp đánh cos rồi, chắc chắn có cái hợp 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

cos cao độ đó là text %%u+0.0000 thôi bạn ah.sau khi tự độ vẽ hình cao độ và text nằm trên sẽ tạo thành block att.Nét bên trái là chỉ đẫn khi bắt đầu vẽ sau khi vẽ xong nó sẽ là hình bên phải.Thanks.mình đưa yêu trong file đính kèm.

http://www.cadviet.com/upfiles/3/ve_cao_do_1.rar

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 rồi, nhưng mình thấy hơi lạ, bản chất việc này có khác gì bạn Insert hoặc copy đâu, vì cái block đó bạn đã làm được rồi mà ^^ Hay là bạn muốn k cần phải copy cái Block đó nữa, mà muốn cứ đánh là nó hiện ra ở đó thôi :o Những số chỉ 225 160 400 800 đó là cố định hay thay đổi trong quá trình sử dụng ??? Liệu có phải là biếng quá hok 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×