Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
hhhhgggg

[Yêu cầu] Lisp copy array tổng hợp !

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

Em có cái lisp copy array theo các tuỳ chọn rất hay. Nhưng hiện tại nó đang bị lỗi cái mục chọn Key "2". Bác pro nào sửa giúp em mục đó với ạ !

Code

;;;;;;;;;;;;;;;;;;=================== 44================
(DEFUN C:44 ()
 (Command "undo" "begin")
 (SETQ CMD (GETVAR "CMDECHO"))
 (SETQ OSM (GETVAR "OSMODE"))
 (initget "1 2 3")

 (setq	key
 (getkword
   "\n Nhap a=,Auto fix....2:Copy ra doan @n..... 3:so doi tuong :"
 )
 )
 (if (not key)

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

				;=============

 (if (= key "2")
   (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)
   )
 )



 (if (= key "3")
   (progn
     (SETQ CMD (GETVAR "CMDECHO"))
     (SETQ OSM (GETVAR "OSMODE"))
     (SETVAR "CMDECHO" 0)
     (PROMPT "\nArray object!")
     (SETQ SLT (SSGET))
     (initget 7)
     (SETQ NET (GETINT "\nSo doi Tuong:"))
     (PROMPT "\nDiem Dau:")
     (SETQ SPT (GETPOINT))
     (PROMPT "\nDiem cuoi:")
     (SETQ EPT (GETPOINT SPT))
     (SETVAR "OSMODE" 0)
     (SETQ GC (ANGLE SPT EPT))
     (SETQ DST (DISTANCE SPT EPT))
     (SETQ DST1 (/ DST (- NET 1)))
     (SETQ DEM 1)
     (WHILE (< DEM (- NET 1))
(SETQ BDT (* DEM DST1))
(SETQ PT1 (POLAR SPT GC BDT))
(COMMAND "COPY" SLT "" SPT PT1)
(SETQ DEM (+ DEM 1))
     )
     (PROMPT "\nKS Pham Hoang Giang")
     (SETVAR "CMDECHO" CMD)
     (SETVAR "OSMODE" OSM)
     (command "OSMODE" "15359")
     (PRINC)
   )
 )
)

 

Nhắc bạn Hoàng Giang khi post code chú ý cho vào thẻ Code!

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 có thâm niên request rồi, nên mình có chút góp ý :

1. Lỗi của bạn là gì ? Mọi người không biết

2. Bạn cần cho đoạn mã vào thẻ code

P/S : bạn là Pham Hoang Giang ??

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

Em có cái lisp copy array theo các tuỳ chọn rất hay. Nhưng hiện tại nó đang bị lỗi cái mục chọn Key "2". Bác pro nào sửa giúp em mục đó với ạ !

Code

;;;;;;;;;;;;;;;;;;=================== 44================
(DEFUN C:44 ()
 (Command "undo" "begin")

   )
 )
)

 

Nhắc bạn Hoàng Giang khi post code chú ý cho vào thẻ Code!

 

Mình nghĩ file của bạn sai UCS thôi. bạn chuyển về UCS World rồi dùng lệnh thử coi dc ko.

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 nghĩ file của bạn sai UCS thôi. bạn chuyển về UCS World rồi dùng lệnh thử coi dc ko.

Em đã để UCS về WORLD rồi nhưng khi chạy thì nó bị lỗi như sau :

Command: 44

Nhap a=,Auto fix....2:Copy ra doan @n..... 3:so doi tuong :2

Copy array:

Select objects: Specify opposite corner: 1 found

 

Select objects: First point: Second point: @n=<2.0000>: 2.000000

error: Function cancelled

 

Và sau khi lỗi thì trục UCS bị thay đổ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

Em đã để UCS về WORLD rồi nhưng khi chạy thì nó bị lỗi như sau :

Command: 44

Nhap a=,Auto fix....2:Copy ra doan @n..... 3:so doi tuong :2

Copy array:

Select objects: Specify opposite corner: 1 found

 

Select objects: First point: Second point: @n=<2.0000>: 2.000000

error: Function cancelled

 

Và sau khi lỗi thì trục UCS bị thay đổi !

Bạn thay dòng:

(command "_.array" ss1 "" "r" 1 n d)

Bởi dòng dưới đây xem sao:

(if (> n 1) (command "_.array" ss1 "" "r" 1 n d))

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 thay dòng:

(command "_.array" ss1 "" "r" 1 n d)

Bởi dòng dưới đây xem sao:

(if (> n 1) (command "_.array" ss1 "" "r" 1 n d))

Em đã thay dòng đó nhưng mà khi chạy thì lisp không copy đối tượng ra được. Nó chỉ thay đổi trục ucs của mình 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

Em đã thay dòng đó nhưng mà khi chạy thì lisp không copy đối tượng ra được. Nó chỉ thay đổi trục ucs của mình thôi ạ !

Có những điều khó hiểu trong lệnh copy_array mà bạn đang dùng:

1. "First point" và "Second point" ngoài xác định hướng để array thì "Second point" có khống chế các đối tượng array phải nằm trong khoảng từ "First point" đến "Second point" không? Nếu khống chế thì khi bạn chọn khoảng cách "a" lớn hơn khoảng cách này nó sẽ không array là phải. Nó chỉ array khi "a" nhỏ hơn hoặc bằng khoảng cách này mà thôi.

2. Nếu 2 điểm đó chỉ xác định hướng thì bạn phải nhập số lần chứ không phải khoảng cách.

Vấn đề này cũng đơn giản thôi. Bạn nói rõ ý tưởng tôi sẽ sửa cho.

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ó những điều khó hiểu trong lệnh copy_array mà bạn đang dùng:

