Đến nội dung


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

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


  • Please log in to reply
2854 replies to this topic

#221 Tri

Tri

    biết vẽ circle

  • Members
  • PipPip
  • 31 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 08 March 2009 - 06:01 PM

Các bác trên diễn đàn cho em hỏi một chút :
(setq ss (entget(car(entsel "\n Chon Block :"))))
(setq po1 (cdr(assoc 10 ss)))

1. Dòng đầu tiên sẽ lấy thông tin của Block khi ta chọn một Block
2. Dòng thứ 2 : kết hợp hàm assoc và cdr lấy ra tọa độ điểm chèn của Block được chọn đó.

Nhưng em không biết làm sao để có thể thay đổi được tọa độ điểm chèn của Block đó.
Mong các bác chỉ bảo cho em với. Em xin cảm ơn các bác rất nhiều.
  • 0

#222 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 08 March 2009 - 10:35 PM

Các bác trên diễn đàn cho em hỏi một chút :
(setq ss (entget(car(entsel "\n Chon Block :"))))
(setq po1 (cdr(assoc 10 ss)))

1. Dòng đầu tiên sẽ lấy thông tin của Block khi ta chọn một Block
2. Dòng thứ 2 : kết hợp hàm assoc và cdr lấy ra tọa độ điểm chèn của Block được chọn đó.

Nhưng em không biết làm sao để có thể thay đổi được tọa độ điểm chèn của Block đó.
Mong các bác chỉ bảo cho em với. Em xin cảm ơn các bác rất nhiều.

Tọa độ cho ra bởi assoc 10 là tọa độ của điểm chèn block trong bản vẽ. Bạn muốn thay đổi nó tức là thay đổi vị trí block đấy. Còn tọa độ điểm chèn của nó trong bản thân block thì lại khác. Ý bạn là thế nào trong 2 trường hợp này. Bạn có thể nói rõ hơn được không?
  • 0

#223 Tri

Tri

    biết vẽ circle

  • Members
  • PipPip
  • 31 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 09 March 2009 - 08:09 AM

Tọa độ cho ra bởi assoc 10 là tọa độ của điểm chèn block trong bản vẽ. Bạn muốn thay đổi nó tức là thay đổi vị trí block đấy. Còn tọa độ điểm chèn của nó trong bản thân block thì lại khác. Ý bạn là thế nào trong 2 trường hợp này. Bạn có thể nói rõ hơn được không?

