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

#2301 taybacincc

taybacincc

    biết vẽ circle

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

Đã gửi 11 December 2014 - 11:08 AM

- Em có 1 tập hợp các đối tượng text SS, các text trong SS đã được sắp xếp theo thứ tự mà người dùng mong muốn (theo X, theo Y hay theo thứ tự pick)

- Bây giờ em muốn thực hiện một vòng lặp để tính khoảng cách giữa các điểm chèn của các text tương ứng trong SS. E cũng viết thử viết 1 đoạn những toàn lỗi.

Các anh giúp e đoạn code thực hiện công việc trên với ạ.

Chú thích thêm là cuối vòng lặp e muốn nhận được khoảng cách để ghi ra file .txt


  • 0

#2302 nhoclangbat

nhoclangbat

    Edu level: li10

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

Đã gửi 11 December 2014 - 12:18 PM

- hi nhoc thử viết dựa trên ý tưởng của bạn, bạn xem thử, nếu danh sách text của bạn đã sếp theo thứ tự mong mún, và danh sách đó là ename của các text rùi thì công việc đỡn hơn ^^

(defun ss2ent (ss / i Le e) ;;;Convert ss to list of ename
(setq i 0)
(repeat (sslength ss)     
(setq e (ssname ss i)        
Le (append Le (list e))        
i (1+ i)    ))
Le)
(defun c:kki (/ ss_nametext i td_text ds_kc ds_tdtext)
(setq ss_nametext (ss2ent (ssget '((0 . "TEXT")))))
(if ss_nametext
(progn
(setq i 0)
(foreach v ss_nametext
(setq td_text (mapcar 'cdr (vl-remove-if-not '(lambda(x) (= (car x) 10)) (entget v))))
(setq ds_tdtext (append ds_tdtext td_text))
)
(repeat (1- (length ds_tdtext))
(setq kc (distance (nth i ds_tdtext) (nth (setq i (1+ i)) ds_tdtext)))
(setq ds_kc (append ds_kc (list (rtos kc 2 2))))
)
)
)
(princ (vl-princ-to-string ds_kc))
(princ)
)

- lsp nhoc viết để chạy thử ^^, kết quả cuối cùng trả về là danh sách khoảng cách giữa các text, biến ds_kc, từ đó bạn làm tiếp hen, nhoc chưa học xuất qua txt ^^


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

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








#2303 taybacincc

taybacincc

    biết vẽ circle

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

Đã gửi 11 December 2014 - 01:24 PM

Cảm ơn bác nha. Xuất qua txt thì e cũng biết sơ sơ rồi. Để em check thử đã rồi làm phiền bác sau nha. Hê
  • 0

#2304 phamhuy1

phamhuy1

    biết vẽ rectang

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

Đã gửi 14 December 2014 - 12:35 PM

Cho em hỏi: 1- Hàm vl-cmdf có ảnh hưởng đến biến osmode như hàm command không? :(

2- Hàm vl-cmdf và command giống nhau, khác nhau chỗ nào?

Em thấy một số lisp viết bằng hàm Vl, Vlax thì không quan tâm đến Osmode thì phải...


  • 0

#2305 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 14 December 2014 - 02:52 PM

Cho em hỏi: 1- Hàm vl-cmdf có ảnh hưởng đến biến osmode như hàm command không? :(

2- Hàm vl-cmdf và command giống nhau, khác nhau chỗ nào?

Em thấy một số lisp viết bằng hàm Vl, Vlax thì không quan tâm đến Osmode thì phải...

 

1./ Hàm vl-cmdf có ảnh hưởng đến biến osmode như hàm command không? -> Có 

2./

Hàm vl-cmdf sẽ trả về giá trị T nếu công việc diễn ra suôn sẻ, như vậy anh có thể lấy luôn hàm vl-cmdf để làm điều kiện cho if được. Nếu suôn sẻ thì biểu thứ 1, nếu không suôn sẻ thì biểu thức 2. Đó là ý kiến riêng của em.

 chức năng của vl-cmdf tương tự như hàm command.
Tuy nhiên vl-cmdf thêm chức năng xác minh (kiểm tra tính hợp lệ) các đối số và chỉ thực thi nếu đối số là hợp lệ.
Và như ý của Nataca : Hàm vl-cmdf sẽ trả về giá trị T (true) nếu công việc diễn ra suôn sẻ
Nguợc lại command thực hiện lần luợt các đối số cho đến khi lỗi được phát hiện (nếu có). Do đó, lệnh có thể được thực thi một phần và chưa hoàn toàn kết thúc.


  • 1

#2306 phamhuy1

phamhuy1

    biết vẽ rectang

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

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

Thanks pro ! :D


  • 0

#2307 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 19 December 2014 - 09:20 AM

Chào các bác, em viết code để đổi nội dung text như sau:

(setq list (entget (car(entsel "\nPick Text:"))))
(entmod (subst (cons 1 "New Text") (assoc 1 list) list)) 

 

Nhưng không đổi nội dung text trong block được, các bác giúp em vấn đề này với ạ. Bock này là bock bình thường được tạo ra từ lệnh “B”


  • 0

#2308 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 19 December 2014 - 09:38 AM

Chú ý:

1). entsel >> nentsel

2). Bổ sung (entupd ent)


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


#2309 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 19 December 2014 - 09:45 AM

Chú ý:

1). entsel >> nentsel

2). Bổ sung (entupd ent)