1. "First point" và "Second point" ngoài xác định hướng để array thì "Second point" có khống chế các đối tượng array phải nằm trong khoảng từ "First point" đến "Second point" không? Nếu khống chế thì khi bạn chọn khoảng cách "a" lớn hơn khoảng cách này nó sẽ không array là phải. Nó chỉ array khi "a" nhỏ hơn hoặc bằng khoảng cách này mà thôi.

2. Nếu 2 điểm đó chỉ xác định hướng thì bạn phải nhập số lần chứ không phải khoảng cách.

Vấn đề này cũng đơn giản thôi. Bạn nói rõ ý tưởng tôi sẽ sửa cho.

Lisp này có 3 lựa chọn.

Lựa chọn 1 : Chia đều đoạn AB ra với khoảng cách là giá trị gần nhất giá trị a nhập vào ==> chạy ok

Lựa chọn 2: Copy cách đều các đối tượng ra từng đoạn = a nhập vào trong đoạn từ "First point" đến "Second point" ==> đang bị lỗi

Lựa chọn 3 : nhập vào số đối tượng từ "First point" đến "Second point" , nó sẽ copy ra n đối tượng cách đều nhau.

Các lựa chọn không hề bị chồng chéo nhau. trường hợp khoảng a nhập vào > khoảng cách "First point" tới "Second point" thì nó sẽ ko copy được ra !

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

Lisp này có 3 lựa chọn.

Lựa chọn 1 : Chia đều đoạn AB ra với khoảng cách là giá trị gần nhất giá trị a nhập vào ==> chạy ok

Lựa chọn 2: Copy cách đều các đối tượng ra từng đoạn = a nhập vào trong đoạn từ "First point" đến "Second point" ==> đang bị lỗi

Lựa chọn 3 : nhập vào số đối tượng từ "First point" đến "Second point" , nó sẽ copy ra n đối tượng cách đều nhau.

Các lựa chọn không hề bị chồng chéo nhau. trường hợp khoảng a nhập vào > khoảng cách "First point" tới "Second point" thì nó sẽ ko copy được ra !

1) Lựa chọn 2: Copy cách đều các đối tượng ra từng đoạn = a nhập vào trong đoạn từ "First point" đến "Second point" ==> đang bị lỗi

2) trường hợp khoảng a nhập vào > khoảng cách "First point" tới "Second point" thì nó sẽ ko copy được ra !

Từ 1) suy ra các đối tượng sau khi copy phải nằm trong đoạn "First point" đến "Second point"

Từ 2) suy ra các đối tượng sau khi copy phải nằm ngoài đoạn "First point" đến "Second point"

Như thế làm sao copy?

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

1) Lựa chọn 2: Copy cách đều các đối tượng ra từng đoạn = a nhập vào trong đoạn từ "First point" đến "Second point" ==> đang bị lỗi

2) trường hợp khoảng a nhập vào > khoảng cách "First point" tới "Second point" thì nó sẽ ko copy được ra !

Từ 1) suy ra các đối tượng sau khi copy phải nằm trong đoạn "First point" đến "Second point"

Từ 2) suy ra các đối tượng sau khi copy phải nằm ngoài đoạn "First point" đến "Second point"

Như thế làm sao copy?

khi a < đoạn "First point" đến "Second point" thì nó phải copy được ? đó là trường hợp bài toán sử dụng ? các đối tượng sinh ra nằm trong đoạn "First point" đến "Second point"

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

khi a < đoạn "First point" đến "Second point" thì nó phải copy được ? đó là trường hợp bài toán sử dụng ? các đối tượng sinh ra nằm trong đoạn "First point" đến "Second point"

Đương nhiên khi a < đoạn "First point" đến "Second point" thì nó phải copy được, còn a > đoạn "First point" đến "Second point" thì nó không copy đươc (vì vô lý).

Lệnh 44 vẫn đúng như vậy mà? Nhớ là không có lỗi gì ở UCS đâu nhé. Tôi vẫn sử dụng tốt 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

Không hiểu 2 bác đang tranh cãi về cái gì nữa ^^ Cái này khéo bác DVH viết lại 1 cái cho bạn ấy còn nhanh hơn giải thích ^^

  • 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

Không hiểu 2 bác đang tranh cãi về cái gì nữa ^^

..........

@ ketxu : Chắc là tranh cãi để tìm ra cái "tùy chọn rất hay" í mà ?!

 

Em có cái lisp copy array theo các tuỳ chọn rất hay. .........

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 : Chắc là tranh cãi để tìm ra cái "tùy chọn rất hay" í mà ?!

@Bác Ket: thì bạn ấy cứ loay hoay quanh 1 chỗ ấy, biết làm sao đươc.

@Bác Bach: thực ra thì lisp cũng hay chứ, nhưng... như "@Bác Ket".

Tóm lại: rút kinh nghiệm, lần sau không loay hoay một chỗ như vậy nữa. 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

@Bác Ket: thì bạn ấy cứ loay hoay quanh 1 chỗ ấy, biết làm sao đươc.

@Bác Bach: thực ra thì lisp cũng hay chứ, nhưng... như "@Bác Ket".

Tóm lại: rút kinh nghiệm, lần sau không loay hoay một chỗ như vậy nữa. Hì.

Đúng là cái 44 nó vẫn chạy. Nhưng bác thử đánh 44 rồi chọn "2" rồi chọn đối tượng và nhập đoạn a để nó chạy xem nó có copy ra được ko ? hic ! gần đây nó bị lỗ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

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  

×