Vì cái điểm chèn Block của em nó nằm ở xa so với cái Block. Em muốn điểm chèn đó nằm gần lại cái Block đó vì cứ mỗi lần sử dụng lệnh Insert thì khi pick điểm chèn rồi mà chẳng thấy Block đâu (vì thực ra điểm chèn nằm xa Block nên phải zoom lại mới thấy được. Em muốn thay đổi điểm chèn mà khi sử dụng lệnh Insert thì điểm chèn đó nằm gần lại Block.

Bác Nataca có thể giải thích thêm điểm chèn block trong bản vẽ và điểm chèn của nó trong bản thân block khác nhau như thế nào được không?
Cảm ơn bác.
  • 0

#224 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 09 March 2009 - 08:46 AM

Vì cái điểm chèn Block của em nó nằm ở xa so với cái Block. Em muốn điểm chèn đó nằm gần lại cái Block đó vì cứ mỗi lần sử dụng lệnh Insert thì khi pick điểm chèn rồi mà chẳng thấy Block đâu (vì thực ra điểm chèn nằm xa Block nên phải zoom lại mới thấy được. Em muốn thay đổi điểm chèn mà khi sử dụng lệnh Insert thì điểm chèn đó nằm gần lại Block.

Bác Nataca có thể giải thích thêm điểm chèn block trong bản vẽ và điểm chèn của nó trong bản thân block khác nhau như thế nào được không?
Cảm ơn bác.

Khác chứ. Điểm chèn của block trong bản vẽ chính là điểm mà bạn chọn khi insert bản vẽ. Còn điểm "chèn" (tạm gọi thế) trong bản thân block theo mình đó là gốc tọa độ (0,0,0) khi bạn edit block. Trường hợp của bạn chỉ cần edit block và move các đối tượng trong block về gần gốc tọa độ (0,0,0) là được.
  • 0

#225 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 09 March 2009 - 12:26 PM

Vì cái điểm chèn Block của em nó nằm ở xa so với cái Block. Em muốn điểm chèn đó nằm gần lại cái Block đó vì cứ mỗi lần sử dụng lệnh Insert thì khi pick điểm chèn rồi mà chẳng thấy Block đâu (vì thực ra điểm chèn nằm xa Block nên phải zoom lại mới thấy được. Em muốn thay đổi điểm chèn mà khi sử dụng lệnh Insert thì điểm chèn đó nằm gần lại Block.

Bác Nataca có thể giải thích thêm điểm chèn block trong bản vẽ và điểm chèn của nó trong bản thân block khác nhau như thế nào được không?
Cảm ơn bác.

Chào bạn Tri,
Theo như bạn nói thì mình hiểu là bạn muốn thay đổi cái insert point đã được nhập vào khi bạn tạo một block bằng lệnh make block. Cái điểm đó nó đã là một thuộc tính cố định của block mất rồi và trong bảng mã DXF của một block thì mình không thấy có mã nào thể hiện cho cái điểm này. Việc bạn muốn thay đổi nó có nghĩa là bạn sẽ phải tạo một block mới và khi đó thì bạn sẽ được tùy chọn cái insert point này. Theo mình nên gọi nó là điểm gốc, hay điểm mốc của block chứ không nên gọi là đểm chèn vì dễ hiểu lầm. (Nó không hẳn đã là điểm (0.0 0.0 0.0) như bác Nacata nói đâu).Cái điểm này sẽ được dùng khi bạn cần sử dụng cái block này.
Ví dụ khi bạn insert một block vào một bản vẽ thì cái block ấy sẽ được đưa vào sao cho điểm gốc này sẽ trùng với cái điểm chèn (insert point) mà bạn sẽ nhập trong lệnh insert. Cái điểm chèn này thì nó có thể hiện trong bảng mã DXF của block mới insert vào và đó là mã tương tác số 10. Khi bạn dùng lệnh (setq pt (cdr ( assoc 10 (entget (car (entsel)))))) với đối tượng chọn là một block trên bản vẽ thì nó sẽ trả về cho bạn cái điểm mà bạn đã lựa chọn khi xài lệnh insert chứ không phải là điểm mà bạn đã lựa chọn khi tạo ra cái block này. Nếu bạn muốn thay đổi vị trí của block đó trong bản vẽ thì bạn có thể thay đổi cái tọa độ của điểm này rồi dùng hàm entmod để cập nhật tọa độ thay đổi trong bảng mả dxf và dùng hàm entup để cập nhật sự thay đổi vị trí block trên bản vẽ bạn ạ.

Túm lại mỗi một block có thể có hai insert point:
- một là điểm gốc được lấy khi tạo block mà cái điểm này thì không thay đổi được trừ phi bạn tạo một block mới có điểm gốc mới.
- Hai là điểm chèn khi insert block đó vào trong bản vẽ hiện hành. Điểm này có thể thay đổi được và vị trí của block trên bản vẽ sẽ thay đổi theo bằng cách sử dụng mã DXF của block.

Khi insert block bạn nên pick vào block chứ không nên pick điểm gốc vì dễ bị nhầm lắm. Nhất là khi trên bản vẽ có ty tỷ cái block khác nhau bạn ạ. Và như vậy bạn cũng chả cần chú ý tới cái điểm gốc này làm gì, cứ rê chuột sao cho block nằm đúng vị trí mình muốn rồi enter là OK.

Bác Nacata đã giải thích, nhưng sợ bạn chưa rõ nên mình mạn phép múa rìu một tí, hy vọng bạn sẽ thấy thoải mái hơn với cái thằng insert point của block này.
Chúc bạn vui và 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.

#226 phuquang113

phuquang113

    biết vẽ line

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

Đã gửi 13 March 2009 - 08:34 AM

Mong các cao thủ lisp giúp giùm em.
Em có một bình đồ gồm nhiều đường đồng mức (mỗi đường DM là một PL. Nhưng em lại chỉ muốn các đường đồng mức thể hiện trong vùng em chọn mà thôi(vùng chọn được bao bằng PL) còn phần ngoài ẩn đi chứ không phải xén bớt phần bên ngoài vùng chọn. Cám ơn các bác nhiều.
  • 0

#227 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 13 March 2009 - 08:47 AM

Mong các cao thủ lisp giúp giùm em.
Em có một bình đồ gồm nhiều đường đồng mức (mỗi đường DM là một PL. Nhưng em lại chỉ muốn các đường đồng mức thể hiện trong vùng em chọn mà thôi(vùng chọn được bao bằng PL) còn phần ngoài ẩn đi chứ không phải xén bớt phần bên ngoài vùng chọn. Cám ơn các bác nhiều.

Trường hợp này bạn nên sử dụng lệnh XClip hay lệnh Clipit.
Hãy post bài của bạn và có thể kèm theo file bản vẽ của bạn ở đây :
http://www.cadviet.c...amp;#entry48665
Mọi người sẽ giúp bạn. Cám ơn.
  • 0

#228 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 13 March 2009 - 08:51 AM

Mong các cao thủ lisp giúp giùm em.
Em có một bình đồ gồm nhiều đường đồng mức (mỗi đường DM là một PL. Nhưng em lại chỉ muốn các đường đồng mức thể hiện trong vùng em chọn mà thôi(vùng chọn được bao bằng PL) còn phần ngoài ẩn đi chứ không phải xén bớt phần bên ngoài vùng chọn. Cám ơn các bác nhiều.

Bạn sang topic "Viết lisp theo yêu cầu", hoặc lập topic mới. Topic này, theo như tên gọi cũng như các nội dung đã post, là để dành riêng cho các bạn đang tự lập trình lisp và đang có những vướng mắc cần trao đổi thêm.
Sự tuỳ tiện sẽ làm phá vỡ cấu trúc chung của diễn đàn. Tên topic sẽ chẳng còn ý nghĩa gì nữa!
Mong bạn hiểu và không cảm thấy phật lòng.

P/S
1. Sang topic kia cũng thấy nội dung y chang như bên này! Lần sau, nếu tiếp tục như vậy sẽ bị xoá luôn cả 2 bài!
2. Vấn đề của bạn chẳng dính gì đến Lisp. Hãy làm theo gợi ý của bạn Tue_NV
  • 0

#229 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 15 March 2009 - 04:04 PM

Topic này, theo như tên gọi cũng như các nội dung đã post, là để dành riêng cho các bạn đang tự lập trình lisp và đang có những vướng mắc cần trao đổi thêm.

Cảm ơn bác SSg. Bác SSg và mọi người trên diễn đàn cho mình hỏi cấu trúc của hàm If một tý :
Cú pháp:
(if testexpr thenexpr [elseexpr])
Giải thích:
testexpr: Là biểu thức kiểm tra điều kiện
thenexpr: Biểu thức lệnh được thực hiện nếu biểu thức testexpr nhận giá trị T
elseexpr: Biểu thức lệnh được thực hiện nếu biểu thức testexpr nhận giá Nil. Nếu không có biểu thức này, hàm không thực hiện và trả về giá trị nil

Và trong đoạn Lisp này :
(defun c:nso()
(setvar "CMDECHO" 0)
(setq pre (getint "\nSo chu so sau dau phay?"))
(command "luprec" pre)
(setq co (getreal "\nGia tri can so nhan:"))
(SETQ TH (SSget)
QUANT (if TH (SSLENGTH TH))
INDEX 0
)
(WHILE (< INDEX QUANT)
(setq s (entget (SSNAME TH INDEX))
otext (assoc 1 s)
ot (cdr otext)
ot (atof ot)
nt (cons 1 (rtos (* ot co)))
s (subst nt otext s)
)
(entmod s)
(setq index (+ index 1))
)
(command "luprec" "4")
)


(if TH (SSLENGTH TH))
Cái dòng in đậm thể hiện cấu trúc của hàm if, em chưa hiểu testexpr: Là biểu thức kiểm tra điều kiện như thế nào ? Các Bác trên diễn đàn giải thích dùm em với. Cảm ơn các bác nhiều lắm.
  • 0

#230 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 15 March 2009 - 05:49 PM

(if TH (SSLENGTH TH))
Cái dòng in đậm thể hiện cấu trúc của hàm if, em chưa hiểu testexpr: Là biểu thức kiểm tra điều kiện như thế nào ? Các Bác trên diễn đàn giải thích dùm em với. Cảm ơn các bác nhiều lắm.

testexpr ở đây là TH . Nếu tồn tại TH (TH/=nil) thì thực hiện (SSLENGTH TH), ngoài ra (TH=nil) thì bỏ qua
  • 0

#231 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 15 March 2009 - 07:07 PM

testexpr ở đây là TH . Nếu tồn tại TH (TH/=nil) thì thực hiện (SSLENGTH TH), ngoài ra (TH=nil) thì bỏ qua

Cám ơn Nataca. Bạn và mọi người có thể cho mình hỏi đoạn Lisp Convert ss thành List
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (if ss (sslength ss) 0)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)


Đến đoạn màu đậm là chưa hiểu về biến lstent. Mong bạn và mọi người giải thích dùm mình tý. Cảm ơn.
  • 0

#232 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 15 March 2009 - 07:28 PM

Cám ơn Nataca. Bạn và mọi người có thể cho mình hỏi đoạn Lisp Convert ss thành List
(defun ss2ent (ss / sodt index lstent)
(setq
sodt (if ss (sslength ss) 0)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)


Đến đoạn màu đậm là chưa hiểu về biến lstent. Mong bạn và mọi người giải thích dùm mình tý. Cảm ơn.

Giá trị ban đầu của lstent trong trường hợp này là '()lstent được khai báo là biến cục bộ của hàm ss2ent
(cons ent lstent) có nghĩa là thêm phần tử ent vào vị trí đầu tiên của danh sách lstent -> giá trị của lstent : (ent1) rồi (ent2 ent1) rồi (ent3 ent2 ent1)....cứ vậy
(reverse lstent) giúp đảo ngược list lstent-> lstent sẽ trở thành (ent1 ent2 ent3....)

Ta có thể thay đoạn code trên bằng đoạn code này:
(setq lstent (append lstent (list ent)))
như vậy không cần bước (reverse lstent) nữa.
  • 1

#233 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 16 March 2009 - 07:45 AM

Giá trị ban đầu của lstent trong trường hợp này là '()lstent được khai báo là biến cục bộ của hàm ss2ent
(cons ent lstent) có nghĩa là thêm phần tử ent vào vị trí đầu tiên của danh sách lstent -> giá trị của lstent : (ent1) rồi (ent2 ent1) rồi (ent3 ent2 ent1)....cứ vậy
(reverse lstent) giúp đảo ngược list lstent-> lstent sẽ trở thành (ent1 ent2 ent3....)

Ta có thể thay đoạn code trên bằng đoạn code này:
(setq lstent (append lstent (list ent)))
như vậy không cần bước (reverse lstent) nữa.

Cảm ơn Nataca. Mấu chốt của bài toán trên chính là biến lstent. Biến này chứa danh sách ename của đối tượng trong tập hợp chọn. Cái mà mình thắc mắc đó chính là giá trị khởi tạo của biến lstent. Theo như Nataca nói thì giá trị ban đầu của lstent trong trường hợp này là '() vì lstent được khai báo là biến cục bộ của hàm ss2ent. Tức là giá trị ban đầu của lstent chính là một list rỗng phải không?

Nhưng trong đoạn định nghĩa hàm ss2ent : (defun ss2ent (ss / sodt index lstent)

Ta thấy sodt, index, lstent là 3 biến cục bộ của hàm ss2ent
Biến sodt được khởi tạo với giá trị ban đầu : (if ss (sslength ss) 0)
Biến index được khởi tạo với giá trị ban đầu là 0.
Còn mình không thấy biến lstent không được khởi tạo?
Và nếu có thì biến lstent được khởi tạo như thế nào? Và giá trị ban đầu của biến lstent là một list rỗng.
Các bạn có thể giải thích cho mình một chút được không? Thanks
  • 0

#234 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 16 March 2009 - 07:53 AM

Cảm ơn Nataca. Mấu chốt của bài toán trên chính là biến lstent. Biến này chứa danh sách ename của đối tượng trong tập hợp chọn. Cái mà mình thắc mắc đó chính là giá trị khởi tạo của biến lstent. Theo như Nataca nói thì giá trị ban đầu của lstent trong trường hợp này là '() vì lstent được khai báo là biến cục bộ của hàm ss2ent. Tức là giá trị ban đầu của lstent chính là một list rỗng phải không?

Nhưng trong đoạn định nghĩa hàm ss2ent : (defun ss2ent (ss / sodt index lstent)

Ta thấy sodt, index, lstent là 3 biến cục bộ của hàm ss2ent
Biến sodt được khởi tạo với giá trị ban đầu : (if ss (sslength ss) 0)
Biến index được khởi tạo với giá trị ban đầu là 0.
Còn mình không thấy biến lstent không được khởi tạo?
Và nếu có thì biến lstent được khởi tạo như thế nào? Và giá trị ban đầu của biến lstent là một list rỗng.
Các bạn có thể giải thích cho mình một chút được không? Thanks

Trong lisp thì biến được gán thuộc về loại nào (chuỗi, list, số...) phụ thuộc vào việc mình gán giá trị cho nó. Ví dụ index =0 thì tức là vừa gán cho index giá trị 0 vừa gán cho nó thuộc loại số. hàm cons cũng vậy. (cons ent lstent) tức vừa gán lstent loại list (nếu lstent chưa được gán giá trị) vừa thêm phần tử ent vào list
  • 0

#235 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 17 March 2009 - 03:16 PM

Các bác cho em hỏi, nếu em có 2 hàm chính A và B, mỗi hàm chính gồm 3 hàm con A1 A2 A3 và B1 B2 B3, vậy làm cách nào để gộp lại thành 1 hàm mới C gồm 2 hàm chính A và B.

Ví dụ :

(defun c:A ()
(setq ss (ssget))
...)
(defun A1 ()
...)
-------------------
(defun c:B ()
(setq ss (ssget))
...)
(defun B1 ()
...)

Xin cám ơn nhiều.
  • 0

#236 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 17 March 2009 - 03:35 PM

Ví dụ :

(defun c:A ()
(setq ss (ssget))
...)
(defun A1 ()
...)
-------------------
(defun c:B ()
(setq ss (ssget))
...)
(defun B1 ()
...)
(defun c:C ()
__(C:A)
__(C:B )
)
  • 0

#237 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 17 March 2009 - 03:41 PM

Các bác cho em hỏi, nếu em có 2 hàm chính A và B, mỗi hàm chính gồm 3 hàm con A1 A2 A3 và B1 B2 B3, vậy làm cách nào để gộp lại thành 1 hàm mới C gồm 2 hàm chính A và B.
Ví dụ :
(defun c:A ()
...)
-------------------
(defun c:B ()
...)

Bạn thử gộp như sau :
(defun c:AB ()
(c:A)
(c:B )
)
  • 0

#238 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 19 March 2009 - 10:20 AM

Các bác cho hỏi để tác động đến hộp thoại của Qleader phải làm thế nào.
Cụ thể là 2 thằng Annotation type chọn None và Number of points là 2.
Xin cám ơn nhiều.
  • 0

#239 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 19 March 2009 - 10:39 AM

Các bác cho hỏi để tác động đến hộp thoại của Qleader phải làm thế nào.
Cụ thể là 2 thằng Annotation type chọn None và Number of points là 2.
Xin cám ơn nhiều.

(COMMAND "QLEADER" "" PAUSE)
  • 0

#240 tuan_thietkedien

tuan_thietkedien

    biết lệnh mirror

  • Members
  • PipPipPip
  • 153 Bài viết
Điểm đánh giá: 15 (tàm tạm)

Đã gửi 19 March 2009 - 11:59 AM

(COMMAND "QLEADER" "" PAUSE)


Chào bạn Tue_NV
Ý của mình là cách viết lisp đó bạn.
Mình muốn mặc định Annotation type là None và Number of points là 2.
  • 0