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ị

Em đã làm được như này rồi, tuy nhiên phần tử đầu tiên vẫn chưa thực hiện được.

(OnFlag (list '(8 9 nil) '(5 8 nil) '(nil 8 4) '(2 3 nil) '(8 nil 2)) )
(defun OnFlag (l)
    (if l
      (cons (car l)
        (OnFlag
           (mapcar '(lambda (x) (mapcar '(lambda (e) (if (= e nil) (not e) e)) x) ) (cdr l))
        )
      )
    )
  )

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 chỉ cần viết :

 

(mapcar '(lambda(x) (mapcar '(lambda(y) (if (null y) t y)) x)) lts)

Dạ, ok rồi anh.

Cảm ơn anh nhiều. Em lại cứ phức tạp hóa vấn đề rù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 đã làm được như này rồi, tuy nhiên phần tử đầu tiên vẫn chưa thực hiện được.

(OnFlag (list '(8 9 nil) '(5 8 nil) '(nil 8 4) '(2 3 nil) '(8 nil 2)) )
(defun OnFlag (l)
    (if l
      (cons (car l)
        (OnFlag
           (mapcar '(lambda (x) (mapcar '(lambda (e) (if (= e nil) (not e) e)) x) ) (cdr l))
        )
      )
    )
  )

Tại bạn (cons (car l) ...) (car l) nó không đổi, chỉ mấy cái sau nó đổi thôi. Cái này đâu cần dùng đệqui làm gì.

  • 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

 

Em đã làm được như này rồi, tuy nhiên phần tử đầu tiên vẫn chưa thực hiện được.

(OnFlag (list '(8 9 nil) '(5 8 nil) '(nil 8 4) '(2 3 nil) '(8 nil 2)) )
(defun OnFlag (l)
    (if l
      (cons (car l)
        (OnFlag
           (mapcar '(lambda (x) (mapcar '(lambda (e) (if (= e nil) (not e) e)) x) ) (cdr l))
        )
      )
    )
  )

 

Em có thể dùng như vầy :

