Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Viết lisp theo yêu cầu [phần 2]

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

Chào tất cả các anh chi! nhờ các anh chị chỉ dùm cho em cái: em cũng vừa mon men học tập autolisp thôi!

 

Làm so có thể lấy được chiều cao của chữ (đối tượng text) trong bản vẽ. bằng các hàm em cũng đã đưa ra được đó là danh sách có chứa chiều cao VD như (40 . 0.25) đó là danh sách của ename với chiều cao chữ là 0.2, nhưng như hình danh sách (40 . 0.25) lại xảy ra lỗi (bad list) Vậy bây giờ làm sao em có thể lẩy ra số 0.25 này nhỉ! thanks các bác nhiều!

Chào bạn minhthuantp,

Để lấy được các mã DXF của một text, bạn sử dụng hàm (setq elst (entget(car(entsel)))) sau đó chọn vào text muốn lấy mã.

Để có được chiều cao của text này bạn sử dụng hàm (setq h (cdr (assoc 40 elst))).

Bạn lưu ý rằng hàm (assoc 40 elst ) trả về một associate list nghĩa là gồm hai phần tử và một dấu chấm ngăn cách giữa hai phần tử này. Trước và sau dấu chấm đều phải có một khoảng trắng.Ví dụ (40 . 0.25)

Việc bạn nói text có chiều cao 0.25 mà mã DXF code 40 của nó là (40 . 0.2) chắc là có nhầm lẫn gì đó chứ không thể như vậy. Còn cái mã DXF (40 .0.25) của bạn là sai vì thiếu một phoảng trắng sau dấu chấm. Do đó nó báo là bad list bạn ạ. Hãy kiểm tra lại nhé.

Chúc bạn 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
Chào các bác! em có một vấn đề này nhờ các bác giúp đỡ. khi em làm hồ sơ hoàn công nền đường đắp việc chia lớp các mặt cắt rất nhiều và lắt nhắt khi nhập và tính toán thủ công vậy nhờ các bác giúp em với, cụ thể như hình:

01.gif

1. click vào 1 điểm rồi nhập toạ độ tương đối của điểm đó ( nhập tay )

2. click vào vùng kín cần chia lớp ( như chọn vẽ mặt cắt) rồi nhập tay chiều dày lớp (30cm)

-> lisp sẽ tự động chia lớp bằng các đưòng line

