Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

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

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

Vào lúc 6/1/2024 tại 22:13, levietmy đã nói:

Các bác cho mình hỏi tý.

Mình hay dùng (initget 128) và (getpoint) để vừa nhập text hoặc point sau đó xử lý tình huống gì đó.

Nhưng nhap text nó không cho khoảng trắng (nó xem là enter).

Vậy trong trường hợp này muốn nhập text có khoảng trắng thì làm thế nào.

Cám ơn các bác

Thường mình sd vào mục đích đại khái như đoạn code sau:

(defun nhap( / st p)
  (INITGET 128)
  (SETQ P (GETPOINT "\nNhap"))
  (cond
    ((null p) (setq st nil))
    ((listp p) 

    ;Làm việc gì đó
    )
    ((= (type p) 'STR)
     (setq st p)
    )
  )
  st
)
ý mình muốn khi nhập text thì p có thể nhận khoảng trắ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
44 phút trước, levietmy đã nói:

Thường mình sd vào mục đích đại khái như đoạn code sau:

(defun nhap( / st p)
  (INITGET 128)
  (SETQ P (GETPOINT "\nNhap"))
  (cond
    ((null p) (setq st nil))
    ((listp p) 

    ;Làm việc gì đó
    )
    ((= (type p) 'STR)
     (setq st p)
    )
  )
  st
)
ý mình muốn khi nhập text thì p có thể nhận khoảng trắng

(defun nhap( / st p pp)
  (INITGET 128)
  (SETQ P (GETPOINT (SETQ pp (getstring 5 "<nhap>"))))
  (if (null p) (setq p pp))
  (if (or (eq p "nhap") (eq p "")) (setq p nil))
  (cond
    ((null p) (setq st nil))
    ((listp p) 

    ;Làm vi?c gì dó
    )
    ((= (type p) 'STR)
     (setq st p)
    )
  )
  st
)

Bạn thử như này xem

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
12 giờ trước, Luutru đã nói:

(defun nhap( / st p pp)
  (INITGET 128)
  (SETQ P (GETPOINT (SETQ pp (getstring 5 "<nhap>"))))
  (if (null p) (setq p pp))
  (if (or (eq p "nhap") (eq p "")) (setq p nil))
  (cond
    ((null p) (setq st nil))
    ((listp p) 

    ;Làm vi?c gì dó
    )
    ((= (type p) 'STR)
     (setq st p)
    )
  )
  st
)

Bạn thử như này xem

Cám ơn bạn nhưng nó 0 được. Ý mình là khi nhận Enter hay phím trái hay phải chuột thì trả về hoặc là point, string hoặc nil để mình xử lý tiếp, còn code của bạn thì sau khi Enter nó vẫn chưa dừng lại và nếu "Pick" nó 0 trả về 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
Vào lúc 8/1/2024 tại 22:21, levietmy đã nói:

Cám ơn bạn nhưng nó 0 được. Ý mình là khi nhận Enter hay phím trái hay phải chuột thì trả về hoặc là point, string hoặc nil để mình xử lý tiếp, còn code của bạn thì sau khi Enter nó vẫn chưa dừng lại và nếu "Pick" nó 0 trả về point

Để nhận diện người dùng nhấn Enter hay Space hay chuột phải thì dùng hàm grread xem 

(defun c:test () 
     (while 
        (print (grread 1 5 0))
     )
 )

chạy lisp trên và nhấn các phím Enter, space, chuột phải sẽ cho các Mã ký tự phí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
15 giờ trước, Hoanghung97 đã nói:

Để nhận diện người dùng nhấn Enter hay Space hay chuột phải thì dùng hàm grread xem 

(defun c:test () 
     (while 
        (print (grread 1 5 0))
     )
 )

chạy lisp trên và nhấn các phím Enter, space, chuột phải sẽ cho các Mã ký tự phím

Cám ơn bạn nhưng ý của mình không phải nhận diện người dùng mà chỉ đơn giản là nhập dữ liệu point hoặc string (có khoảng trắng). Khi nhận được point mình có thể dùng nó để tìm text trên màn hình thông qua hàm nenselp, hoặc làm gì đó khác; còn khi nhận được text mình sẽ lấy nội dung của nó luôn nhưng mình cần text có khoảng trắ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

 

4 giờ trước, levietmy đã nói:

Cám ơn bạn nhưng ý của mình không phải nhận diện người dùng mà chỉ đơn giản là nhập dữ liệu point hoặc string (có khoảng trắng). Khi nhận được point mình có thể dùng nó để tìm text trên màn hình thông qua hàm nenselp, hoặc làm gì đó khác; còn khi nhận được text mình sẽ lấy nội dung của nó luôn nhưng mình cần text có khoảng trắng

theo như mình biết thì về cơ bản getpoint các keywords không thể có khoảng trắng nhưng nếu b muốn nhập text trên bàn phím b có thể kết hợp giữa getpoint và getstring qua trung gian keywords

VD:

(defun nhap ( / st p text)
  (INITGET "Text")
  (SETQ P (GETPOINT "\nNhap")) 
  (cond
    ((null p) (setq st nil))
    ((= P "Text") 
        (progn
            (setq text (getstring 5"\nNhap Text"))
            (if text (setq st text))
            ;Làm việc gì đó
        )
    )

    ((listp p) 

        ;Làm việc gì đó
    )

  )
  st
)

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
Vào lúc 8/1/2024 tại 09:08, levietmy đã nói:

Thường mình sd vào mục đích đại khái như đoạn code sau:

(defun nhap( / st p)
  (INITGET 128)
  (SETQ P (GETPOINT "\nNhap"))
  (cond
    ((null p) (setq st nil))
    ((listp p) 

    ;Làm việc gì đó
    )
    ((= (type p) 'STR)
     (setq st p)
    )
  )
  st
)
ý mình muốn khi nhập text thì p có thể nhận khoảng trắng


Bạn thử code này xem sao: 
(defun nhap( / st p)
  (INITGET 128)
  (SETQ P (GETPOINT "\nNhap : ")) (princ)
     (if (= (type p) 'STR)
       (setq st (strcat p (getstring T p)))
       (setq st p)
    )
  st
)

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
Vào lúc 15/1/2024 tại 00:08, Tue_NV đã nói:


Bạn thử code này xem sao: 
(defun nhap( / st p)
  (INITGET 128)
  (SETQ P (GETPOINT "\nNhap : ")) (princ)
     (if (= (type p) 'STR)
       (setq st (strcat p (getstring T p)))
       (setq st p)
    )
  st
)

Cám ơn bạn.

Code này khi nhập Space thì nó cho mình nhập tiếp nhưng nó 0 nhận Space đó, còn khi Enter thì nó 0 dừng lại mà bắt nhập tiếp.

Hồi trước hình như mình có đọc có biến gì đó làm cho cad 0 nhận Space là Enter mà mình 0 nhớ để thử

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
Vào lúc 18/1/2024 tại 12:38, levietmy đã nói:

 

Các bạn cho mình hỏi về hàm entsel và nentselp.

Mình có block ATT, mình muốn dùng hàm nentselp để chọn ATT đó sao cho nó trả về ename giống như dùng hàm entsel mà mình 0 làm không được.

Khi dùng nentselp thì nó trả về ename kiểu như là trong block rồi.

Ví dụ: (entsel) -> (list name1 point)

(nentselp  (setq p (getpoint))) -> (list name2 p)

kiểu như name2 là (entnext name1) ..., đại khái vậy.

Nhưng mình muốn name2 phải là name1 thì làm cách nào.

Các bạn biết chỉ giúp. 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
9 giờ trước, levietmy đã nói:

Các bạn cho mình hỏi về hàm entsel và nentselp.

Mình có block ATT, mình muốn dùng hàm nentselp để chọn ATT đó sao cho nó trả về ename giống như dùng hàm entsel mà mình 0 làm không được.

Khi dùng nentselp thì nó trả về ename kiểu như là trong block rồi.

Ví dụ: (entsel) -> (list name1 point)

(nentselp  (setq p (getpoint))) -> (list name2 p)

kiểu như name2 là (entnext name1) ..., đại khái vậy.

Nhưng mình muốn name2 phải là name1 thì làm cách nào.

Các bạn biết chỉ giúp. Cám ơn nhiều

 

Block khi insert nó mang một tên riêng. Muốn lấy lại tên nguồn bạn dùng: (vla-get-EffectiveName blocko). Với blocko là object 

  • Like 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
10 giờ trước, levietmy đã nói:

Các bạn cho mình hỏi về hàm entsel và nentselp.

Mình có block ATT, mình muốn dùng hàm nentselp để chọn ATT đó sao cho nó trả về ename giống như dùng hàm entsel mà mình 0 làm không được.

(cdr (assoc 2 (entget (cdr (assoc 330 (entget (car (nentsel))))))))

  • Like 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
4 giờ trước, Doan Van Ha đã nói:

(cdr (assoc 2 (entget (cdr (assoc 330 (entget (car (nentsel))))))))

Cám ơn bạn.

Có lẽ mình diễn đạt chưa rõ ràng nên code bạn trả lời chưa đúng ý mình.

Ý là mình muốn chọn ename của đối tượng qua một điểm p cho trước, mình đang dùng hàm (nentselp p). Nhưng hàm này cho ra ename (do mình chọn trúng nằm trong cái block) chứ không phải cái ename đó giống như khi dùng ssget hay entsel (khi dùng 2 hàm này thì 0 có đối số điểm p).

Ví dụ khi dùng (setq ss (ssget)) (setq name (ssname ss 0)), cái name này chính là cái mình ý mình muốn chọn thông qua cái điểm 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
15 phút trước, levietmy đã nói:

Cám ơn bạn.

Có lẽ mình diễn đạt chưa rõ ràng nên code bạn trả lời chưa đúng ý mình.

Ý là mình muốn chọn ename của đối tượng qua một điểm p cho trước, mình đang dùng hàm (nentselp p). Nhưng hàm này cho ra ename (do mình chọn trúng nằm trong cái block) chứ không phải cái ename đó giống như khi dùng ssget hay entsel (khi dùng 2 hàm này thì 0 có đối số điểm p).

Ví dụ khi dùng (setq ss (ssget)) (setq name (ssname ss 0)), cái name này chính là cái mình ý mình muốn chọn thông qua cái điểm p.

Răng rứa hè? Vẫn lấy ename của block
(cdr (assoc 330 (entget (car (nentselp (getpoint))))))

  • Like 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
3 giờ trước, Doan Van Ha đã nói:

Răng rứa hè? Vẫn lấy ename của block
(cdr (assoc 330 (entget (car (nentselp (getpoint))))))

cái này đúng rồi. Cám ơn bạ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
14 phút trước, levietmy đã nói:

cái này đúng rồi. Cám ơn bạn nhiều

 

Nhưng nó cũng có vần đề bạn ạ. Cái block của mình là ATT, nếu vị trí chọn đúng vào text Abtrib thì nó đúng, còn chọn vào không phải là Abtrib thì nó khác.

Mình hỏi thêm tý nữa, mình muốn 1 lần Pick thôi (phải thông qua điểm p), dù gặp bất cứ đối tượng nào (TEXT, LINE, POLYLINE, BLOCK ATT, ...) nó đều cho ra cái ename mà mình muốn

  • Vote giảm 2

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àm nentsel trả về 3 phần tử entity, point pick, block insert chứa entity. Còn hàm entsel là phiên bản giản lược với block là ModelSpace.

  • Like 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
1 giờ trước, cuongtk2 đã nói:

Hàm nentsel trả về 3 phần tử entity, point pick, block insert chứa entity. Còn hàm entsel là phiên bản giản lược với block là ModelSpace.

Cám ơn bạn.

Mục đích của mình là phục vụ cho cái code này nên mình có điểm p trước

(defun nhap( / st p)
  (INITGET 128)
  (SETQ P (GETPOINT "\nPick"))
  (cond
    ((null p) (setq st nil))
    ((listp p) 

     (setq st (NENTSELP p))

     (if st

       ;các xử lý ở đây

       ;nếu là TEXT thì lấy nội dung

       ;nếu là Block ATT thì lấy nôi dung

       ;cũng có khi dữ liệu cần lấy là tên layer, font, ..... nên cần biết nó là gì

     )
    )
    ((= (type p) 'STR)
     (setq st p)
    )
  )
  st
)

Mình tính dùng hàm (ssget "c" p1 p2) nhưng chưa biết tính p1 p2 từ p thế nào cho nó tương đương ô Pickbox

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ìm trên mạng nhé bạn, hình như Lee-Mac có hàm lấy hình vuông 5 pixel với 1 điểm trung tâm để select crossing. Trước đây mình cũng sử dụng cho block thống kê thép, pick để lấy ATT, quay lại sử dụng điểm pick để select block insert chứa nó.

Bạn thử tìm từ khoá select by double click

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
Vào lúc 22/1/2024 tại 08:52, levietmy đã nói:

Cám ơn bạn.

Mục đích của mình là phục vụ cho cái code này nên mình có điểm p trước

(defun nhap( / st p)
  (INITGET 128)
  (SETQ P (GETPOINT "\nPick"))
  (cond
    ((null p) (setq st nil))
    ((listp p) 

     (setq st (NENTSELP p))

     (if st

       ;các xử lý ở đây

       ;nếu là TEXT thì lấy nội dung

       ;nếu là Block ATT thì lấy nôi dung

       ;cũng có khi dữ liệu cần lấy là tên layer, font, ..... nên cần biết nó là gì

     )
    )
    ((= (type p) 'STR)
     (setq st p)
    )
  )
  st
)

Mình tính dùng hàm (ssget "c" p1 p2) nhưng chưa biết tính p1 p2 từ p thế nào cho nó tương đương ô Pickbox

Như lisp này của b, sao b không dùng luôn Nentselp thay cho Getpoint nhỉ, có phải dễ xử lý khô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
Vào lúc 23/1/2024 tại 13:53, Hoanghung97 đã nói:

Như lisp này của b, sao b không dùng luôn Nentselp thay cho Getpoint nhỉ, có phải dễ xử lý không

Như đã nói ở trên, khi đối tượng là block ATT thì dùng cái " (setq st (NENTSELP p))" này, tên đối tượng trả về tùy thuộc vào p ở đâu chứ mình không lấy được tên ename như (ssget) hay (entsel) là tên mà mình cần 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
Vào lúc 22/1/2024 tại 09:52, cuongtk2 đã nói:

Tìm trên mạng nhé bạn, hình như Lee-Mac có hàm lấy hình vuông 5 pixel với 1 điểm trung tâm để select crossing. Trước đây mình cũng sử dụng cho block thống kê thép, pick để lấy ATT, quay lại sử dụng điểm pick để select block insert chứa nó.

 Bạn thử tìm từ khoá select by double click

không cần đâu bác. cứ dùng (ssget point) tự động chọn được đối tượng đúng bằng cái pickbox :))

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

@levietmy bạn nói khó hiểu vãi chấy đọc muốn xỉu up xỉu down

Bạn muốn initget 128 để có thể nhập string hoặc pick điểm bằng getpoint.

Điểm pick được muốn dùng để lấy nội dung trong block nên cần dùng nentselp

ngoài ra bạn cần lấy thêm ename của block.

mình diễn giải có đúng k ạ.

 

1. mình khuyên bạn nên dùng (nentsel) để cách sử dụng hiệu quả hơn vẫn có thể initget 128 nhập string bình thường

2. để lấy ename của block

ví dụ setq ents (nentsel) hoặc (nentselp pt)

(if (eq 'ENAME (type (car (last ents))))

  (setq entblock (car (last ents)))

  (setq entblock (cdr (assoc 330 (entget (car ents)))))

)

hoặc đơn giản hơn thì

(ssname (ssget (cadr ents)) 0)

ps.

Bạn nên nghiên cứu về lisp nhiều hơn rồi mới đi hỏi. Vì những kiến thức này quá phổ thông.

Bạn đi hỏi thì lại nói quá mức khó hiểu làm người đọc lú. Mình đọc lú mất nửa tiếng mới hiểu bạn muốn nói gì.

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
2 giờ trước, tannguyen291 đã nói:

không cần đâu bác. cứ dùng (ssget point) tự động chọn được đối tượng đúng bằng cái pickbox :))

Anh nhầm vấn đề này, thứ anh đề cập là select tại điểm pick 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

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

×