(mapcar '(lambda(x) (subst t nil x)) lst)

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ó thể dùng như vầy :

(mapcar '(lambda(x) (subst t nil x)) lst)

Cảm ơn anh TUE_NV nhiều. Em ko Like dc nữa vì quá tay like nhiều người quá. ^^

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

Cho em hỏi các bác 1 chút.

Em có 1 list gồm 5 list. Em muốn gộp 5 list đó thành 1 list mà các phần tử nằm liền nhau theo thứ tự list mình đưa vào.

Ví dụ em muốn gộp:

('(4 5 6 7) '(3 6 8) '(2 4 67 78 9) '(3 9 0 3)) => (4 5 6 7 3 6 8 2 4 67 78 9 3 9 0 3)

Như vậy em làm như nào ạ?

Cảm ơn các bác

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

Cho em hỏi các bác 1 chút.

Em có 1 list gồm 5 list. Em...............................

Tức là (list '(4 5 6 7) '(3 6 8) '(2 4 67 78 9) '(3 9 0 3)) => (4 5 6 7 3 6 8 2 4 67 78 9 3 9 0 3)

Còn cái bác vừa trên em cũng đã thử rồi ạ.

Cảm ơn bác 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ạn dùng

(apply 'append (list '(4 5 6 7) '(3 6 8) '(2 4 67 78 9) '(3 9 0 3)))

^^. Rất OK và tuyệt ạ. Em lại quên khuấy mất hàm Apply.

Cảm ơn anh Tot77 và bác Hạ nhiều. 

Có gì không hiểu em sẽ hỏi tiếp. ^^

P/s: Em hết quyền LIKE rù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

Các bác cho em hỏi 1 chút.

Trên bản vẽ em có 1 tập hợp đối tượng Point và 1 tập hợp đối tượng Text.

Tại mỗi Point em muốn tìm ra 1 tập hợp đối tượng Text nằm bán kính nhập vào thì sẽ viết LISP như thế nào các bác nhỉ?

Em thì liên tưởng tới ssget với điều kiện kèm theo nhưng chưa biết cách làm. 

Nếu cứ phải duyệt qua tất cả các Text mới lấy ra được tập chọn thì lisp chạy lâu quá.

Các bác bày cho em cách với.

Cảm ơn các bác 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

Với 1 pt làm tâm và 1 R bạn có thể tạo được 1 list các điểm thuộc circle, ví dụ là lst.

Khi đó bạn dùng 1 trong 2 hàm sau để chọn text:

(ssget "cp" lst '((0 . "*text")))

hoặc:

(ssget "wp" lst '((0 . "*text")))

lst điểm càng dày thì mức độ chính xác càng cao, vì khi đó nó gần "tròn". Cỡ n=100 là cũng ổn.

  • 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

Với ssget thì em làm như thế này  được rùi nhưng là với kiểu hình chữ nhật. Với bán kính em chưa biết cách.

Không biết còn cách nào không các bác nhỉ?

      (-4 . ">=,>=,*")(10 5.0 7.0 0.0)
      (-4 . "<=,<=,*")(10 10.0 12.0 0.0)
 
(setq ss1 (ssget "_X" '((0 . "POINT")
		       (-4 . "<AND")
		       (-4 . ">=,>=,*")(10 5.0 7.0 0.0)
		       (-4 . "<=,<=,*")(10 10.0 12.0 0.0)
		       (-4 . "AND>")))
)

 

(setq ss1 (ssget "_X" '((0 . "POINT")
      (-4 . "<AND")
      (-4 . ">=,>=,*")(10 5.0 7.0 0.0)
      (-4 . "<=,<=,*")(10 10.0 12.0 0.0)
      (-4 . "AND>")))
)

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ới 1 pt làm tâm và 1 R bạn có thể tạo được 1 list các điểm thuộc circle, ví dụ là lst.

Khi đó bạn dùng 1 trong 2 hàm sau để chọn text:

(ssget "cp" lst '((0 . "*text")))

hoặc:

(ssget "wp" lst '((0 . "*text")))

lst điểm càng dày thì mức độ chính xác càng cao, vì khi đó nó gần "tròn". Cỡ n=100 là cũng ổn.

Như vậy ta phải tạo 1 lts gồm n điểm hả bác?

Nếu như vậy thì có cần zoom đến chỗ đó và sử dụng ssget "CP" ko bác?

Ý tưởng của em là muốn tạo 1 Polyline 3D từ 1 Polyline 2D đi qua các text có cao độ. Nếu đỉnh nào ko đi qua thì cao độ đỉnh đó giữ nguyê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

Dạ vâng, cái đó thì dễ rồi ạ.

Bác xem cái ý tưởng em em liệu ổn ko?

Em sẽ ko tìm theo bán kính nữa mà chọn theo dạng hình chữ nhật cũng được ạ. Mục đích chỉ là tại mỗi đỉnh Pline em sẽ duyệt đối tượng ít hơn thôi ạ. Chứ duyệt hết thì hơi lâ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

Bạn dùng hàm vl-sort để tìm text gần nhất. Tôi nhớ trc đây có đưa cho bạn cái lsp dời text về point gần nhất, bây giờ thì ngược lại tìm text gần point nhất.

Nhưng nếu đã là 3dpoint thì chắc gì bạn đã bắt được = ssget.

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 dùng hàm vl-sort để tìm text gần nhất. Tôi nhớ trc đây có đưa cho bạn cái lsp dời text về point gần nhất, bây giờ thì ngược lại tìm text gần point nhất.

Nhưng nếu đã là 3dpoint thì chắc gì bạn đã bắt được = ssget.

Cách làm của anh em đã nghĩ tới rồi ạ. Nhưng với số lượng 2 tập đối tượng không xấp xỉ nhau thì cũng không sử dụng được hàm 

(defun leftL(L n / l1 i)
  (setq l1 nil i -1)
  (while (and (< (setq i (1+ i)) n) (nth i L))
    (setq l1 (append l1 (list (nth i L))))
  )
)

Cái ssget em cũng chưa test với đối tượng 3D. Để em thử xem sao đã

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ó một đoạn mã Entmake Polyline 3D nhưng nó lại đang ở dạng Colse.

Các bác sửa giúp em để nó ở dạng Open giúp em với ạ,

Cảm ơn các bác

(defun MakePolyline3D (vtcs)
  (entmake
    (list
    '(0 . "POLYLINE")
    '(66 . 1)
    '(70 . 9)
    )
  )
  (foreach vtx vtcs
    (entmake
      (list
      '(0 . "VERTEX")
      (cons 10 vtx)
      '(70 . 32)
      )
    )
  )
  (entmake '((0 . "SEQEND")))
)

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ôi không có Cad ở đây nên chưa test được. Bạn tìm số 9 và sửa lại thành số 8 xem sao.

Nếu chưa được thì lát nữa mở cad trả lời thêm.

  • 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

Đúng rồi bác Hạ. Vậy mà em cứ hì hục đổi thành 1 và 0.

Mã đóng mở là 70 là 1 và 0 mà, nhưng chỉ là Polyline 2D.

Cảm ơn bác một lần nữa.

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


×