-> xuất bảng thuộc tính của các đường line ( thứ tự đuờng line | toạ độ( x, y) điểm đầu( so với toạ độ nhập tay) | toạ độ( x, y) điểm cuối | chiều dài line | diện tích miền ( nếu đuợc) |

- > xuất bảng đó ra file .txt

cảm ơn các bác truớc !

Chào bạn Ohay102.

Bạn hãy nói rõ hơn về cách chia lớp của bạn. Các đường chia này nghiêng bao nhiêu độ. Chuẩn bắt đầu chia tính từ đâu???....

Có vậy mới có thể viết líp được bạn ạ.

Chúc bạn vui.

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 bác Thiệp.

Vì Text cũng như Block đã có tên rõ ràng rồi nên PP cần vài đoạn code để bỏ vào trong Lisp. Trong khi sử dụng thì nó sẽ tự động tìm, thay thế và xoá luôn cái Block đó. User không phải làm gì cả.

Vì lý do trên nên phải nhờ Bác giúp đở. Chúc các Bác thật zui zẻ trong đêm giáng sinh tối nay. Cheers!

Bác ba dùng đoạn lisp Thiep sưu tầm dùng để tìm và lập lại tất cả các kiểu Text này xem:

(defun repstring (ostring nstring / ss )
(setq ss (ssget "X" (list (cons 0 "INSERT,TEXT,MTEXT,RTEXT,DTEXT,DIMENSION"))))
    (if ss
        (progn
             (repeat (sslength ss)
             (setq ent (ssname ss 0))
             (setq en (entget ent))
             (setq etype (cdr (Assoc 0 en)))
                  (if (= etype "INSERT")
                     (PROGN
                          (IF (ASSOC 66 EN)
                               (PROGN
                               (SETQ SUB1 (ENTNEXT ENT))
                                    (WHILE (= (CDR (ASSOC 0 (ENTGET SUB1))) "ATTRIB")
                                    (SETQ SUBEN (ENTGET SUB1))
                                    (SETQ STG (CDR (aSSOC 1 SUBEN)))
                                    (SETQ STG (vl-string-subst NSTRING OSTRING STG))
                                    (ENTMOD (sUBST (cONS 1 STG) (aSSOC 1 SUBEN) SUBEN))
                                    (SETQ SUB1 (eNTNEXT SUB1))
                                    )
                               (ENTUPD ENT)
                               )
                          )
                     )
                     (PROGN
                     (SETQ STG (CDR (aSSOC 1 EN)))
                     (SETQ STG (vl-string-subst NSTRING OSTRING STG))
                     (ENTMOD (SUBST (CONS 1 STG) (ASSOC 1 EN) EN))
                     )
                  )


             (ssdel ent ss)
             )
        )
    )
)


(defun c:repstring (/ OSTRING NSTRING)
(SETQ OSTRING (GETSTRING T "\nSTRING TO BE REPLACED: "))
(SETQ NSTRING (GETSTRING T "\nSTRING TO REPLACE WITH: "))
(REPSTRING OSTRING NSTRING)
)

  • Vote tăng 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
Mong các bác giúp dùm em cái này,em cám ơn rất nhiều

em có 1 tập các điểm,mỗi điểm là giao nhau của 2 đoạn pline nhỏ,bây h em muốn scale hết tất cả các đoạn pline đó lên ,tâm scale là mỗi giao điểm đó,các bác có thể giúp em lisp dc ko?Em đã sử dụng 1 lisp ,nhưng nó phải xác định tâm cho mỗi pline,trong khi tập điểm của em rất lớn.Lisp em sử dụng của Tue_NV viết

Chào bạn pbellh,

Chưa hiểu rõ ý bạn. Bạn nhớ rằng lệnh Scale chỉ cho phép chọn một tâm scale thôi. Vậy bạn muốn scale thế nào?? cần nói rõ hơn bạn nhé vì như bạn nói bạn có một tỷ điểm giao nhau giữa các pline mà.

Chúc bạn vui.

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ề hề hề, bác Phiphi- ơi, có phải bác muốn món quà này không nhỉ???

Mình loay hoay mất một chút mới làm được cái món quà này, hy vọng bác sẽ hài lòng.

(defun c:tabc (/ xc yc n i h j k m  d e p  p0 pb p1 p2 p3 p4 p5 p6 pc pt 
p11 p22 p33 p44 p55 p66 p111 p222 p333 ssci ssln lstx lsty lstr lstl tb 
ans lstp enlst)
(setvar "cmdecho" 0 )
(command "Undo" "Begin")
(setq om (getvar "osmode"))
(setq col (getvar "cecolor"))
(setvar "osmode" 0)
(command "ucs" "World")
(setq pc (getpoint "\n Chon diem chuan kich thuoc")
     xc (car pc)
     yc (cadr pc))
(setvar "pdmode" 3)
(setvar "cecolor" "1")
(command "point" pc)
(princ "\n Chon cac holes theo trat tu hien thi")
(setq ssci (ssget '((0 . "CIRCLE")))
     n (sslength ssci)
     i 0
     h (getreal "\n Nhap chieu cao text: ")
     lstx (list)
     lsty (list)
     lstr (list))
(while (< i n)
(setq cir (ssname ssci i)
     lstx (append lstx (list (- (cadr (assoc 10 (entget cir))) xc)) )
     lsty (append lsty (list (- (caddr(assoc 10 (entget cir))) yc)) )
     lstr (append lstr (list (cdr (assoc 40 (entget cir)))) )
     p (list (+ (cadr (assoc 10 (entget cir))) (* (cdr (assoc 40 (entget 
cir))) 3)) (caddr (assoc 10 (entget cir))))
     i (1+ i))
(command "text" "j" "m" p h 0 (rtos i 2 0))
)
(setq pb (getpoint "\n Chon diem dat bang kich thuoc")
     pt (getpoint "\n Chon diem dat text bat ky"))
(command "text" "j" "m" pt h 0 (rtos (nth 0 lstx) 2 4))
(setq tb (textbox (entget(entlast)))
     d (distance (car tb) (cadr tb)))
(entdel (entlast))
(setvar "cecolor" "2")
(command "text" "j" "m" pb (* 1.5 h) 0 "HOLES LOCATION")
(setq p1 (list (- (car pb) (* 2 d)) (- (cadr pb) (* 2 h))))
(command "text" "j" "m" p1 h 0 "PT#")
(setq p2 (polar p1 0 (* 1.5 d)))
(command "text" "j" "m" p2 h 0 "DIA")
(setq p3 (polar p2 0 (* 1.5 d)))
(command "text" "j" "m" p3 h 0 "X axis")
(setq p4 (polar p3 0 (* 1.5 d)))
(command "text" "j" "m" p4 h 0 "Y axis")
(setq j 0)
(while (< j n)
(setq p11 (polar p1 (- (/ pi 2)) (* 1.5 h (1+ j))))
(command "text" "j" "m" p11 h 0 (rtos (1+ j) 2 0))     
(setq p22 (polar p11 0 (* 1.5 d)))
(command "text" "j" "m" p22 h 0 (rtos (* 2 (nth j lstr)) 2 1)) 
(setq p33 (polar p22 0 (* 1.5 d)))
(command "text" "j" "m" p33 h 0 (rtos (nth j lstx) 2 0)) 
(setq p44 (polar p33 0 (* 1.5 d)))
(command "text" "j" "m" p44 h 0 (rtos (nth j lsty) 2 0))
(setq j (1+ j))
)
(setq ans (getstring "\n Ban co muon tao bang toa do duong uon < y or n >: 
"))
(if (= ans "y")
(progn
(setq p0 (getpoint "\n Chon diem dat bang"))
(command "text" "j" "m" p0 (* 1.5 h) 0 "BEND LINE POINTS")
(setq p1 (list (- (car p0) (* 2 d)) (- (cadr p0) (* 2 h))))
(command "text" "j" "m" p1 h 0 "PT#")
(setq p2 (polar p1 0 (* 1.5 d)))
(command "text" "j" "m" p2 h 0 "X axis")
(setq p3 (polar p2 0 (* 1.5 d)))
(command "text" "j" "m" p3 h 0 "Y axis")
(setq p4 (polar p3 0 (* 1.5 d)))
(command "text" "j" "m" p4 h 0 "NOTES")
(setq ssln (ssget '((0 . "LINE")))
     m (sslength ssln)
     k 0)
(while (< k m)
(setq lstl (entget (ssname ssln k))
     p5 (cdr (assoc 10 lstl))
     p6 (cdr (assoc 11 lstl))
     p55 (polar p5 pi 15)
     p66 (polar p6 0 15))
(command "text" "j" "m" p55 h 0 (strcat "P" (rtos (1+ (* 2 k)) 2 0)))
(command "text" "j" "m" p66 h 0 (strcat "P" (rtos (+ 2 (* 2 k)) 2 0)))
(setq p11 (polar p1 (- (/ pi 2)) (* 1.5 h (+ 1 (* 2 k)))))
(command "text" "j" "m" p11 h 0 (strcat "P" (rtos (+ 1 (* 2 k)) 2 0)))
(setq p22 (polar p11 0 (* 1.5 d)))
(command "text" "j" "m" p22 h 0 (rtos (- (car p5) xc) 2 0))
(setq p33 (polar p22 0 (* 1.5 d)))
(command "text" "j" "m" p33 h 0 (rtos (- (cadr p5) yc) 2 0))
(setq p111 (polar p11 (- (/ pi 2)) (* 1.5 h)))
(command "text" "j" "m" p111 h 0 (strcat "P" (rtos (+ 2 (* 2 k)) 2 0)))
(setq p222 (polar p111 0 (* 1.5 d)))
(command "text" "j" "m" p222 h 0 (rtos (- (car p6) xc) 2 0))
(setq p333 (polar p222 0 (* 1.5 d)))
(command "text" "j" "m" p333 h 0 (rtos (- (cadr p6) yc) 2 0))
(setq k (1+ k))
)
)
)
(setq ans (getstring "\n Ban muon lap bang Plate Contour? < y or n >: "))
(if (= ans "y")
(progn
(setq enlst (entget (car (entsel "\n Chon Lwpolyline contour")))
     lstp (list))
(foreach e enlst
(if (= (car e) 10)
(setq lstp (append lstp (list(cdr e))))
)
)
(setq p (getpoint "\n Chon diem dat bang"))
(command "text" "j" "m" p (* 1.5 h) 0 "PLATE CONTOUR")
(setq p1 (list (- (car p) (* 2 d)) (- (cadr p) (* 2 h))))
(command "text" "j" "m" p1 h 0 "PT#")
(setq p2 (polar p1 0 (* 1.5 d)))
(command "text" "j" "m" p2 h 0 "X axis")
(setq p3 (polar p2 0 (* 1.5 d)))
(command "text" "j" "m" p3 h 0 "Y axis")
(setq p4 (polar p3 0 (* 1.5 d)))
(command "text" "j" "m" p4 h 0 "NOTES")
(setq k 0)
(foreach pt lstp
(command "text" "j" "m" (polar pt pi 15) h 0 (chr (+ 65 k)))
(setq p11 (polar p1 (- (/ pi 2)) (* 1.5 h (+ 1 k))))
(command "text" "j" "m" p11 h 0 (chr (+ 65 k)))
(setq p22 (polar p11 0 (* 1.5 d)))
(command "text" "j" "m" p22 h 0 (rtos (- (car pt) xc) 2 0))
(setq p33 (polar p22 0 (* 1.5 d)))
(command "text" "j" "m" p33 h 0 (rtos (- (cadr pt) yc) 2 0))
(setq k (1+ k))
)
)
)
(setvar "cecolor" col) 
(setvar "osmode" om )
(setvar "cmdecho" 1)
(command "ucs" "m" pc)
(command "ucsicon" "or")
(prompt"\nxong\n")
(command "Undo" "End")
(princ)
)

Chào bác phamthanhbinh.

Để hoàn thiện sản phẩm do bác viết và để mọi người sử dụng biết về nguồn gốc của LISP, PP đề nghị như sau:

+ Phần đầu có giới thiệu sơ qua mục đích của Lisp, disclaim và copyright của Bác.

+ Cuối Lisp có đoạn code để nhắc lại Lệnh của Lisp để User nhớ sử dụng.

Bác tham khảo 1 Lisp dưới đây để hiểu thêm ý của PP.

 

Góp ý thêm về Lisp trên Bác đã viết:

+ Bảng PLATE CONTOUR được lập ngay từ đầu, khỏi cần phải hỏi gì cả.

+ Kế tiếp là lập bảng HOLES LOCATION sau khi OK với bảng PLATE CONTOUR

+ Vị trí bảng HOLES LOCATION tự động đặt dưới bảng PLATE CONTOUR với khoảng cách 2 x text height.

+ Nếu cần lập bảng BEND LINE POINTS thì cũng tự động đặt dưới bảng HOLES LOCATION với khoảng cách 2 x text height.

+ Nếu được thì nên dùng chiều cao text trong Dim style đang dùng lúc đó để khỏi phải nhập chiều cao text.

Cám ơn Bác nhé. PP.

 

Lisp tham khảo:

;; ============================================================	;;
;;                                                              ;;
;;  ORDY.LSP - This lisp for labeling X,Y coordinates and point ;;
;;	       numbers with standard _DIMORDINATE dimension.   	;;
;;	       All coordinates and point numbers keeps in the 	;;
;;	       text file "Drawing_Name.csv" in a format:     	;;
;;             "point_number, X-coordinate, Y-coordinate, 0".   ;;
;;             The dimension properties is defined by current   ;;
;;             dimension style and variables DIMSCALE, DIMLFAC	;;
;;             and DIMDEC.      				;;
;;                                                          	;;
;; ============================================================	;;
;;                                                            	;;
;;  Command(s) to call: ORDY                          		;;
;;                                                          	;;
;;  Specify point number and insert coordinates labels.		;;
;;                                                            	;;
;; ============================================================	;;
;;                                                             	;;
;;  THIS PROGRAM AND PARTS OF IT MAY REPRODUCED BY ANY METHOD	;;
;;  ON ANY MEDIUM FOR ANY REASON. YOU CAN USE OR MODIFY THIS	;;
;;  PROGRAM OR PARTS OF IT ABSOLUTELY FREE.                 	;;
;;                                                              ;;
;;  THIS PROGRAM PROVIDES THIS PROGRAM 'AS IS' WITH ALL FAULTS	;;
;;  AND SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF		;;
;;  MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.            ;;
;;                                                            	;;
;; ============================================================	;;
;;                                                              ;;
;;  V1.1, 8th Apr 2008, Riga, Latvia                            ;;
;;  © Aleksandr Smirnov (ASMI)                          	;;
;;  For AutoCAD 2000 - 2008 (isn't tested in a next versions)	;;
;;                                                              ;;
;;                                 [url="http://www.asmitools.com"]http://www.asmitools.com[/url]   	;;
;;                                                            	;;
;; ============================================================ ;;


(defun c:ordy(/ fPt oldEcho oldNum dFlc dDec fVar cX cY cNum *error*) 

 (defun *error*(msg) 
   (setvar "CMDECHO" 1)
   (if fVar(close fVar))
   (princ) 
   ); end of *error* 

 (princ(strcat "DIMSCALE="(rtos(getvar "DIMSCALE"))" "
	"DIMLFAC="(rtos(setq dFlc(getvar "DIMLFAC")))" "
	"DIMDEC="(rtos(setq dDec(getvar "DIMDEC")))" "
 ); end strcat
); end princ	
 (setvar "CMDECHO" 0)
 (if(= 0(getvar "USERI3"))(setvar "USERI3" 1)
   ); end if
 (setq cNum(getint(strcat "\nSpecify first point number <"
			(itoa(getvar "USERI3")) ">: ")))
 (if cNum (setvar "USERI3" cNum))
 (setq fVar(open(strcase(strcat(getvar "DWGPREFIX")
			 (getvar "DWGNAME") ".csv")) "a"))
 (while
   (setq fPt
   (getpoint
            (strcat "\nSpecify point or Right-Click to Quit <"
	     (itoa(getvar "USERI3"))">: ")))
     (if(vl-cmdf "_.dimordinate" fPt "_t" 
         (strcat
"["(itoa(getvar "USERI3"))"]" "\\P"
      (setq cX(rtos(* dFlc(car fPt))2 dDec)) " E"  
      "\\X" 
      (setq cY(rtos(* dFlc(cadr fPt))2 dDec)) " N"
      ); end strcat 
         pause 
         ); end vl-cmdf
(progn
  (write-line
    (strcat
      (itoa(getvar "USERI3")) "," cX "," cY "," "0")fVar)
  (setvar "USERI3"(1+(getvar "USERI3")))
  ); end progn
); end if
   ); end while
   (close fVar)
   (setvar "CMDECHO" 1) 
 (princ) 
 ); end of c:ordy

(princ "\n*** Type ORDY to tag coordinates *** ")

  • Vote tăng 3

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.

hôm qua em nhờ các bác viết hộ cái lisp copy or move các đối tượng đó nhưng em không thấy các bác hồi âm.

bác nào giúp được thì reply cho em tý nhé. Em cần gấp lắm

thank

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 bạn pbellh,

Chưa hiểu rõ ý bạn. Bạn nhớ rằng lệnh Scale chỉ cho phép chọn một tâm scale thôi. Vậy bạn muốn scale thế nào?? cần nói rõ hơn bạn nhé vì như bạn nói bạn có một tỷ điểm giao nhau giữa các pline mà.

Chúc bạn vui.

Chào bác phamthanhbinh,ý em muốn nói là các điểm này hoàn toàn độc lập với nhau,chứ ko phải mạng lưới gì cả,mỗi điểm là giao của 2 đoạn pline nhỏ.bây giờ nếu em muốn scale thì phải chọn từng điểm (tức là chọn 2 đường pline ) rồi chọn tâm scale là giao đỉểm 2 pline ,quá trình lặp lại cho tất cả các đỉểm khác.Mục đích của việc scale như vậy là chỉ muốn đường pline dài ra chút,còn điểm giao thì vẵn nằm chỗ cũ.

Bây h tập điểm quá lớn,em muốn hỏi bác có thể viết lisp để mình chỉ cần chọn tâm 1 lần cho 1 phần tử,các phần tử còn lại đều tương tự dc ko ah?

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 bạn minhthuantp,

Để lấy được các mã DXF của một text, bạn sử dụng hàm (setq elst (entget(car(entsel)))) sau đó chọn vào text muốn lấy mã.

Để có được chiều cao của text này bạn sử dụng hàm (setq h (cdr (assoc 40 elst))).

Bạn lưu ý rằng hàm (assoc 40 elst ) trả về một associate list nghĩa là gồm hai phần tử và một dấu chấm ngăn cách giữa hai phần tử này. Trước và sau dấu chấm đều phải có một khoảng trắng.Ví dụ (40 . 0.25)

Việc bạn nói text có chiều cao 0.25 mà mã DXF code 40 của nó là (40 . 0.2) chắc là có nhầm lẫn gì đó chứ không thể như vậy. Còn cái mã DXF (40 .0.25) của bạn là sai vì thiếu một phoảng trắng sau dấu chấm. Do đó nó báo là bad list bạn ạ. Hãy kiểm tra lại nhé.

Chúc bạn thành công.

Vâng cảm ơn anh nhiều! đúng như anh nói giờ thì em đã hiểu rồi! Nhưng anh thấy mọi người mà hỏi vấn đề cơ bản thế này anh có thấy ngại không! Nếu không ngại anh cho em hỏi câu này nữa! Vậy theo anh ở câu lệnh thứ 2 là: (setq h (cdr (assoc 40 elst))). em lại thay bằng: (setq h (nth 1 (assoc 40 elst))). Ý nghĩa của nó đều là lấy phần tử thứ 2 của danh sách vậy tại sao lại không được anh nhỉ ( em thấy nó báo là ; "error: bad list: 2.0") Vì em muốn thay lệnh "Cdr bằng lệnh nth thô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âu lệnh thứ 2 là: (setq h (cdr (assoc 40 elst))). em lại thay bằng: (setq h (nth 1 (assoc 40 elst))). Ý nghĩa của nó đều là lấy phần tử thứ 2 của danh sách vậy tại sao lại không được anh nhỉ ( em thấy nó báo là ; "error: bad list: 2.0") Vì em muốn thay lệnh "Cdr bằng lệnh nth thôi"!

Với dotted pair, ví dụ (setq L '(40 . 2))

- Để lấy phần tử đầu: (car L) -> return 40

- Để lấy phần tử sau: (cdr L) -> return 2

- Không thể dùng (cadr L) hoặc (nth 1 L) như list thông thường được. Còn tại sao thì... miễn bàn! Cú pháp của AutoLisp đã quy định như vậy, chỉ việc áp dụng thôi!

  • Vote tăng 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
Chào bạn Ohay102.

Bạn hãy nói rõ hơn về cách chia lớp của bạn. Các đường chia này nghiêng bao nhiêu độ. Chuẩn bắt đầu chia tính từ đâu???....

Có vậy mới có thể viết líp được bạn ạ.

Chúc bạn vui.

Cam on bac phamthanhbinh

Ve do doc ngieng co the nhap bang tay, con chia lop bat dau tinh tu diem cao nhat cua mien kin, neu phan nay phuc tap qua thi cac bac co the giup viet tu phan xuat ket qua ra bang va file text con phan chia lop thi de lam thu cong cung duoc.

Xin loi vi post tren dien thoai nen khong go dau duoc mong ca nha thong cam

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ác ba dùng đoạn lisp Thiep sưu tầm dùng để tìm và lập lại tất cả các kiểu Text này xem:

(defun repstring (ostring nstring / ss )
(setq ss (ssget "X" (list (cons 0 "INSERT,TEXT,MTEXT,RTEXT,DTEXT,DIMENSION"))))
    (if ss
        (progn
             (repeat (sslength ss)
             (setq ent (ssname ss 0))
             (setq en (entget ent))
             (setq etype (cdr (Assoc 0 en)))
                  (if (= etype "INSERT")
                     (PROGN
                          (IF (ASSOC 66 EN)
                               (PROGN
                               (SETQ SUB1 (ENTNEXT ENT))
                                    (WHILE (= (CDR (ASSOC 0 (ENTGET SUB1))) "ATTRIB")
                                    (SETQ SUBEN (ENTGET SUB1))
                                    (SETQ STG (CDR (aSSOC 1 SUBEN)))
                                    (SETQ STG (vl-string-subst NSTRING OSTRING STG))
                                    (ENTMOD (sUBST (cONS 1 STG) (aSSOC 1 SUBEN) SUBEN))
                                    (SETQ SUB1 (eNTNEXT SUB1))
                                    )
                               (ENTUPD ENT)
                               )
                          )
                     )
                     (PROGN
                     (SETQ STG (CDR (aSSOC 1 EN)))
                     (SETQ STG (vl-string-subst NSTRING OSTRING STG))
                     (ENTMOD (SUBST (CONS 1 STG) (ASSOC 1 EN) EN))
                     )
                  )


             (ssdel ent ss)
             )
        )
    )
)
(defun c:repstring (/ OSTRING NSTRING)
(SETQ OSTRING (GETSTRING T "\nSTRING TO BE REPLACED: "))
(SETQ NSTRING (GETSTRING T "\nSTRING TO REPLACE WITH: "))
(REPSTRING OSTRING NSTRING)
)

Cám ơn bác Thiệp sưu tầm Lisp trên.

Để tự động tìm và thay text, thí dụ tìm thay 2009 thành 2010, PP sửa lại Lisp trên như dưới đây rồi thêm vào cuối 1 Lisp nào đó đang dùng trước khi cần Find & Replace. nó làm việc OK.

(defun repstring (ostring nstring / ss )
(setq ss (ssget "X" (list (cons 0 "INSERT,TEXT,MTEXT,RTEXT,DTEXT,DIMENSION"))))
(if ss
(progn
(repeat (sslength ss)
(setq ent (ssname ss 0))
(setq en (entget ent))
(setq etype (cdr (Assoc 0 en)))
(if (= etype "INSERT")
(PROGN
(IF (ASSOC 66 EN)
(PROGN
(SETQ SUB1 (ENTNEXT ENT))
(WHILE (= (CDR (ASSOC 0 (ENTGET SUB1))) "ATTRIB")
(SETQ SUBEN (ENTGET SUB1))
(SETQ STG (CDR (aSSOC 1 SUBEN)))
(SETQ STG (vl-string-subst NSTRING OSTRING STG))
(ENTMOD (sUBST (cONS 1 STG) (aSSOC 1 SUBEN) SUBEN))
(SETQ SUB1 (eNTNEXT SUB1))
)
(ENTUPD ENT)
)
)
)
(PROGN
(SETQ STG (CDR (aSSOC 1 EN)))
(SETQ STG (vl-string-subst NSTRING OSTRING STG))
(ENTMOD (SUBST (CONS 1 STG) (ASSOC 1 EN) EN))
)
)
(ssdel ent ss)
)
)
)
)
;                                 (defun c:repstring (/ OSTRING NSTRING)
(SETQ OSTRING "2009")
(SETQ NSTRING "2010")
(REPSTRING OSTRING NSTRING)
;                                             )

  • 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 bác phamthanhbinh,ý em muốn nói là các điểm này hoàn toàn độc lập với nhau,chứ ko phải mạng lưới gì cả,mỗi điểm là giao của 2 đoạn pline nhỏ.bây giờ nếu em muốn scale thì phải chọn từng điểm (tức là chọn 2 đường pline ) rồi chọn tâm scale là giao đỉểm 2 pline ,quá trình lặp lại cho tất cả các đỉểm khác.Mục đích của việc scale như vậy là chỉ muốn đường pline dài ra chút,còn điểm giao thì vẵn nằm chỗ cũ.

Bây h tập điểm quá lớn,em muốn hỏi bác có thể viết lisp để mình chỉ cần chọn tâm 1 lần cho 1 phần tử,các phần tử còn lại đều tương tự dc ko ah?

Xin phép anh Bình, ssg giúp bạn ấy 1 tay nhé.

 

@pbelth

Bạn "chơi" thử cái SCI (SCale at Intersections) này xem sao. Cảnh báo: nếu có 1 pline giao với n pline khác, nó sẽ bị scale n lần. Chương trình không kiểm tra việc đó, bạn phải tự chịu trách nhiệm lấy.

 

;;;-------------------------------------------------------------
(defun C:SCI( / ss k p) ;;;SCale at Intersections
(vl-load-com)
(setq
 ss (ssget '((0 . "LINE,LWPOLYLINE")))
 k (getreal "\nScale factor:")
 oldos (getvar "osmode")
)
(setvar "osmode" 0)
(foreach p (intss ss)
   (setq ss (ssget "C" p p '((0 . "LINE,LWPOLYLINE"))))
   (command "scale" ss "" p k)
)
(setvar "osmode" oldos)
(princ)
)
;;;-------------------------------------------------------------
(defun ss2ent (ss / i Le e)
(setq i 0 Le nil)
(repeat (sslength ss) 
   (setq
       e (ssname ss i)
       Le (append Le (list e))
       i (1+ i)
   )
)
Le
)
;;;-------------------------------------------------------------
(defun DelSame(L / Ln x) ;;;Delete Same items in List
(foreach x L (if (not (member x Ln)) (setq Ln (append Ln (list x)))))
Ln
)
;;;;-------------------------------------------------------------
(defun int2e (e1 e2 / obj1 obj2 Li a1)
(setq
   obj1 (vlax-EName->vla-Object e1)
   obj2 (vlax-EName->vla-Object e2)
)
(setq a1 (vlax-Invoke obj1 "IntersectWith" obj2 acExtendNone))
(if a1
   (while a1
       (setq Li (append Li (list (list (car a1) (cadr a1) (caddr a1)))))
       (repeat 3 (setq a1 (cdr a1)))
   )
)
Li
)
;;;-------------------------------------------------------------
(defun intss (ss / L e1 e2 p Lp)
(setq L (ss2ent ss))
(foreach e1 L
   (foreach e2 L (if (setq p (int2e e1 e2)) (setq Lp (append Lp p))))
)
(DelSame Lp)
)
;;;-------------------------------------------------------------

Chỉnh sửa theo ssg
Thêm osmode
  • Vote tăng 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
Xin phép anh Bình, ssg giúp bạn ấy 1 tay nhé.

 

@pbelth

Bạn "chơi" thử cái SCI (SCale at Intersections) này xem sao. Cảnh báo: nếu có 1 pline giao với n pline khác, nó sẽ bị scale n lần. Chương trình không kiểm tra việc đó, bạn phải tự chịu trách nhiệm lấy.

 

;;;-------------------------------------------------------------
(defun C:SCI( / ss k p) ;;;SCale at Intersections
(vl-load-com)
(setq
 ss (ssget '((0 . "LINE,LWPOLYLINE")))
 k (getreal "\nScale factor:")
 oldos (getvar "osmode")
)
(setvar "osmode" 0)
(foreach p (intss ss)
   (setq ss (ssget "C" p p '((0 . "LINE,LWPOLYLINE"))))
   (command "scale" ss "" p k)
)
(setvar "osmode" oldos)
(princ)
)
;;;-------------------------------------------------------------
(defun ss2ent (ss / i Le e)
(setq i 0 Le nil)
(repeat (sslength ss) 
   (setq
       e (ssname ss i)
       Le (append Le (list e))
       i (1+ i)
   )
)
Le
)
;;;-------------------------------------------------------------;
(defun DelSame(L / Ln x) ;;;Delete Same items in List
(foreach x L (if (not (member x Ln)) (setq Ln (append Ln (list x)))))
Ln
)
;;;;-------------------------------------------------------------;
(defun int2e (e1 e2 / obj1 obj2 Li a1)
(setq
   obj1 (vlax-EName->vla-Object e1)
   obj2 (vlax-EName->vla-Object e2)
)
(setq a1 (vlax-Invoke obj1 "IntersectWith" obj2 acExtendNone))
(if a1
   (while a1
       (setq Li (append Li (list (list (car a1) (cadr a1) (caddr a1)))))
       (repeat 3 (setq a1 (cdr a1)))
   )
)
Li
)
;;;-------------------------------------------------------------;;
(defun intss (ss / L e1 e2 p Lp)
(setq L (ss2ent ss))
(foreach e1 L
   (foreach e2 L (if (setq p (int2e e1 e2)) (setq Lp (append Lp p))))
)
(DelSame Lp)
)
;;;-------------------------------------------------------------

Chào bác SSG, Thiep xin góp 1 lisp khác theo hướng sử dụng hàm acet-geom-intersectwith trong expresstool

;| Lisp scale *LINEs with basepoint at the intersect points
  12/2009
  Require: install Expess tool
---------------------------------------------------------|;
(defun SS-enlst	(ss / c L)
 (setq c -1)
 (repeat (sslength ss)
   (setq L (cons (ssname ss (setq c (1+ c))) L))
 )
 (reverse L)
)
;;;-----------------------
(defun c:scL (/ ss Len1 Len2 po Lpo ok)
 (acet-sysvar-set
   (list "cmdecho" 0 "osmode" 32)
 )
 (prompt "\nSelect LINES or POLYLINES or LWPOLYLINES")
 (Setq	ss   (ssget '((0 . "*LINE")))
Len1 (SS-enlst ss)
Len2 (cdr Len1)
 )
 (setq	sc (cond (sc)
	 (2)
   )
 )
 (setq oldsc sc)
 (setq	sc (getreal (strcat "\nEnter a Scale Factor <"
			   (rtos oldsc 2 1)
			   "> : "

		   )
	  )
 )
 (if (null sc)
   (setq sc oldsc)
 )
 (foreach en1 Len1
   (foreach en2 Len2
     (if (setq po (acet-geom-intersectwith en1 en2 0))
(setq Lpo (cons (car po) Lpo))
     )
   )
   (setq Len2 (cdr Len2))
 )
 (foreach pin Lpo
   (Setq ss   (ssget "_C" pin pin '((0 . "*LINE")))
  Len3 (SS-enlst ss)
  n 0
   )
   (repeat (sslength ss)
     (vla-ScaleEntity
(vlax-ename->vla-object (ssname ss n))
(vlax-3d-point pin)
sc
     )
     (setq n (1+ n))
   )
 )
 (acet-sysvar-restore)
 (vla-put-Comments
   (vla-get-SummaryInfo
     (vla-get-ActiveDocument
(vlax-get-acad-object)
     )
   )
   (setq ok "Thank you for use scL.lsp! THIEP 0918841230")
 )
 (princ ok)
)

Tip: nếu có 1 pline giao với n pline khác, nó sẽ bị scale n lần. Chương trình không kiểm tra việc đó, bạn phải tự chịu trách nhiệm lấy. SSG

  • Vote tăng 4

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 bác SSG, Thiep xin góp 1 lisp khác theo hướng sử dụng hàm acet-geom-intersectwith trong expresstool

;| Lisp scale *LINEs with basepoint at the intersect points
  12/2009
  Require: install Expess tool
---------------------------------------------------------|;
(defun SS-enlst	(ss / c L)
 (setq c -1)
 (repeat (sslength ss)
   (setq L (cons (ssname ss (setq c (1+ c))) L))
 )
 (reverse L)
)
;;;-----------------------
(defun c:scL (/ ss Len1 Len2 po Lpo ok)
 (acet-sysvar-set
   (list "cmdecho" 0 "osmode" 32)
 )
 (prompt "\nSelect LINES or POLYLINES or LWPOLYLINES")
 (Setq	ss   (ssget '((0 . "*LINE")))
Len1 (SS-enlst ss)
Len2 (cdr Len1)
 )
 (setq	sc (cond (sc)
	 (2)
   )
 )
 (setq oldsc sc)
 (setq	sc (getreal (strcat "\nEnter a Scale Factor <"
			   (rtos oldsc 2 1)
			   "> : "

		   )
	  )
 )
 (if (null sc)
   (setq sc oldsc)
 )
 (foreach en1 Len1
   (foreach en2 Len2
     (if (setq po (acet-geom-intersectwith en1 en2 0))
(setq Lpo (cons (car po) Lpo))
     )
   )
   (setq Len2 (cdr Len2))
 )
 (foreach pin Lpo
   (Setq ss   (ssget "_C" pin pin '((0 . "*LINE")))
  Len3 (SS-enlst ss)
  n 0
   )
   (repeat (sslength ss)
     (vla-ScaleEntity
(vlax-ename->vla-object (ssname ss n))
(vlax-3d-point pin)
sc
     )
     (setq n (1+ n))
   )
 )
 (acet-sysvar-restore)
 (vla-put-Comments
   (vla-get-SummaryInfo
     (vla-get-ActiveDocument
(vlax-get-acad-object)
     )
   )
   (setq ok "Thank you for use scL.lsp! THIEP 0918841230")
 )
 (princ ok)
)

Tip: nếu có 1 pline giao với n pline khác, nó sẽ bị scale n lần. Chương trình không kiểm tra việc đó, bạn phải tự chịu trách nhiệm lấy. SSG

Vô cùng cảm ơn bác SSG và bác thiep đã bỏ công ra giúp em.Chúc 2 bác năm mới nhiều sức khỏe và niềm vui

Cảm ơn anh binh đã quan tâm bài viết của em

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ô cùng cảm ơn bác SSG và bác thiep đã bỏ công ra giúp em.Chúc 2 bác năm mới nhiều sức khỏe và niềm vui

Cảm ơn anh binh đã quan tâm bài viết của em

Vừa hay, Tue_NV cũng vừa viết xong code theo ý của bạn pbellh, xin post lên luôn :

(defun c:scpl(/ sc i ss ssa ob1 ob2 lst lis j ins)
;copyright by Tue_NV
 (vl-load-com)
 (setvar "cmdecho" 0)
 (command "undo" "be")
 (setq ss (ssget '((0 . "*LINE"))) i 0 ssa (list) lst (list) )
 (if (not sco) (setq sco 1.0))
 (setq sc (getdist (strcat "\n He so scale  :")))
 (if (not sc) (setq sc sco) (setq sco sc))

 (while (    (setq ssa (cons (vlax-ename->vla-object (ssname ss i)) ssa))
   (setq i (1+ i))
 )
 (reverse ssa) (setq i 0)
 (while (    (setq ob1 (nth i ssa) j 0)
     (while (setq ob2 (nth j ssa))
(if (= (length (setq ins (vlax-invoke ob1 'intersectwith ob2 0))) 3)
   (progn
      (command "scale" (vlax-vla-object->ename ob1)
		       (vlax-vla-object->ename ob2) ""
			ins (sqrt sc)
      )
   ) 
)
	(setq j (1+ j))
     )
   (setq i (1+ i))
 );while
 (command "undo" "end")
 (princ)
)

  • Vote tăng 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

Chào các bác!

nhờ các bác viết hộ út cái lisp này với.

Rải các block có sẵn trên 1 polyline tại các pont của polyline.

Có nghĩa là nó giống lệnh mesure nhưng mà chỉ đặt các block tại các pont của polyline thôi. út cảm ơn trưóc nha!

file cad: http://www.cadviet.com/upfiles/2/thu_3.dwg

To Bác Tuệ_NV: Cảm ơn bác đã giúp đỡ út cái lisp giản các text, như thế cũng tốt lắm rồi bác ạ. Chúc bác sức khoẻ!

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!

nhờ các bác viết hộ út cái lisp này với.

Rải các block có sẵn trên 1 polyline tại các pont của polyline.

Có nghĩa là nó giống lệnh mesure nhưng mà chỉ đặt các block tại các pont của polyline thôi. út cảm ơn trưóc nha!

file cad: http://www.cadviet.com/upfiles/2/thu_3.dwg

To Bác Tuệ_NV: Cảm ơn bác đã giúp đỡ út cái lisp giản các text, như thế cũng tốt lắm rồi bác ạ. Chúc bác sức khoẻ!

Út có thể đọc bài viết này của Tue_NV và áp dụng vào trong trường hợp của mình :

Lisp tdien - Bai viet so 4

 

Hy vọng Út làm thành công :(

  • 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âng cảm ơn anh nhiều! đúng như anh nói giờ thì em đã hiểu rồi! Nhưng anh thấy mọi người mà hỏi vấn đề cơ bản thế này anh có thấy ngại không! Nếu không ngại anh cho em hỏi câu này nữa! Vậy theo anh ở câu lệnh thứ 2 là: (setq h (cdr (assoc 40 elst))). em lại thay bằng: (setq h (nth 1 (assoc 40 elst))). Ý nghĩa của nó đều là lấy phần tử thứ 2 của danh sách vậy tại sao lại không được anh nhỉ ( em thấy nó báo là ; "error: bad list: 2.0") Vì em muốn thay lệnh "Cdr bằng lệnh nth thôi"!

Chào bạn minhthuantp,

Bác SSG đã giải thích rồi, mình chỉ xin nói thêm là các list có chứa cái dot pair này là các list đặc biệt được gọi là associate list. Nó cho phép sử dụng với hàm assoc. Các list thông thường sẽ không dùng với hàm assoc được. Và như bạn thấy, với loại list này, không sự dụng hàm nth được bạn ạ.

Bạn nhớ thêm rằng hàm cdr không phải là lấy phần tử thứ hai dâu nhé mà là lấy một list chứa các phần tử từ phần tử thứ hai của một list tới phần tử cuối cùng của list đó.

Nếu bạn muốn lấy chỉ duy nhất phần tử thứ hai của một list thì phải dùng hàm cadr bạn nhé. Ví dụ: (cadr (10 . 9.0 8.0 2.0) ) sẽ trả về 9.0 , còn hàm (cdr (10 . 9.0 8.0 2.0) sẽ trả về (9.0 8.0 2.0) bạn ạ.

Chúc bạn sớm trở thành một lispman nha.

  • 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 bạn minhthuantp,

Bác SSG đã giải thích rồi, mình chỉ xin nói thêm là các list có chứa cái dot pair này là các list đặc biệt được gọi là associate list. Nó cho phép sử dụng với hàm assoc. Các list thông thường sẽ không dùng với hàm assoc được. Và như bạn thấy, với loại list này, không sự dụng hàm nth được bạn ạ.

Bạn nhớ thêm rằng hàm cdr không phải là lấy phần tử thứ hai dâu nhé mà là lấy một list chứa các phần tử từ phần tử thứ hai của một list tới phần tử cuối cùng của list đó.

Nếu bạn muốn lấy chỉ duy nhất phần tử thứ hai của một list thì phải dùng hàm cadr bạn nhé. Ví dụ: (cadr (10 . 9.0 8.0 2.0) ) sẽ trả về 9.0 , còn hàm (cdr (10 . 9.0 8.0 2.0) sẽ trả về (9.0 8.0 2.0) bạn ạ.

Chúc bạn sớm trở thành một lispman nha.

Chào bác PhamThanhBinh

Chổ này bác viết không đúng

(cadr (10 . 9.0 8.0 2.0) ) sẽ trả về 9.0

-> phải viết như thế này : (cadr '(10 9.0 8.0 2.0) ) sẽ trả về 9.0

 

(cdr (10 . 9.0 8.0 2.0) sẽ trả về (9.0 8.0 2.0)

-> phải viết như thế này : (cdr '(10 9.0 8.0 2.0)) sẽ trả về (9.0 8.0 2.0)

 

Dotted pair : danh sách cặp với dấu chấm, là một kiểu list đặc biệt gồm 2 thành phần, được ngăn cách bởi 1 dấu chấm (chú ý: có ít nhất 1 dấu cách giữa dấu chấm với các thành phần). Ví dụ: (2 . “a”)

 

"các list có chứa cái dot pair này là các list đặc biệt được gọi là associate list. Nó cho phép sử dụng với hàm assoc. Các list thông thường sẽ không dùng với hàm assoc được."

-> Bác nói vậy thì ngoại trừ Dotted pair, các list thông thường sẽ không sử dụng với hàm assoc hay sao? Tue_NV thấy chưa đúng lắm. Bác xem lại chổ này tí nhé

  • 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 bác PhamThanhBinh

Chổ này bác viết không đúng

(cadr (10 . 9.0 8.0 2.0) ) sẽ trả về 9.0

-> phải viết như thế này : (cadr '(10 9.0 8.0 2.0) ) sẽ trả về 9.0

 

(cdr (10 . 9.0 8.0 2.0) sẽ trả về (9.0 8.0 2.0)

-> phải viết như thế này : (cdr '(10 9.0 8.0 2.0)) sẽ trả về (9.0 8.0 2.0)

 

Dotted pair : danh sách cặp với dấu chấm, là một kiểu list đặc biệt gồm 2 thành phần, được ngăn cách bởi 1 dấu chấm (chú ý: có ít nhất 1 dấu cách giữa dấu chấm với các thành phần). Ví dụ: (2 . “a”)

 

"các list có chứa cái dot pair này là các list đặc biệt được gọi là associate list. Nó cho phép sử dụng với hàm assoc. Các list thông thường sẽ không dùng với hàm assoc được."

-> Bác nói vậy thì ngoại trừ Dotted pair, các list thông thường sẽ không sử dụng với hàm assoc hay sao? Tue_NV thấy chưa đúng lắm. Bác xem lại chổ này tí nhé

Chào bác Tue_nv và xin lỗi bạn minhthuantp,

Đúng là mình có sai sót khi lấy ví dụ vế hàm cadr và hàm car vì thiếu dấu quote ' trước associate list (10. 9.0 8.0 2.0). Điều này do thiếu cẩn thận khi post bài, mình xin rút kinh nghiệm cho lần sau, mong bác và các bạn thông cảm.

Tuy nhiên về lý thuyết mình xin gửi bản gốc để bác tue_Nv và bạn minhthuantp tham khảo:

 

assoc Function

Searches an association list for an element and returns that association list entry

(assoc element alist)

 

Arguments

element

Key of an element in an association list.

 

alist

An association list to be searched.

 

Return Values

The alist entry, if successful. If assoc does not find element as a key in alist, it returns nil.

 

Associated List

An associated list is a list that has a value associated with it. The assocation and the data are seperated by a period. eg. (1 . 455) (34 . "Sanders") You can find "Sanders" by looking up group code 34.

 

Chúc bác Tue_NV và bạn minhthuantp một năm mới thành công.

  • 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
Cam on bac phamthanhbinh

Ve do doc ngieng co the nhap bang tay, con chia lop bat dau tinh tu diem cao nhat cua mien kin, neu phan nay phuc tap qua thi cac bac co the giup viet tu phan xuat ket qua ra bang va file text con phan chia lop thi de lam thu cong cung duoc.

Xin loi vi post tren dien thoai nen khong go dau duoc mong ca nha thong cam

Chào bạn ohay102,

Bạn có thể post một file bản vẽ dwg mẫu định làm và file hiển thị kết quả mong muốn được không? Ví mình không phải có chuyên môn như bạn nên việc tạo ra một bản vẽ mẫu sợ không đúng với cái bạn cần.

Yêu cầu của bạn theo mình là lisp có thể giải quyết được 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
Chào bạn minhthuantp,

Bác SSG đã giải thích rồi, mình chỉ xin nói thêm là các list có chứa cái dot pair này là các list đặc biệt được gọi là associate list. Nó cho phép sử dụng với hàm assoc. Các list thông thường sẽ không dùng với hàm assoc được. Và như bạn thấy, với loại list này, không sự dụng hàm nth được bạn ạ.

Bạn nhớ thêm rằng hàm cdr không phải là lấy phần tử thứ hai dâu nhé mà là lấy một list chứa các phần tử từ phần tử thứ hai của một list tới phần tử cuối cùng của list đó.

Nếu bạn muốn lấy chỉ duy nhất phần tử thứ hai của một list thì phải dùng hàm cadr bạn nhé. Ví dụ: (cadr (10 . 9.0 8.0 2.0) ) sẽ trả về 9.0 , còn hàm (cdr (10 . 9.0 8.0 2.0) sẽ trả về (9.0 8.0 2.0) bạn ạ.

Chúc bạn sớm trở thành một lispman nha.

Chào bác PhamThanhBinh

Em thấy dòng bác viết có 1 dấu chấm sau số 10. Cái này là không thể có được bác ạ.

(cadr (10 . 9.0 8.0 2.0) ) -> Không tthể có List như thế này (10 . 9.0 8.0 2.0)

 

Cái nữa em chưa đồng tình với bác ở quan điểm này :

mình chỉ xin nói thêm là các list có chứa cái dot pair này là các list đặc biệt được gọi là associate list. Nó cho phép sử dụng với hàm assoc. Các list thông thường sẽ không dùng với hàm assoc được.

-> Bác nói vậy thì ngoại trừ Dotted pair, các list thông thường sẽ không sử dụng với hàm assoc ? Tue_NV thấy chưa đồng tình ở quan điểm này lắm. vì như List này vẫn có thể sử dụng hàm assoc được

((10 2) (9 3))

hay ((10 (9 8 7)) (9 (7 8 9)))

2 cái List này đâu phải là dotted pair ?

 

Cảm ơn vì lời chúc của bác. Và em cũng chúc bác sức khoẻ

Cảm ơn bá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ạn trong diễn đàn Cadviet

Mình có một khó khăn nhỏ mong các bạn giúp đỡ. Khó khăn là mình muốn copy một block attribute sao cho các con số tăng dần theo một cấp số cộng n nào đó

Mình cảm ơn trước nha

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 bác PhamThanhBinh

Em thấy dòng bác viết có 1 dấu chấm sau số 10. Cái này là không thể có được bác ạ.

(cadr (10 . 9.0 8.0 2.0) ) -> Không tthể có List như thế này (10 . 9.0 8.0 2.0)

 

Cái nữa em chưa đồng tình với bác ở quan điểm này :

mình chỉ xin nói thêm là các list có chứa cái dot pair này là các list đặc biệt được gọi là associate list. Nó cho phép sử dụng với hàm assoc. Các list thông thường sẽ không dùng với hàm assoc được.

-> Bác nói vậy thì ngoại trừ Dotted pair, các list thông thường sẽ không sử dụng với hàm assoc ? Tue_NV thấy chưa đồng tình ở quan điểm này lắm. vì như List này vẫn có thể sử dụng hàm assoc được

((10 2) (9 3))

hay ((10 (9 8 7)) (9 (7 8 9)))

2 cái List này đâu phải là dotted pair ?

 

Cảm ơn vì lời chúc của bác. Và em cũng chúc bác sức khoẻ

Cảm ơn bác

Chào bác Tue_NV,

Đúng như bác nói, vì mình chỉ học mót từ Help nên kiến thức nó lôm côm lắm, có cái mình hiểu đúng nhưng cũng có cái mình hiểu sai, vì vậy mình mới post cái bản gốc tiếng Anh lên để mọi người xem giùm.

Mình cũng đã thử cái associated list với nhiều hơn hai phần tử thì không được mà chả hiểu tại sao. Theo bản gốc tiếng anh thì định nghĩa của associated list chỉ cần có 1 phần tử tương tác (association) và một dữ lịêu tương tác (the data) được ngăn cách bởi dấu chấm (dotted pair). Nhưng cái dữ liệu này ra sao thì mình chưa rõ lắm. Nó có thể là một list hay không (tức là nhiều phần tử đó)????

Cũng theo định nghĩa về hàm assoc thì cái list mà mình tìm kiếm trong đó (alist ) là một association list , nó có phải là associated list hay không ???

Hề hề hề, cái dốt nó nằm ở chỗ này bác ạ, vì thế mình mới hiểu nó lôm côm, mong bác đừng giận.

Rất cám ơn bác đã chỉ cho mình những chỗ mà mình còn đang ngớ ngẩn bác à.

Thực tế trong quá trình mót , mình copy của mọi người là nhiều chứ còn hiểu cho thật cặn kẽ thì chưa nên cái sai sót là tất yếu. Đó cũng là lý do để mình tham gia vào topic này hòng mót được nhiều hơn mà bác. Đừng giận mình khi mình có những cái sai ngớ ngẫn như vậy.

Chào bác và chúc bác luôn mạnh khỏe.

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ách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×