Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

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


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#601 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 December 2009 - 11:11 AM

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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#602 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 December 2009 - 11:39 AM

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:
Hình đã gửi
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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#603 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 25 December 2009 - 11:42 AM

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

  • 2

#604 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 25 December 2009 - 11:43 AM

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.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#605 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 25 December 2009 - 12:27 PM

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

  • 3

#606 muoild

muoild

    Chưa sử dụng CAD

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

Đã gửi 25 December 2009 - 01:24 PM

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

#607 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 25 December 2009 - 02:45 PM

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?
  • 0

#608 minhthuantp

minhthuantp

    biết pan

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

Đã gửi 25 December 2009 - 07:36 PM

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"!
  • 0

#609 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 25 December 2009 - 10:23 PM

ở 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!
  • 2

#610 ohay102

ohay102

    biết pan

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

Đã gửi 25 December 2009 - 10:26 PM

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

#611 Phiphi-

Phiphi-

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 434 Bài viết
Điểm đánh giá: 175 (tàm tạm)

Đã gửi 25 December 2009 - 10:39 PM

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

  • 1

#612 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 25 December 2009 - 10:48 PM

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

Bài viết đã được chỉnh sửa nội dung bởi ssg: 25 December 2009 - 11:00 PM
Thêm osmode

  • 2

#613 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 26 December 2009 - 10:08 AM

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

#614 pbellh

pbellh

    biết zoom

  • Members
  • Pip
  • 11 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 26 December 2009 - 11:05 AM

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

#615 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 26 December 2009 - 01:33 PM

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 <" (rtos sco 2 2) "> :")))
(if (not sc) (setq sc sco) (setq sco sc))

(while (< i (sslength ss))
(setq ssa (cons (vlax-ename->vla-object (ssname ss i)) ssa))
(setq i (1+ i))
)
(reverse ssa) (setq i 0)
(while (< i (length ssa))
(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)
)

  • 2

#616 ut_cung

ut_cung

    biết vẽ line

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

Đã gửi 26 December 2009 - 01:55 PM

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.c...les/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ẻ!
  • 0

#617 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 26 December 2009 - 02:23 PM

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.c...les/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 :(
  • 1

#618 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 27 December 2009 - 07:36 PM

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

#619 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 27 December 2009 - 08:26 PM

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é
  • 1

#620 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 27 December 2009 - 09:08 PM

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