Thanks bác, bác chỉ thêm cho em chút về (entup ent) với. em gõ vào command nó báo lỗi thế này, em dùng cad2007:

Command: (entupd ent)

; error: bad argument type: lentityp nil


  • 0

#2310 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 19 December 2014 - 09:47 AM

Thanks bác, bác chỉ thêm cho em chút về (entup ent) với. em gõ vào command nó báo lỗi thế này, em dùng cad2007:

Command: (entupd ent)

; error: bad argument type: lentityp nil

Khổ quá! Tôi chỉ gơi ý. Bạn phải (setq ent (car (nentsel))) mới dùng được ent chứ.


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


#2311 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 19 December 2014 - 09:58 AM

Khổ quá! Tôi chỉ gơi ý. Bạn phải (setq ent (car (nentsel))) mới dùng được ent chứ.

Thanks bác, em làm được rồi. mà phải bỏ cái chữ màu đỏ đi nó mới chạy bác ạ. Em đau đầu suốt từ sáng đến giờ vì nó:

(setq ent (car (nentsel)))


  • 0

#2312 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 19 December 2014 - 05:19 PM

Thanks bác, em làm được rồi. mà phải bỏ cái chữ màu đỏ đi nó mới chạy bác ạ. Em đau đầu suốt từ sáng đến giờ vì nó:

(setq ent (car (nentsel)))

Hề hề hề,

 Đúng vậy, (car (nentsel)) là tên của text , còn (car (entsel)) là tên của block. (entup....) là entup thằng block chừ không phải thằng text.


  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#2313 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 19 December 2014 - 07:49 PM

Hi hi, do em "mò mẫm nên dẫm phải gai" bác phamthanhbinh ah. Mất cả buổi sáng "bắt bệnh" nhưng cuối cùng vẫn phải kêu cứu bác Doan Van Ha.Được cái là đau dài nên nhớ lâu
  • 0

#2314 taybacincc

taybacincc

    biết vẽ circle

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

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

Các bác giúp e vụ này với ạ:

Bài toán của e là có 2 dánh sách lst1 và lst 2, các phần tử trong danh sách đều có kiểu là string, số phần tử trong lst1 lớn hơn số phần tử trong lst2 là 1 phần tử

Ví dụ: lst1 có 10 phần tử, lst2 có 9 phần tử. Bây giờ e muốn write-line 2 danh sách này ra file txt có dạng như sau:

" phần tử 1 của lst1

  phần tử 1 của lst2

  phần tử 2 của lst1

  phần tử 2 của lst2

 phần tử 3 của lst 1

.......

"

Kiểu các phần tử kẹp nhau giống như bảng khối lượng có tên cọc và khoảng cách lẻ ý ạ.

E định viết vòng lặp nhưng vẫn chưa biết lặp kiểu gì cho phù hợp với cả 2 danh sách.

Cảm ơn các bác đã quan tâm.


  • 0

#2315 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

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

Đã gửi 20 December 2014 - 11:06 AM

Bạn thử như này xem:

Các bác giúp e vụ này với ạ:

Bài toán của e là có 2 dánh sách lst1 và lst 2, các phần tử trong danh sách đều có kiểu là string, số phần tử trong lst1 lớn hơn số phần tử trong lst2 là 1 phần tử

Ví dụ: lst1 có 10 phần tử, lst2 có 9 phần tử. Bây giờ e muốn write-line 2 danh sách này ra file txt có dạng như sau:

" phần tử 1 của lst1

  phần tử 1 của lst2

  phần tử 2 của lst1

  phần tử 2 của lst2

 phần tử 3 của lst 1

.......

"

Kiểu các phần tử kẹp nhau giống như bảng khối lượng có tên cọc và khoảng cách lẻ ý ạ.

E định viết vòng lặp nhưng vẫn chưa biết lặp kiểu gì cho phù hợp với cả 2 danh sách.

Cảm ơn các bác đã quan tâm.

(defun c:xuat(/ fn f lista listb n)
(setq fn (getfiled "Copyright Of Trinh Van Hieu - Surveyor " "" "txt" 1)
	   f (open fn "w")
	   lista '("A" "B" "C" "D" "E")
	   listb '(1 2 3 4 )
	   n 0
 )
	   (repeat  (length lista)
	   (write-line (nth n lista) f)
	   (if (<= (+ n 1)  (length listb)) (write-line (itoa (nth n listb)) f))
	   (setq n (+ 1 n))
 	   )
	  (close f)
      (princ)
)

  • 1

#2316 taybacincc

taybacincc

    biết vẽ circle

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

Đã gửi 20 December 2014 - 01:19 PM

Cảm ơn bác nha. Để mình thử xem.
  • 0

#2317 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 20 December 2014 - 01:27 PM

thay dòng:

(if (<= (+ n 1) (length listb)) (write-line (itoa (nth n listb)) f))

thành:

(if (<= (+ n 1)  (length listb)) (write-line  (strcat "\t"  (itoa (nth n listb))) f)) 

để xuất thành 2 cột


  • 1

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#2318 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 22 December 2014 - 09:23 AM

hiepttr kiểm tra xem nó thành 2 cột cùng hàng hay không


  • 0

#2319 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 22 December 2014 - 10:09 AM

hiepttr kiểm tra xem nó thành 2 cột cùng hàng hay không

Phải ko cùng hàng mới đúng yêu cầu của thớt bác ah !

"Kiểu các phần tử kẹp nhau giống như bảng khối lượng có tên cọc và khoảng cách lẻ ý ạ"


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#2320 thanhduan2407

thanhduan2407

    biết lệnh adcenter

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

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

Em hỏi nhờ một chút ạ!

Em viết chương trình thống kê layer theo màu sắc được chọn. Tuy nhiên tốc độ hơi chậm.

Vậy các bác có thể góp ý để nâng cấp tốc độ nó lên được không ạ?

Vì dụ trong việc lọc để lấy đối tượng đó ạ.

Nó chấp nhận Bylayer và Truecolor (bỏ qua Byblock)

(defun C:SCL(/ ColorObj  ClorChuan  ss L3 L2 e   ColorTest mau  Lts_Clor_Layer           )
(setvar "CMDECHO" 0)
(setq Ent (car (entsel "\nCh\U+1ECDn \U+0111\U+1ED1i t\U+01B0\U+1EE3ng l\U+1EA5y m\U+00E0u s?c \U+0111\U+1EC3 th\U+1ED1ng k\U+00EA: ")))
(setq ColorObj (vla-get-ColorIndex (vla-get-truecolor (vlax-ename->vla-object Ent ))))
(if (= ColorObj 256)
    (setq ClorChuan (_getentitycolour Ent))
    (setq ClorChuan ColorObj)
)

(setq ss (acet-ss-to-list (ssget)))
(setq L2 (list))
(setq L3 (list))
(Foreach e ss
	(setq ColorTest  (vla-get-ColorIndex (vla-get-truecolor (vlax-ename->vla-object e))))
  	(if (= ColorTest 256)
	    (setq mau (_getentitycolour e))
	    (setq mau ColorTest)
	)
  	(setq Layer (cdr (assoc 8 (entget e))))
  	(setq L2 (list mau Layer))
  	(setq L3 (append L3 (list L2)))
)

(setq Lts_Clor_Layer (FILTEROBJ1 (vl-remove nil (mapcar '(lambda(x) (if ( = (car x) ClorChuan) (cadr x) nil)) L3))))
(princ Lts_Clor_Layer)
(princ )
)


(defun FILTEROBJ1 ( l  /)
    (if l
      (cons (car l)
        (FILTEROBJ1
          (vl-remove-if '(lambda ( x ) (= x (car l))) (cdr l))
        )
      )
    )
)



(defun _getentitycolour ( ent / )
    (abs
        (cond
            (   (cdr (assoc 62 (entget ent))))
            (   (cdr (assoc 62 (tblsearch "LAYER" (cdr (assoc 8 (entget ent)))))))
        )
    )
)

  • 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