Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)


  • Please log in to reply
2850 replies to this topic

#2241 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 02 December 2014 - 10:52 AM

- hihi Hieu có ghé ngang qua xem thử, nhoc mới học hàm grread, cũng thử múa rìu xíu tận dụng lsp roo của Hieu chỉnh lại = grread, vấn đề giới hạn góc nhập thì nhoc chưa xử đc, nhưng giữ được sợi thun quay quay cho Hieu ^^, quay tới đầu sẽ hiển thị góc phương vị tại chỗ đó ^^ dưới dòng command, khi nào ok, pick chuột trái tại vị trí mún xác định thì đoạn thẳng cũ sẽ chuyển tới đó, mấy anh có hứng giúp nhoc cải tiến phần nhập dữ liệu cho nhoc học hỏi thêm ^^, mò sáng giờ vẫn chưa pit với grread thì xử sao ^^

(defun c:roo(/ doigoc start end *error* vars ovars nvars dt db dh dg tt ent lst px pg p nhap edd info)
 (defun doigoc(goc)
  (rem (- 450.0 goc) 360.0))
 (defun start()
  (setq vars '("osmode" "cmdecho" "angdir" "angbase"))
  (setq ovars (mapcar 'getvar vars)
        nvars (mapcar 'setvar vars (list 0 0 1 (/ pi 2)))))
 (defun end()
  (and ovars (mapcar 'setvar vars ovars)))
 (defun *error* (ABC)
  (end))
 (vl-load-com) 
 (princ "Chon Doi Tuong Can Quay: ") 
 (setq dt (ssget)
       db (getpoint "\nChon BasePoint:")
       ent (ssname dt 0)
	   info (entget ent)
       lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (or (= (car x) 10) (= (car x) 11))) (entget ent))))
 (command "undo" "be")    
 (start)
 ;=========================================================================================
 (if (< (distance db (setq px (car lst))) (distance db (setq pg (cadr lst))))
 (alert (strcat "\nPhuong Vi cu <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle px pg))) 2 2) ">"))
 (alert (strcat "\nPhuong Vi cu <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle pg px))) 2 2) ">"))
 )
 ;=========================================================================================
 (if (< (distance db (setq px (car lst))) (distance db (setq pg (cadr lst))))
  (progn 
 ;==================================================================================================
(while (/= (car (setq nhap (grread t 15 0))) 3)
       (redraw)
	   (if (= (car nhap) 5)
	     (progn
	        (setq p (cadr nhap))
		   	(grdraw db p 1 1)
			(prompt (strcat "\nPhuong Vi hien la <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle db p))) 2 2) ">"))
		 )
		)
)
p
(setq ang (angle db p))
(setq edd (entmod (append info (list (cons 10 db) (cons 11 (polar db ang (distance px pg)))))))
;====================================================================================================   
      (redraw)
   )
;======================================================================================================
  (progn 
 ;====================================================================================================
(while (/= (car (setq nhap (grread t 15 0))) 3)
       (redraw)
	   (if (= (car nhap) 5)
	     (progn
	        (setq p (cadr nhap))
		    (grdraw db p 1 1)
			(prompt (strcat "\nPhuong Vi hien la <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle db p))) 2 2) ">"))
		 )
		)
)
p
(setq ang (angle db p))
(setq edd (entmod (append info (list (cons 10 db) (cons 11 (polar db ang (distance px pg)))))))
;===================================================================================================   
     (redraw)
   )
 ;-------------------------------------------------------
 ) ;end if 
 (end)
 (command "undo" "e")
 )
 

  • 1
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#2242 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 December 2014 - 03:28 PM

Không thấy chủ topic nói rằng đối tượng để quay là 1 Line, sao nhoc viết thế được? Ví dụ khi object là 1 Rec?


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


#2243 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 02 December 2014 - 03:39 PM

- hi nhoc viết thí nghiệm  thử dùng grread ấy mà ^^, nếu lsp bạn Hieu viết để chuyển góc phương vị thì nhoc nghĩ chỉ để quay 1 đoạn thẳng là line, mục đích gì đó thì nhoc chưa pit, còn mún xoay nhóm obj hay polyline thì nhoc chưa làm nổi kaka.

- anh Ha giúp nhoc các dùng grread nhập liệu từ bàn phím mà có giới hạn như bạn Hieu hỏi từ 0-180, vậy là mình sẽ có 2 cách trả về 1 là pick 2 là nhập liệu, nhoc chưa pit phải làm sao ^^


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#2244 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 02 December 2014 - 03:50 PM

- hi nhoc viết thí nghiệm  thử dùng grread ấy mà ^^, nếu lsp bạn Hieu viết để chuyển góc phương vị thì nhoc nghĩ chỉ để quay 1 đoạn thẳng là line, mục đích gì đó thì nhoc chưa pit, còn mún xoay nhóm obj hay polyline thì nhoc chưa làm nổi kaka.

- anh Ha giúp nhoc các dùng grread nhập liệu từ bàn phím mà có giới hạn như bạn Hieu hỏi từ 0-180, vậy là mình sẽ có 2 cách trả về 1 là pick 2 là nhập liệu, nhoc chưa pit phải làm sao ^^

Hàm grread chỉ nhập được 1 ký tự, hoặc pick 1 điểm, hoặc pick vào 1 icon... >> e rằng không thể dùng được để nhập 1 số có nhiều chữ số (VD: 123.45).


  • 1

* 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.


#2245 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 02 December 2014 - 04:41 PM

Thanks nhóc và bác Hà đã nhiệt tình với vấn đề em nêu ra. Mục đích lisp roo của em là quay một tập hợp object theo góc phương vị. Hiện tại nội lực của em chưa đủ để xem code của nhóc viết thêm nên nhóc cứ đem lisp làm chuột bạch thoải mái. Nhóc có thể làm sao đó mà lisp sửa xong giống với cái nguyên thủy của tớ nhất kèm theo các điều kiện không enter chưa nhập số và nhập số trong khoảng [0 180] là thành công. :D


  • 0

#2246 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 03 December 2014 - 04:09 AM

@nhoc: Grread thì không thể nhập số kiểu như bạn trình bày được

Nhưng kết hợp grread và dialog để nhập thì được

Ví dụ như TH này :

- Khi User rê chuột thì "Grread" phát huy tác dụng

- Khi User bấm phím số "56" độ chẳng hạn thì lúc đầu User phải bấm số 5 rồi mới bấm số 6

Ta đi thiết lập cho việc User bấm phím số đầu đưa vào hộp thoại. User chỉ việc nhập số tiếp theo trong hộp thoại. TH nhập số khác khoảng 0 -> 180 thì khi ok -> "Grread rê chuôt" phát huy tác dụng tiếp ^_^

Code mình viết để bạn tham khảo

 

(setq ok nil)
(while (and (or (/= (car (setq nhap (grread t 15 0))) 3) (< 47 (cadr nhap) 58)) (null ok))
       (redraw)
               (if (= (car nhap) 5)
                 (progn (princ "\n")
                    (princ (setq p (cadr nhap)))
                         )
                        )
      (if (= (car nhap) 2)
            (if (< 47 (cadr nhap) 58)
              (if (<= 0 (atoi (setq gocnhap (lisped (itoa (- (cadr nhap) 48)))) ) 180.0)
                 (progn (setq ok t) (alert (strcat "Gia tri goc nhap : " gocnhap)) (princ "\nGoc nhap : ") (princ gocnhap) )
      )))
)
(setq ok nil)
(while (and (or (/= (car (setq nhap (grread t 15 0))) 3) (< 47 (cadr nhap) 58)) (null ok))
       (redraw)
  (if (= (car nhap) 5)
    (progn
       (princ (setq p (cadr nhap)))
)
)
      (if (= (car nhap) 2)
(if (< 47 (cadr nhap) 58)
 (if (<= 0 (atoi (setq gocnhap (lisped (itoa (- (cadr nhap) 48)))) ) 180.0)
    (progn (setq ok t) (alert (strcat "Gia tri goc nhap : " gocnhap)) (princ gocnhap) )
      )))
)

  • 2

#2247 tuyenhp87

tuyenhp87

    Chưa sử dụng CAD

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

Đã gửi 03 December 2014 - 10:04 AM

Xin lỗi, trả lời nhầm.

Có hàm (substr st start count) trả về như Jin yêu cầu.
VD: (subst "abcd45e263" 3 5) = "cd45e"

Chào anh em làm trong nghành đóng tàu rất hay dùng lệnh "dimaligned" để đo các kích thước phục vụ hạ liệu tôn vỏ.

Anh có list nao giúp em đo khoảng cách giữa các giao điểm của các đường được nhanh không.

Rất mong được anh giúp. em cảm ơn!


  • 0

#2248 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 03 December 2014 - 10:32 AM

Các bác ơi từ file text em có n dòng theo dạng "stt xa ya za", ví dụ như:

"1 100.000 200.000 3.456"

"2 2345.000 500.000 3.567"

....

"n 464.321 4000.7575 8.89"

Nhờ đọc được lisp của các bác @Doan Van Ha, @Gia bạch em cũng chuyển được các string text trên từng dòng về dạng list được rồi, dạng:

(1 100.000 200.000 3.456)

(2 2345.000 500.000 3.567)

........

Giờ em muốn vẽ một đường line hoặc polyline qua tọa độ của các điểm 1,2, ...n  này thì em phải dùng những hàm nào, các bác tư vấn và cho ví dụ để em vọc vạch với. Thanks các bác.


  • 0

#2249 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 03 December 2014 - 11:43 AM

- Vẽ pline qua các điểm đó chắc đc ^^ nhưng nhoc chưa pit cách add đc Z của từng điểm vào pline, nhoc cũng chưa hiểu cách chuyển từ text sang lst của Hieu như thế nào, quét tới đâu chuyển tới đó hay quét hết 1 lúc rùi chuyển lun, nhoc có code mấy  dòng Hieu thử xem sao

(defun c:rrr(/ )
(setq a '(1 2 3 4))
(setq b '(2 7 8 9))
(setq lst_new (mapcar '(lambda (x) (cdr x)) (list a b)))
(K:pline lst_new nil nil nil)
) 
;;;;;;;;;;;============================================================
(defun K:pline (listpoint closed Layer clr / Lst)
	(setq Lst (list '(0 . "LWPOLYLINE")'(100 . "AcDbEntity")
	(cons 8 (if Layer Layer (getvar "Clayer")))
	(cons 62 (if clr clr 256))
    '(100 . "AcDbPolyline")
	(cons 90 (length listpoint))
	(cons 70 (if closed 1 0))))
	(foreach PP listpoint	(setq Lst (append Lst (list (cons 10 PP)))))
(entmakex Lst))
	;end;================================= 

- biến a, b giả sử tương ứng với các lst tọa độ trả về của Hieu


  • 1
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#2250 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 03 December 2014 - 11:58 AM

- Vẽ pline qua các điểm đó chắc đc ^^ nhưng nhoc chưa pit cách add đc Z của từng điểm vào pline, nhoc cũng chưa hiểu cách chuyển từ text sang lst của Hieu như thế nào, quét tới đâu chuyển tới đó hay quét hết 1 lúc rùi chuyển lun, nhoc có code mấy  dòng Hieu thử xem sao

(defun c:rrr(/ )
(setq a '(1 2 3 4))
(setq b '(2 7 8 9))
(setq lst_new (mapcar '(lambda (x) (cdr x)) (list a b)))
(K:pline lst_new nil nil nil)
) 
;;;;;;;;;;;============================================================
(defun K:pline (listpoint closed Layer clr / Lst)
	(setq Lst (list '(0 . "LWPOLYLINE")'(100 . "AcDbEntity")
	(cons 8 (if Layer Layer (getvar "Clayer")))
	(cons 62 (if clr clr 256))
    '(100 . "AcDbPolyline")
	(cons 90 (length listpoint))
	(cons 70 (if closed 1 0))))
	(foreach PP listpoint	(setq Lst (append Lst (list (cons 10 PP)))))
(entmakex Lst))
	;end;================================= 

- biến a, b giả sử tương ứng với các lst tọa độ trả về của Hieu

thanks nhóc, một loạt hàm chưa học, chạy trước ô tô mệt ghê. Cho tớ hỏi mình có thể dùng đơn giản hơn như là dùng (command  ".polyline" ......) được không nhóc???


  • 0

#2251 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 03 December 2014 - 12:15 PM

- ah đc ^^, nhoc ít xài bên 3d nên ít để ý trục Z, mới xực nhớ có đọc qua dùng lệnh 3dpoly có thể add Z lun ^^, code sẽ đc viết lại như thế này ^^

(defun c:rrr(/ )
(setq a '(1 2 3 4))
(setq b '(2 7 8 9))
(setq lst_new (mapcar '(lambda (x) (cdr x)) (list a b)))
(apply 'command (append (list ".3dPoly") lst_new (list "")))
) 

- các điểm đó sẽ đúng theo lst vd:  x=2 y=3 z=4, 


  • 1
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#2252 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 03 December 2014 - 12:45 PM

thanks nhóc nhiều nha, đợi tớ vọc vạch xem thế nào đã :D.


  • 0

#2253 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 03 December 2014 - 06:19 PM

@nhoc: Grread thì không thể nhập số kiểu như bạn trình bày được

Nhưng kết hợp grread và dialog để nhập thì được

Ví dụ như TH này :

- Khi User rê chuột thì "Grread" phát huy tác dụng

- Khi User bấm phím số "56" độ chẳng hạn thì lúc đầu User phải bấm số 5 rồi mới bấm số 6

Ta đi thiết lập cho việc User bấm phím số đầu đưa vào hộp thoại. User chỉ việc nhập số tiếp theo trong hộp thoại. TH nhập số khác khoảng 0 -> 180 thì khi ok -> "Grread rê chuôt" phát huy tác dụng tiếp ^_^

 

Hàm grread chỉ nhập được 1 ký tự, hoặc pick 1 điểm, hoặc pick vào 1 icon... >> e rằng không thể dùng được để nhập 1 số có nhiều chữ số (VD: 123.45).

 

Chỉ được nhập 1 ký tự không có nghĩa là ta không thể có cách nào nhập 2 ký tự hoặc hơn khi vận dụng nó. Cho grread vào vòng lặp while và khai báo điều kiện thoát lặp thì ta có thể nhập bao nhiêu ký tự cũng được.

 

Ví dụ như cách làm của Tue_NV, bạn hoàn toàn có thể thay thế việc gọi hộp thoại bằng 1 hoặc nhiều lần grread nữa. theo hướng giải quyết như của bạn, ta có thể dùng while hoặc lặp đệ quy để thay cho dialog đều được. Với cách này, thậm chí có thể viết để đối tượng xoay theo thời gian thực khi người dùng nhập số hoặc di chuyển con trỏ luôn nữa cơ.

 

Trước đây mình có chia sẻ lên diễn đàn lisp máy tính dòng lệnh. Phương thức nhập liệu mình sử dụng cũng tương tự vậy.


  • 0

#2254 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 03 December 2014 - 07:09 PM

Bởi thế mới tô đỏ "e rằng" đó TL. Thấy cũng không mặn mà lắm với nó nên cũng không nghiên cứu thêm.


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


#2255 hoangvienxd

hoangvienxd

    Chưa sử dụng CAD

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

Đã gửi 04 December 2014 - 12:20 AM

Các bạn cho mình hỏi.

Mình đang viết một lisp, và trong lisp này mình muốn gọi để thực thi một lisp khác được không, nếu được thì câu lệnh như thế nào.

Mình cảm ơn!


  • 0

#2256 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 04 December 2014 - 06:43 AM

Bạn hoàn toàn có thể làm được bằng cách đưa lisp cần gọi làm hàm con, bằng cách thay dòng (defun c:tenlenh () ) bang (defun tenlenh()) va khai báo tham số đầu vào cho nó. Bạn có thể tìm hiểu thêm về hàm con trên diễn đàn
  • 0

#2257 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 04 December 2014 - 08:27 AM

Các bạn cho mình hỏi.

Mình đang viết một lisp, và trong lisp này mình muốn gọi để thực thi một lisp khác được không, nếu được thì câu lệnh như thế nào.

Mình cảm ơn!

Giả sử lisp thứ nhất có 1 lệnh tên là ABC.

Lisp thứ 2 muốn thực thi được lệnh ABC của lisp thứ nhất thì bạn viết kiểu như vầy:

(defun C:XYZ()

 (load "Ten_file_lisp_thu_nhat_kem_duong_dan")

 (C:ABC))


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


#2258 huunhantvxdts

huunhantvxdts

    biết dimbaseline

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

Đã gửi 04 December 2014 - 04:23 PM

Xin hỏi có hàm nào trong lisp có thể chọn đối tượng là text hoặc có thể nhập từ bàn phím người dùng không????


  • 0

#2259 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 04 December 2014 - 04:44 PM

Hàm chọn các đối tượng là TEXT:

(ssget '((0 . "TEXT")))


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


#2260 huunhantvxdts

huunhantvxdts

    biết dimbaseline

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

Đã gửi 04 December 2014 - 04:48 PM

Hàm chọn các đối tượng là TEXT:

(ssget '((0 . "TEXT")))

Ý mình không phải vậy cái đó mình đã biết rồi. Ở đây mình đang lấy dữ liệu để tính toán nên ở dòng cần nhập dữ liệu là có thể chọn trên màn hình hoặc có thể là nhập vào từ bàn phím

cám ơn bạn nhiều


  • 0