Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Jin Yong

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

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

taybacincc    5

- 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

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
nhoclangbat    382

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

  • 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
phamhuy1    3

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

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
Tue_NV    3.841

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.

  • 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

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”

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

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

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
Doan Van Ha    2.680

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

  • 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

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

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
phamthanhbinh    3.123

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.

  • 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
taybacincc    5

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.

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 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)
)
  • 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
hiepttr    523

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

  • 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
hiepttr    523

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ẻ ý ạ"

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
thanhduan2407    227

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

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
Tue_NV    3.841

 

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

 

Trong vòng lặp Foreach em có thể xử lý ra kết quả luôn, không cần phải lặp bằng đệ quy (hàm  FILTEROBJ1 và mapcar nữa

Còn xử lý như thế nào là nghệ thuật của em. Chúc em thành cô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
thanhduan2407    227

Trong vòng lặp Foreach em có thể xử lý ra kết quả luôn, không cần phải lặp bằng đệ quy (hàm  FILTEROBJ1 và mapcar nữa

Còn xử lý như thế nào là nghệ thuật của em. Chúc em thành công!

Dạ vâng ạ!

Em sẽ bỏ 2 hàm đó đi.

Em cảm ơn anh Tue_NV

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

Chào các bác. Em có một vấn đề nhỏ mong các bác tư vấn giúp. Em dùng hàm tblsearch trong bản vẽ block có tên là "A". Sau khi tìm được rồi em muốn đổi tên block này sang "B" thì làm thế nào để được kết quả như ý muốn. Block của em là block bình thường các bác ạ. Thanks 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
pphung183    425

Lisp đổi tên Block dường như có roi sao ấy nhỉ... -_-  search tim thử. Không thì gỏ -rename vào dòng lệnh ra cái gì thì viết theo cái đó vậy :)

  • 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

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


×