Đế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
2854 replies to this topic

#1781 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 09 August 2014 - 06:52 PM

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)


  • 0

#1782 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 14 August 2014 - 10:08 AM

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á. ^^


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1783 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 14 August 2014 - 10:12 AM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1784 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 14 August 2014 - 10:30 AM

(append lst1 lst2 ... lst5)


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


#1785 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 14 August 2014 - 10:35 AM

Bạn dùng

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


  • 0

#1786 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 14 August 2014 - 10:36 AM

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ạ


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1787 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 14 August 2014 - 10:38 AM

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. :'(


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1788 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 22 August 2014 - 10:55 AM

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.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1789 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 22 August 2014 - 11:18 AM

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.


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


#1790 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 22 August 2014 - 11:20 AM

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

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1791 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 22 August 2014 - 11:22 AM

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.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1792 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 22 August 2014 - 11:24 AM

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

Cách tạo này chỉ cần 1 vòng lặp thôi 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.


#1793 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 22 August 2014 - 11:40 AM

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.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1794 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 22 August 2014 - 12:12 PM

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.


  • 0

#1795 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 22 August 2014 - 02:40 PM

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 đã


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1796 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 23 August 2014 - 10:37 AM

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

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1797 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 23 August 2014 - 10:49 AM

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.


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


#1798 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 23 August 2014 - 12:07 PM

Đú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.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1799 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 23 August 2014 - 12:12 PM

Mã này có tính cộng:

8=8+0

9=8+1

Trong đó:

8 : 3Dpolyline

0 : mở

1: đóng


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


#1800 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 23 August 2014 - 02:08 PM

Mã này có tính cộng:

8=8+0

9=8+1

Trong đó:

8 : 3Dpolyline

0 : mở

1: đóng

Thì ra là vậy. Cảm ơn bác Hạ đã giải thích.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn