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.
Đăng nhập để thực hiện theo  
girl

[Nhờ chỉnh sửa] Đoạn CODE bị xung với lisp khác !

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

girl    5

Em chào các anh trên diễn đàn, Em có 1 đoạn CODE lisp copy đối tượng từ A đến B ra 1 khoảng cách đều nhau m mà người dùng nhập vào. Nhưng khi mình load một mình lisp đó lên thì nó chạy bình thường, khi load all lisp của em lên ( tầm 100 cái ) thì nó không chạy được nữa. Tức là em hiểu nó xung biến gì đó. E đã đổi tên biến thành tên khác nhưng vẫn xung, không dùng được. Mà e rất cần nó. Anh nào xử giúp em vụ này với ạ . tức là mình dùng 1 thuật toán khác để làm công việc đó ạ , biết đâu nó lại không bị xung nữa !

Dưới đây là đoạn CODE Bị xung đó

(progn
 	(setq cmdo (getvar "cmdecho"))
;(command "_.ucs" "")
 	(setvar "cmdecho" 0)
 	(princ "\nCopy array:")
 	(setq ss1 (ssget))
 	(setq p1 (getpoint "First point: "))
 	(setq p2 (getpoint p1 "Second point: "))
 	(if ca:distance
(progn
  (setq std (rtos ca:distance 2 4))
  (setq d (getdist (strcat "@n=<" std ">: ")))
  (if d
(setq ca:distance d)
  )
)	;end progn
(setq ca:distance (getdist "a= "))
 	) 	;end if
 	(setq a (angle p1 p2))
 	(setq a (* (/ 180 pi) a))
 	(command "_.ucs" "z" a)
 	(setq di (distance p1 p2))
 	(setq d ca:distance)
 	(setq n (/ di d))
 	(setq n (+ 1 (atoi (rtos n 2 1))))
 	(command "_.array" ss1 "" "r" 1 n d)
 	(command "_.ucs" "")
 	(setvar "cmdecho" cmdo)
 	(command "OSMODE" "15359")
 	(princ)
)
 )

Em có một đoạn lisp cũng tương tự, khi dùng hàm COPY để thực hiện việc đó thì sẽ không bị xung, Vậy anh nào có thể chuyển từ thuật toán dùng array sang copy giúp em đựoc không ạ ! em xin chân thành cảm ơn !

Đoạn CODE này không bị xung, nhưng nó lại copy theo cách khác, không phải là @m

Em gửi lên để các anh tham khảo

(progn
 	(SETQ CMD (GETVAR "CMDECHO"))
 	(SETQ OSM (GETVAR "OSMODE"))
 	(SETVAR "CMDECHO" 0)
 	(PROMPT "\nArray object!")
 	(SETQ SLT (SSGET))
 	(initget 7)
 	(PROMPT "\nStart point:")
 	(SETQ SPT (GETPOINT))
 	(PROMPT "\nEnd point:")
 	(SETQ EPT (GETPOINT SPT))
 	(SETVAR "OSMODE" 0)
 	(SETQ GC (ANGLE SPT EPT))
 	(if ot1
(setq ot2 (getreal (strcat "\na= <" (rtos ot1) ">:")))
(setq ot1 (getreal "\na=:"))
 	)
 	(if ot2
(setq ot1 ot2)
 	)

 	(Setq NET ot1)
 	(SETQ DST (DISTANCE SPT EPT))
 	(SETQ NET1 (/ dst net))
 	(SETQ NET2 (+ net1 0.5))
 	(SETQ NET3 (fix net2))

 	(SETQ DST1 (/ DST NET3))
 	(SETQ DEM 1)
 	(WHILE (< DEM NET3)
(SETQ BDT (* DEM DST1))
(SETQ PT1 (POLAR SPT GC BDT))
(COMMAND "COPY" SLT "" SPT PT1)
(SETQ DEM (+ DEM 1))
 	)
 	(SETVAR "CMDECHO" CMD)
 	(command "OSMODE" "15359")
)
(PRINC)
 )

 

 

