Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

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

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

Các bác ơi, cho hỏi tí: tôi nhớ mang máng là có hàm kiểm tra xem điểm pt có nằm trên curve hay không, mà sao giờ quên mất. Bác nào biết xin chỉ giùm: hoặc là tên hàm, hoặc là phương thức kiểm tra. Thanks!

Bác có thể kiểm tra equal point và vlax-curve-getClosestPointTo hoặc dùng mẹo SSget qua điểm pt

  • 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

bác kiểm tra khoảng cách từ điểm đó đến Curve. cụ thể: (vlax-curve-getClosestPointTo (car(entsel)) (princ (getpoint)))

Sax! diễn đàn bị sao thế nhỉ. Ketxu xóa giúp tớ 1 bài 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

Các bác cho mình hỏi. có cách nào để biết 1 textstyle đang sử dụng font của bảng mã Unicode không?

hoặc đơn giản hơn, kiểm tra 1 chuỗi xem chuỗi đó có được viết bằng mã unicode hay không. (mình làm bằng cách củ chuối (wcmatch string "*\U+*") nhưng cũng không được. chưa biết vì sao nó cứ trả về 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

Các bác cho mình hỏi. có cách nào để biết 1 textstyle đang sử dụng font của bảng mã Unicode không?

hoặc đơn giản hơn, kiểm tra 1 chuỗi xem chuỗi đó có được viết bằng mã unicode hay không. (mình làm bằng cách củ chuối (wcmatch string "*\U+*") nhưng cũng không được. chưa biết vì sao nó cứ trả về nil.

 

Gởi cái này tôi mót được để bác tham khảo xem có giúp ích gì được không.

; VxGetTextStyles - Returns a list of all text style names and her font files
; Copyright: ©2001 MENZI ENGINEERING GmbH, Switzerland
; Arguments [Type]:
; None
; Return [Type]:
; > Dotted pair list '(("StyleName" . "FontFile")...) [list]
; Notes:
; - None
(defun VxGetTextStyles ( / StyLst)
(or Gb:AcO (setq Gb:AcO (vlax-get-acad-object)))
(or Gb:AcD (setq Gb:AcD (vla-get-ActiveDocument Gb:AcO)))
(vlax-for Sty (vla-get-TextStyles Gb:AcD) (setq StyLst (cons (cons (vla-get-Name Sty) (vla-get-FontFile Sty)) StyLst)))
(reverse StyLst))

  • 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

Cảm ơn bác, nhưng hàm của bác nó chỉ trả về list danh sách các textstyle và font tương ứng. không rõ font nào là unicode.

Mình vừa làm được rồi, tuy hơi củ chuối tý vìchỉ nhận biết các font hay dùng: arial. tahoma và times new roman. cũng tạm chấp nhận được.

(wcmatch (cdr (assoc 3 (entget (tblobjname "style" (cdr (assoc 7 (entget (car (entsel "chon text"))))))))) "ARIAL*,TAHOMA*,TIMES*")

Bác nào có cao kiến gì hay hơn thì cứ post nhé. mình hơi khó tính, hề hề

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á. mình quên mất là có 2 dạng. cái mình cần là add kiểu Wbock đó. tiện thể nếu được cả 2 dạng thì càng tốt. chắc rồi sẽ có lúc phải dù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

Mình đang cần gộp 2 nhóm đối tượng với nhau theo sách dạy thì:

b. Hàm (ssadd...)

CHỨC NĂNG: Thêm một đối tượng vào tập đối tượng

CÚ PHÁP:

(
ssadd
[ename] [ss])

GIẢI THÍCH:

ename: Chuỗi ký tự chứa tên mã đối tượng cần thêm vào, nếu đối tượng ename đã có trong tập đối tượng, không thêm vào được nữa

ss: Tên tập đối tượng

Nếu cả 2 tham số này không có, sẽ trả ra một tập rỗng

Nếu ename khác nil tập đối tượng là nil, hàm sẽ trả ra một tập đối tượng chỉ có một phần tử là ename đã cho

Nếu cả 2 đều khác nil, hàm sẽ trả ra tập đối tượng có thêm phần tử ename vừa thêm vào

 

Mình viết thử đoạn sau:

(defun c:themthu ( )
 (Prompt "\nchon doi tuong goc")
 (Setq dtgoc (Ssget))
 (Prompt "\nchon doi tuong them")
 (Setq dtthem (Ssget))
(ssadd [dtthem] [dtgoc])
 (setq a (getpoint "\nChon diem chuan: "))
 (setq b (getpoint a"\nCopy den diem: "))
 (command ".move" dtgoc "" a B)
(Princ)
)

Nhưng lỗi, các bác gở rối giúp với!

-Trường hợp cụ thể mình đang cần thì chỉ cần thêm đối tượng vừa được tạo ra ào nhóm đối tượng sẳn có 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

Mình đang cần gộp 2 nhóm đối tượng với nhau theo sách dạy thì:

b. Hàm (ssadd...)

CHỨC NĂNG: Thêm một đối tượng vào tập đối tượng

CÚ PHÁP:

(
ssadd
[ename] [ss])

GIẢI THÍCH:

ename: Chuỗi ký tự chứa tên mã đối tượng cần thêm vào, nếu đối tượng ename đã có trong tập đối tượng, không thêm vào được nữa

ss: Tên tập đối tượng

Nếu cả 2 tham số này không có, sẽ trả ra một tập rỗng

Nếu ename khác nil tập đối tượng là nil, hàm sẽ trả ra một tập đối tượng chỉ có một phần tử là ename đã cho

Nếu cả 2 đều khác nil, hàm sẽ trả ra tập đối tượng có thêm phần tử ename vừa thêm vào

 

Mình viết thử đoạn sau:

(defun c:themthu ( )
 (Prompt "\nchon doi tuong goc")
 (Setq dtgoc (Ssget))
 (Prompt "\nchon doi tuong them")
 (Setq dtthem (Ssget))
(ssadd [dtthem] [dtgoc])
 (setq a (getpoint "\nChon diem chuan: "))
 (setq b (getpoint a"\nCopy den diem: "))
 (command ".move" dtgoc "" a B)
(Princ)
)

Nhưng lỗi, các bác gở rối giúp với!

-Trường hợp cụ thể mình đang cần thì chỉ cần thêm đối tượng vừa được tạo ra ào nhóm đối tượng sẳn có thôi
.

 

 

 

Bác Duy nhầm ở 2 chỗ. Cần sửa lại như vầy.

(Setq dtthem (cdr (assoc -1 (entget (ssname (Ssget) 0))))) hoặc (Setq dtthem (car (entsel)))

(ssadd dtthem dtgoc)
  • 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

do hàm ssget trả về là tập hợp selection set chứ không phải là ename hay tập hợp ename bác Duy ạ. mà đối tượng thêm của bác phải là ename

  • 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

Mình đang cần gộp 2 nhóm đối tượng với nhau theo sách dạy thì:

b. Hàm (ssadd...)

CHỨC NĂNG: Thêm một đối tượng vào tập đối tượng

CÚ PHÁP:

(
ssadd
[ename] [ss])

GIẢI THÍCH:

ename: Chuỗi ký tự chứa tên mã đối tượng cần thêm vào, nếu đối tượng ename đã có trong tập đối tượng, không thêm vào được nữa

ss: Tên tập đối tượng

Nếu cả 2 tham số này không có, sẽ trả ra một tập rỗng

Nếu ename khác nil tập đối tượng là nil, hàm sẽ trả ra một tập đối tượng chỉ có một phần tử là ename đã cho

Nếu cả 2 đều khác nil, hàm sẽ trả ra tập đối tượng có thêm phần tử ename vừa thêm vào

 

Mình viết thử đoạn sau:

(defun c:themthu ( )
 (Prompt "\nchon doi tuong goc")
 (Setq dtgoc (Ssget))
 (Prompt "\nchon doi tuong them")
 (Setq dtthem (Ssget))
(ssadd [dtthem] [dtgoc])
 (setq a (getpoint "\nChon diem chuan: "))
 (setq b (getpoint a"\nCopy den diem: "))
 (command ".move" dtgoc "" a B)
(Princ)
)

Nhưng lỗi, các bác gở rối giúp với!

-Trường hợp cụ thể mình đang cần thì chỉ cần thêm đối tượng vừa được tạo ra ào nhóm đối tượng sẳn có thôi
.

 

 

 

Hế hề hề,

Cái lỗi chính là ở hàm (ssadd ....) bác ạ.

Hàm này cho thêm đối tượng (chứ không phải tập chọn) vào tập chọn cho trước. Bác dùng nó để nhét một tập chọn vào một tập chọn khác nên nó quậy thôi.

Cách sửa như bác DoanvanHa ở trường hợp thứ nhất sẽ chỉ nhét một thằng đầu tiên của tập chọn mới vào tập chọn cũ.

Trên diễn đàn đã có lisp dùng để "cộng " " trừ" các tập chọn với nhau rồi đấy bác ạ. Nếu bác muốn xài thì hoàn toàn có thể dùng được vào yêu cầu của bác.

Hề hề hề, chúc bác vui.

 

  • 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

Mình đang cần gộp 2 nhóm đối tượng với nhau theo sách dạy thì:

b. Hàm (ssadd...)

CHỨC NĂNG: Thêm một đối tượng vào tập đối tượng

CÚ PHÁP:

(
ssadd
[ename] [ss])

GIẢI THÍCH:

ename: Chuỗi ký tự chứa tên mã đối tượng cần thêm vào, nếu đối tượng ename đã có trong tập đối tượng, không thêm vào được nữa

ss: Tên tập đối tượng

Nếu cả 2 tham số này không có, sẽ trả ra một tập rỗng

Nếu ename khác nil tập đối tượng là nil, hàm sẽ trả ra một tập đối tượng chỉ có một phần tử là ename đã cho

Nếu cả 2 đều khác nil, hàm sẽ trả ra tập đối tượng có thêm phần tử ename vừa thêm vào

 

Mình viết thử đoạn sau:

(defun c:themthu ( )
 (Prompt "\nchon doi tuong goc")
 (Setq dtgoc (Ssget))
 (Prompt "\nchon doi tuong them")
 (Setq dtthem (Ssget))
(ssadd [dtthem] [dtgoc])
 (setq a (getpoint "\nChon diem chuan: "))
 (setq b (getpoint a"\nCopy den diem: "))
 (command ".move" dtgoc "" a B)
(Princ)
)

Nhưng lỗi, các bác gở rối giúp với!

-Trường hợp cụ thể mình đang cần thì chỉ cần thêm đối tượng vừa được tạo ra ào nhóm đối tượng sẳn có thôi
.

Có nhiều cách lắm anh à!

Dùng (command "select" ...) cũng là 1 cách.

 

(Prompt "\nchon doi tuong goc")

(Setq dtgoc (Ssget))

(Prompt "\nchon doi tuong them")

(Setq dtthem (Ssget))

 

(command "select" dtgoc dtthem "")

(if dtthem (setq dtgoc (ssget "P")))

 

Lưu ý : Anh nên giải phóng biến
dtgoc dtthem và các biến cục bộ khác
khi chương trình 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

ờ há. mình quên mất là có 2 dạng. cái mình cần là add kiểu Wbock đó. tiện thể nếu được cả 2 dạng thì càng tốt. chắc rồi sẽ có lúc phải dùng.

Ơ, em nhớ là method insertBlock có dạng (vla-InsertBlock mspace ip thename xscale yscale zscale rot) và thename trong đó có thể là tên Block trong file hiện tại, hoặc tên 1 file khác mà 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

Nếu xài Vla method

Oh, Tại mình cứ dò dẫm mấy đầu vla-add.. với vla-put.. mà không để ý còn vla-insert.. Thanks sếp hehe

Nếu xài vla method, các bác có thể tham khảo trong đây :

http://www.afralisp.net/archive/methods/methods_ref.htm

  • 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

Mình tìm thấy đoạn code này của Ketxu ở topic này

(vla-getinterfaceobject (vlax-get-acad-object) (strcat "AutoCAD.AcCmColor." (substr (getvar "acadver") 1 2)))

thấy cái interfaceObject này lạ lạ nên copy về mò mẫm nhưng chỉ thu được ít ỏi thông tin thế này.

22980_interface.jpg

Ketxu hay bác nào rành về thằng interfaceObject này cho mình xin tí thông tin về nó với

- nó là cái gì?

- ta có thể thu được thông tin gì từ nó?

- hàm trên của ketxu lấy được thông tin gì vây?

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

Em cũng không rành, k biết trong tin học nó gọi là gì ^^ Bác nghiên cứu bài quote này nhé :

http://www.theswamp....12791#msg412791

 

Hàm trên thu về "Object" AutoCAD AcCmColor Interface , do trong Property của Multileader các màu sử dụng ở dạng AutoCAD Index Colour.

=> Code copy paste thật là rối rắm quá đi ^^

  • 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

mình cũng mò mẫm topic ấy cả tối nhưng chẳng thu được gì. Cũng bởi chữ "Interface" mà lại lấy từ acad-object nên mình đoán có thể nó liên quan gì đó đến giao diện của autocad nên rất tò mò :D

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

Theo mình chữ "Interface" đó ý nghĩa của nó nằm trong phần giới thiệu của Java (OOP - Lập trình hướng đối tượng) là rõ nhất (Google từ khóa Polymorphism)

Dịch ra tiếng Việt hình như là "Đa hình", các bạn Google thử xem sao, nói chung biết thì biết nhưng ko biết giải thích sao cả hehe

Theo mình thì hàm này trả về 1 acad-object mà object đó kế thừa class AcCmColor. Nói chung đối tượng nào có màu thì hàm này trả về dc.

Nó ko liên quan gì đến giao diện mình thấy cả :D

  • 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

Theo mình chữ "Interface" đó ý nghĩa của nó nằm trong phần giới thiệu của Java (OOP - Lập trình hướng đối tượng) là rõ nhất (Google từ khóa Polymorphism)

Dịch ra tiếng Việt hình như là "Đa hình", các bạn Google thử xem sao, nói chung biết thì biết nhưng ko biết giải thích sao cả hehe

Theo mình thì hàm này trả về 1 acad-object mà object đó kế thừa class AcCmColor. Nói chung đối tượng nào có màu thì hàm này trả về dc.

Nó ko liên quan gì đến giao diện mình thấy cả :D

Hề hề hề,

Bác detailing này xem chừng muốn đổi nick rồi đây ????

Overall hay General bác nhể???

Hề hề hề.

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 detailing này xem chừng muốn đổi nick rồi đây ????

Overall hay General bác nhể???

Hề hề hề.

Hehe ko hiểu ý bác Bình lắm nhưng sao lại đổi nick nhỉ???

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

Mọi người chỉ dùm mình code để nhập dữ liệu như lệnh PEDIT Select polyline or [Multiple]:

Chọn đối tượng (entsel) cũng được mà nhập key cũng được.

Mình thử initget rồi mà không được. Cảm ơn mọi ngườ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

Mọi người chỉ dùm mình code để nhập dữ liệu như lệnh PEDIT Select polyline or [Multiple]:

Chọn đối tượng (entsel) cũng được mà nhập key cũng được.

Mình thử initget rồi mà không được. Cảm ơn mọi người.

 

Minh làm được rồi. tốn đất cadviet quá. Xin lỗi mọi người

(initget 128 "Multiple")
(setq en (entsel "\nSelect polyline or [Multiple]:"))

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

×