Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
14 replies to this topic

#1 girl

girl

    biết vẽ spline

  • Members
  • PipPip
  • 92 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 18 November 2011 - 06:57 PM

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

Bài viết đã được chỉnh sửa nội dung bởi ketxu: 19 November 2011 - 02:12 PM
Đặt tên tiêu đề sai quy định

  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 18 November 2011 - 08:46 PM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#3 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3805 (đỉnh cao)

Đã gửi 18 November 2011 - 09:41 PM

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

#4 girl

girl

    biết vẽ spline

  • Members
  • PipPip
  • 92 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 19 November 2011 - 05:42 AM

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

#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 19 November 2011 - 08:39 AM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#6 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 19 November 2011 - 09:21 AM

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

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#7 girl

girl

    biết vẽ spline

  • Members
  • PipPip
  • 92 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 19 November 2011 - 10:52 AM


&#272;&#226;y l&#224; 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 ạ !
  • 0

#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 19 November 2011 - 11:51 AM


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ề.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 girl

girl

    biết vẽ spline

  • Members
  • PipPip
  • 92 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 19 November 2011 - 01:30 PM

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 ạ ?
  • 0

#10 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 19 November 2011 - 02:15 PM

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ề,
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#11 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 19 November 2011 - 02:17 PM

- 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.c...ic&fromsearch=1
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#12 girl

girl

    biết vẽ spline

  • Members
  • PipPip
  • 92 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 20 November 2011 - 04:14 AM

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

#13 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 20 November 2011 - 09:58 AM

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))

  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#14 girl

girl

    biết vẽ spline

  • Members
  • PipPip
  • 92 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 20 November 2011 - 04:03 PM

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

#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 20 November 2011 - 04:38 PM

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

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.