P/S : girl chú ý cách tạo topic mới

Chỉnh sửa theo ketxu
Đặt tên tiêu đề sai quy đị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
Doan Van Ha    2.678

Em chào các anh trên diễn đàn, Em có 1 đoạn CODE lisp copy đối tượng từ A đến B ra 1 khoảng cách đều nhau m mà người dùng nhập vào. Nhưng khi mình load một mình lisp đó lên thì nó chạy bình thường, khi load all lisp của em lên ( tầm 100 cái ) thì nó không chạy được nữa. Tức là em hiểu nó xung biến gì đó. E đã đổi tên biến thành tên khác nhưng vẫn xung, không dùng được. Mà e rất cần nó. Anh nào xử giúp em vụ này với ạ . tức là mình dùng 1 thuật toán khác để làm công việc đó ạ , biết đâu nó lại không bị xung nữa !

Dưới đây là đoạn CODE Bị xung đó

...

Em có một đoạn lisp cũng tương tự, khi dùng hàm COPY để thực hiện việc đó thì sẽ không bị xung, Vậy anh nào có thể chuyển từ thuật toán dùng array sang copy giúp em đựoc không ạ ! em xin chân thành cảm ơn !

Đoạn CODE này không bị xung, nhưng nó lại copy theo cách khác, không phải là @m

Em gửi lên để các anh tham khảo

Nếu cùng lúc bạn load 100 cái thì bạn đã thuộc hàng siêu phàm! Mỗi lisp có mỗi tác giả, mà không ai hiểu nổi là họ viết hay/dỡ/đúng/sai thế nào thì làm sao biết chỗ nào mà gỡ.

Nhắc lại câu của bác Phamthanhbinh để bạn hiểu:

"Một lisp thì sống,

Đống lisp thì... toi!"

Thân thương!

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

Nếu cùng lúc bạn load 100 cái thì bạn đã thuộc hàng siêu phàm! Mỗi lisp có mỗi tác giả, mà không ai hiểu nổi là họ viết hay/dỡ/đúng/sai thế nào thì làm sao biết chỗ nào mà gỡ.

Nhắc lại câu của bác Phamthanhbinh để bạn hiểu:

"Một lisp thì sống,

Đống lisp thì... toi!"

Thân thương!

Hề hề...Mình thì thấy thực tế là :

"Một lisp thì sống,

Đống lisp thì "vẫn sống nhăn!"

 

Có điều là không sử dụng được Lisp. Dzậy đó. Bạn vẫn phải hoàn thành công việc được giao của mình. hì hì

Thân á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
girl    5

hức. Thực tế là dùng cách copy ra 1 đoạn @m thì ko hề bị xung. Như vậy các anh đổi giúp em cái dòng<pre class="cadvietlispcode">(command "_.array" ss1 "" "r" 1 n d)sang (command "copy" ???? ) là ok ạ ?</pre>

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
Doan Van Ha    2.678

hức. Thực tế là dùng cách copy ra 1 đoạn @m thì ko hề bị xung. Như vậy các anh đổi giúp em cái dòng<pre class="cadvietlispcode">(command "_.array" ss1 "" "r" 1 n d)sang (command "copy" ???? ) là ok ạ ?</pre>

Cách tốt nhất để sửa lisp cho bạn là bạn đưa nguyên file lisp lên đây + copy cái lỗi khi chạy chương trình (F2) lên nữa thì mới tìm ra manh mối đươc, chứ thay array bởi copy thì vẫn phải dùng các biến (ss1, n, d...) bị xung khắc ấy mà thôi.

Thân thương!

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

Lisp bạn đang muốn dùng bị lỗi. Bạn thay tên các biến đang có là OK. Ví dụ (setq a ...) bạn thay thành (setq a_cadviet...). Dùng lệnh Ctrl+H của Notepad ++ cho nhanh.

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
girl    5

Đây là CODE FULL
;;;;;;;;;;;;;;;;;;=================== 44================
(DEFUN C:49 ()
 (Command "undo" "begin")
 (SETQ CMD (GETVAR "CMDECHO"))
 (SETQ OSM (GETVAR "OSMODE"))

(progn
 	(setq cmdo (getvar "cmdecho"))
	;(command "_.ucs" "")
 	(setvar "cmdecho" 0)
 	(princ "\nCopy array:")
 	(setq ss1 (ssget))
 	(setq p1 (getpoint "First point: "))
 	(setq p2 (getpoint p1 "Second point: "))
 	(if ca:distance
(progn
  (setq std (rtos ca:distance 2 4))
  (setq d (getdist (strcat "@n=<" std ">: ")))
  (if d
	(setq ca:distance d)
  )
)	;end progn
(setq ca:distance (getdist "a= "))
 	) 	;end if
 	(setq a (angle p1 p2))
 	(setq a (* (/ 180 pi) a))
 	(command "_.ucs" "z" a)
 	(setq di (distance p1 p2))
 	(setq d ca:distance)
 	(setq n (/ di d))
 	(setq n (+ 1 (atoi (rtos n 2 1))))
 	(command "_.array" ss1 "" "r" 1 n d)
 	(command "_.ucs" "")
 	(setvar "cmdecho" cmdo)
 	(command "OSMODE" "15359")
 	(princ)
)
 )

 	(PRINC)
)
 )
)

 

Command: 49 undo Current settings: Auto = On, Control = All, Combine = Yes

Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]

<1>: begin

Command:

Copy array:

Select objects: 1 found

 

Select objects: First point: Second point: @n=<15>: 5

5.000000

 

Unknown command "49". Press F1 for help.

OSMODE

Enter new value for OSMODE <15359>: 15359

Command:

Cái này 100% em nghĩ là do cái thằng Array phải xoay UCS bây giờ mình làm sao để không động chạm gì tới UCS thì sẽ giải quyết đc vấn đề, còn việc tên biến có trùng cũng không sao ạ. Vì e có rất nhiều tên biến trùng nhau như vậy giữa các lispp nhưng không bị làm sao cả. Anh cứ đổi giúp em thuật toán array sang COPY là ok ạ !

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

 

Cái này 100% em nghĩ là do cái thằng Array phải xoay UCS bây giờ mình làm sao để không động chạm gì tới UCS thì sẽ giải quyết đc vấn đề, còn việc tên biến có trùng cũng không sao ạ. Vì e có rất nhiều tên biến trùng nhau như vậy giữa các lispp nhưng không bị làm sao cả. Anh cứ đổi giúp em thuật toán array sang COPY là ok ạ !

Hề hề hề,

Đây thì chiều Girl nhé. Còn được hay không thì chưa biết. Girl cứ thử coi đã ưng cái bụng chưa? Nếu chưa thì có nghĩa là Girl đoán chả đúng 100% đâu.

Hề hề hề,


(progn
  (setq cmdo (getvar "cmdecho"))
;(command "_.ucs" "")
  (setvar "cmdecho" 0)
  (princ "\nCopy array:")
  (setq ss1 (ssget))
  (setq p1 (getpoint "First point: "))
  (setq p2 (getpoint p1 "Second point: "))
  (if ca:distance
                       (progn
                                 (setq std (rtos ca:distance 2 4))
                                 (setq d (getdist (strcat "@n=<" std ">: ")) )
                                 (if d
                	(setq ca:distance d)
                              	)
                    	) ;end progn
                    	(setq ca:distance (getdist "a= "))
  )  ;end if
  (setq a (angle p1 p2))
  ;;;;;;;;;;;;(setq a (* (/ 180 pi) a))
  ;;;;;;;;;;;;(command "_.ucs" "z" a)
  (setq di (distance p1 p2))
  (setq d ca:distance)
  (setq n (/ di d))
  (setq n (+ 1 (atoi (rtos n 2 1))))
  ;;;;;;;;;;;;;;;(command "_.array" ss1 "" "r" 1 n d)
                 (SETQ DEM 1)
                 (WHILE (< DEM n)
                         (SETQ BDT (* DEM d))
                         (SETQ PT1 (POLAR p1 a BDT))
                         (COMMAND "COPY" SLT "" p1 PT1)
                         (SETQ DEM (+ DEM 1))
  )
  (command "_.ucs" "")
  (setvar "cmdecho" cmdo)
  (command "OSMODE" "15359")
  (princ)
)
 )

Hề hề hề.

  • 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
girl    5

Hức.hức. Phiền anh Binh Check lại xem trong đoạn CODE đó có viết nhầm chỗ nào ko ạ ? chứ bản thân chạy nguyên 1 mình lisp đó cũng ko chạ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
phamthanhbinh    3.123

Hề hề hề,

Đây thì chiều Girl nhé. Còn được hay không thì chưa biết. Girl cứ thử coi đã ưng cái bụng chưa? Nếu chưa thì có nghĩa là Girl đoán chả đúng 100% đâu.

Hề hề hề,


(progn
  (setq cmdo (getvar "cmdecho"))
;(command "_.ucs" "")
  (setvar "cmdecho" 0)
  (princ "\nCopy array:")
  (setq ss1 (ssget))
  (setq p1 (getpoint "First point: "))
  (setq p2 (getpoint p1 "Second point: "))
  (if ca:distance
                       (progn
                                 (setq std (rtos ca:distance 2 4))
                                 (setq d (getdist (strcat "@n=<" std ">: ")) )
                                 (if d
            		(setq ca:distance d)
                          		)
                		) ;end progn
                		(setq ca:distance (getdist "a= "))
  )  ;end if
  (setq a (angle p1 p2))
  ;;;;;;;;;;;;(setq a (* (/ 180 pi) a))
  ;;;;;;;;;;;;(command "_.ucs" "z" a)
  (setq di (distance p1 p2))
  (setq d ca:distance)
  (setq n (/ di d))
  (setq n (+ 1 (atoi (rtos n 2 1))))
  ;;;;;;;;;;;;;;;(command "_.array" ss1 "" "r" 1 n d)
                 (SETQ DEM 1)
                 (WHILE (< DEM n)
                         (SETQ BDT (* DEM d))
                         (SETQ PT1 (POLAR p1 a BDT))
                         (COMMAND "COPY" SLT "" p1 PT1)
                         (SETQ DEM (+ DEM 1))
  )
  (command "_.ucs" "")
  (setvar "cmdecho" cmdo)
  (command "OSMODE" "15359")
  (princ)
)
 )

Hề hề hề.

Hề hề hề,

Như đã nói, mình chỉ làm theo yêu cầu của bạn là thay thế thằng array bằng thằng copy mà thôi. Để thay thế mình chỉ thay lại mấy cái biến trong phần copy của đoạn lisp thứ hai trùng với biến trong đoạn lisp thứ nhất chứ chả hề làm gi khác cả.

Việc thay như vậy là đúng với yêu cầu bạn đã nêu, Còn việc nó không chạy có nhẽ là do đoạn lisp của bạn gửi mà thôi. Bạn hãy gửi thông báo lỗi khi chạy lên để mình xem lại.

Bạn hãy kiểm tra lại xem, thực tế là mình chỉ thay có mỗi cái lệnh array thành đoạn lặp while dùng lệnh copy thôi 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
ketxu    2.652

- Girl chú ý cách đặt tên tiêu đề. Bạn đã mất công đọc Nội quy rồi thì làm theo 1 thể để mod đỡ vất vả

- Đoạn lisp 49 của girl chạy bình thường, có biến ca:distance là biến toàn cục có thể đổi tên để tránh nhầm lẫn.

Nếu chuyển sang copy thì thời gian thực hiện lệnh sẽ lâu hơn. Girl tham khảo :

(defun c:test(/ ss p1 p2 ang n i)
(command "undo" "begin" )
(or dis (setq dis (getdist "\n Distance :")))
(setq  ss (ssget)
 p1 (getpoint "\n Start :")
 p2 (getpoint p1 "\n End :")
 ang (angle p1 p2)
 n (fix (/ (distance p1 p2) dis))
 i 0
)
(repeat n
(command "copy" ss "" "_non" p1 "_non" (polar p1 ang (* (setq i (1+ i)) dis)))
)
(command "undo" "en"))

 

Ngoài ra có thể sử dụng cái này, mình nghĩ hợp với bạn :

http://www.cadviet.com/forum/index.php?showtopic=54635&hl=%2B%26%23273%3B%E3+%2Bxong+%2Bdynamic&fromsearch=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
girl    5

vâng. Em nhớ rồi ạ. Anh KETXU chỉnh cho e bi h chạy được rồi, hết xung rồi ạ . Nhưng mà anh làm mất tính năng lưu giá trị distance vừa nhập lần trước của em rùi. Với lại em quen chọn đối tượng trước sau đó mới nhập distance. Anh đổi giúp em nhé. Thanks anh !

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
Doan Van Ha    2.678

vâng. Em nhớ rồi ạ. Anh KETXU chỉnh cho e bi h chạy được rồi, hết xung rồi ạ . Nhưng mà anh làm mất tính năng lưu giá trị distance vừa nhập lần trước của em rùi. Với lại em quen chọn đối tượng trước sau đó mới nhập distance. Anh đổi giúp em nhé. Thanks anh !

Nếu vẫn muốn dùng lisp cũ 49 của bạn thì bạn sửa như thế này sẽ chẳng còn xung khắc với bà con lối xóm nữa (tức là không cho đám boy quậy phá girl nữa).

(DEFUN C:49 ( / ss1 p1 p2 d)
(Command "undo" "begin")
(command "_.ucs" "w")
(setq cmdo (getvar "cmdecho"))
(setvar "cmdecho" 0)
(princ "\nCopy array:")
(setq ss1 (ssget))
(if ss1
 (progn
  (initget 1)
  (setq p1 (getpoint "\nFirst point: "))
  (initget 1)
  (setq p2 (getpoint p1 "\nSecond point: "))
  (if (and ca:distance (or (= (type ca:distance) 'INT) (= (type ca:distance) 'REAL)))
(progn
(initget 6)
(setq d (getdist (strcat "\n@n=<" (rtos ca:distance 2 4) ">: ")))
(if d
 	(setq ca:distance d)))
(progn
(initget 7)
(setq ca:distance (getdist "\na= "))))
  (command "_.ucs" "z" (* (/ 180 pi) (angle p1 p2)))
  (command "_.array" ss1 "" "r" 1 (+ 1 (atoi (rtos (/ (distance p1 p2) ca:distance) 2 1))) ca:distance)
  (command "_.ucs" "")))
(setvar "cmdecho" cmdo)
(command "OSMODE" "15359")
(Command "undo" "end")
(princ))

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
girl    5

hí. Anh Hà sửa được rùi ạ. không còn hiện tượng các lisp oánh nhau nữa ạ. Thanks anh ! Anh siêu thật. hi. Thanks diễn đà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
Doan Van Ha    2.678

hí. Anh Hà sửa được rùi ạ. không còn hiện tượng các lisp oánh nhau nữa ạ. Thanks anh ! Anh siêu thật. hi. Thanks diễn đàn !

Thấy bạn là con girl nên tôi sợ mấy thằng boy nó quậy phá bạn tội nghiệp ấy mà! Cám ơn mà quên "Like this" rồi con gái đáng yêu ơi.

Thân thương!

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

Đăng nhập để thực hiện theo  

×