Đế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

#1761 phamhuy1

phamhuy1

    biết vẽ rectang

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

Đã gửi 05 August 2014 - 07:37 PM

Tự hỏi rồi tự trả lời luôn là sao chị ThuyLinh313 ,.. mà cho e hỏi : một số tỷ lệ không được phép delete, do đó là các tỷ lệ đã được các đối tượng trên bản vẽ sử dụng là sao? sử dụng cho Model hay Layout hả chị???


  • 0

#1762 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 05 August 2014 - 09:11 PM

ThuyLinh313 đọc bài dưới đây và xem help của hàm vla-get-StandardScale chắc ra vấn đề:

http://www.cadtutor....l-lisp&p=207972


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#1763 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 06 August 2014 - 10:54 AM

vla-get-UseStandardScale là 1 hàm trong bộ hàm hỗ trợ in ấn, nó không liên quan gì đến annotation scale.

 

Thêm nữa, theo hiểu biết của cháu về Annotation thì hiện tại không có bất kỳ hàm visual lisp nào hỗ trợ dành cho nó. Nguyên nhân do Visual lisp được Autodesk đưa vào cad từ bản 2000. Từ đó đến giờ vẫn vậy, không có bất kỳ bổ sung cập nhật nào. Trong khi đó Annotation chỉ được đưa vào cad từ bản 2008.
Các thông tin về Annotation data được Autodesk xây dựng mới và lưu trong 2 Dictionary: "ACDB_ANNOTATIONSCALES" và "ACAD_SCALELIST" và chỉ cần dùng các hàm Vanilla lisp là có thể can thiệp và chỉnh sửa. Họ làm vậy để đảm bảo cad đời thấp từ 2007 trở xuống vẫn đọc được bản vẽ có sử dụng Annotative object của cad 2008 trở lên.

 

Autodesk đã có cơ chế kiểm tra 1 tỷ lệ có đang được sử dụng hay không để không cho phép xoá thì cháu nghĩ chắc chắn nó phải được lưu ở đâu đó trong Annotation data.

 

@phamhuy1: Câu hỏi mình nêu trong topic "Hỏi về Lisp (thuật toán, ý tưởng, coding,...)" Nên bạn phải hiểu nó là câu hỏi về lisp. Câu hỏi của bạn mình có thể trả lời, nhưng bạn chỉ có thể hiểu nếu bạn có sử dụng Annotative object trong bản vẽ.


  • 0

#1764 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 06 August 2014 - 02:33 PM

Thêm nữa, theo hiểu biết của cháu về Annotation thì hiện tại không có bất kỳ hàm visual lisp nào hỗ trợ dành cho nó. Nguyên nhân do Visual lisp được Autodesk đưa vào cad từ bản 2000. Từ đó đến giờ vẫn vậy, không có bất kỳ bổ sung cập nhật nào. Trong khi đó Annotation chỉ được đưa vào cad từ bản 2008.

Các thông tin về Annotation data được Autodesk xây dựng mới và lưu trong 2 Dictionary: "ACDB_ANNOTATIONSCALES" và "ACAD_SCALELIST" và chỉ cần dùng các hàm Vanilla lisp là có thể can thiệp và chỉnh sửa. Họ làm vậy để đảm bảo cad đời thấp từ 2007 trở xuống vẫn đọc được bản vẽ có sử dụng Annotative object của cad 2008 trở lên.

 

Autodesk đã có cơ chế kiểm tra 1 tỷ lệ có đang được sử dụng hay không để không cho phép xoá thì cháu nghĩ chắc chắn nó phải được lưu ở đâu đó trong Annotation data.

Dynamic Block cũng mới được giới thiệu từ CAD 2007 thế mà lisp vẫn xử lý dc đấy :D

Đây là cơ chế mà AutoCAD kiểm tra 1 tỷ lệ (hay layer, text style, .....) có "đang được sử dụng" hay không (See pictures below) còn làm thế nào để lấy được các thông tin đó là phần của bạn :)

Goodluck!

 

0.png

 

Untitled.png

 

2.png


  • 1

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#1765 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 07 August 2014 - 07:54 PM

Visual lisp can thiệp vào Dynamic block bằng cách lấy hoặc gán giá trị trong bảng properties của đối tượng mà Detailing. Đó là các thuộc tính mới của đối tượng block chứ không phải là 1 dạng đối tượng mới.

bổ sung: Có lẽ bạn biết rằng Visual lisp là thứ ngôn ngữ kiểu nửa lạc nửa mỡ, vừa hỗ trợ lập trình hướng thủ tục, vừa lập trình hướng đối tượng chứ không như Vanilla lisp chỉ lập trình hướng thủ tục. Điều mà mình muốn nói ở đây chính là việc chắn chắn không thể có 1 hàm hướng đối tượng dành cho Annotation scale kiểu như hàm vla-get-UseStandardScale nêu trên. bởi nếu có, nó phải có ngay từ đầu (không thể), hoặc được bổ sung khi Autocad bắt đầu hỗ trợ Annotative object (chưa từng sảy ra)

 

Mình xem các ghi chú của bạn trong hình mà nghĩ hoài không ra chỗ nào là chỗ chỉ ra 1 tỷ lệ đang được sử dụng. Ngoài ra bạn có thể cho mình biết bạn gọi hộp thoại quản lý bảng và từ điển như trên bằng lệnh nào không? hay nó là 1 tiện ích ngoài?


  • 0

#1766 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 07 August 2014 - 10:44 PM

ThuyLinh313 xem ở đây có đoạn code xoá hết các annotation scales không được sử dụng được viết bằng C# có giúp được bạn không. Mình không biết C# đâu nha :mellow:

http://through-the-i...ing-unused.html


  • 1

#1767 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 07 August 2014 - 11:05 PM

chắc đoạn code này giúp được bạn

;http://forums.autode...es/td-p/1977793
;; return a list of the annotation scales
;; used in the dwg or nil if none

(defun anno_list ( / ANNOSET ANNOLIST ENT N BLKSET)
	(setq ANNOLIST nil)
	(if (setq ANNOSET (ssget "x" '((-3 ("AcadAnnotative")))))
		(foreach ENT (mapcar 'cadr (ssnamex ANNOSET))
			(foreach N (ent_scales ENT)
				(if (not (member N ANNOLIST))
					(setq ANNOLIST (cons N ANNOLIST))
				)
			)
		)
	)
	(setq ANNOSET nil)
	(while (setq ANNOSET (tblnext "BLOCK" (not ANNOSET)))
		(setq BLKSET (ssget "x" (list (assoc 2 ANNOSET))))
		(while (and BLKSET (> (sslength BLKSET) 0))
			(setq ENT (ssname BLKSET 0))
      	(ssdel ENT BLKSET)
			(foreach N (ent_scales ENT)
   	   	(if (not (member N ANNOLIST))
      	  		(setq ANNOLIST (cons N ANNOLIST))
         	)
	      )
   	)
	)
	ANNOLIST
)

;; return a list of the annotation scales
;; used by an entity EN or nil if none

(defun ENT_SCALES (EN / A)
	(if
		(and
			(setq A (cdr (assoc 360 (entget EN))))
			(setq A (dictsearch A "AcDbContextDataManager"))
			(setq A (dictsearch (cdr (assoc -1 A)) "ACDB_ANNOTATIONSCALES"))
   	)
    	(progn
			(setq A
      		(apply 'append
					(mapcar '(lambda (X) (if (eq (car X) 350) (list (cdr X)))) A)
      		)
     		)  
   		(mapcar '(lambda (X) (cdr (assoc 300 (entget (cdr (assoc 340 (entget X))))))) A)
		)
	)
)


  • 1

#1768 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 08 August 2014 - 08:19 AM

Cảm ơn Tien2005!

Có 10 người bán trái cây và 1000 người mua. Để biết 10 người bán đó có ai đã bán quả đào hay chưa thì ta nên hỏi trực tiếp 10 người họ chứ không nên gián tiếp hỏi 1000 người kia xem có ai đã mua đào.

Mình hiểu ý đồ của bạn trong code trên. Nhưng đó là cách làm ngược và chỉ có thể sử dụng khi bản vẽ ít đối tượng được áp dụng tỷ lệ thôi bạn ạ.

 

Mình cũng không biết gì về C# hết á. nhưng mình sẽ thử ngâm cứu nó xem có thu hoạch được gì không :)


  • 0

#1769 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 08 August 2014 - 09:54 AM

@Detailing: Sau khi xem xét kỹ hình bạn gửi thì mình nhận ra hình như bạn cũng gợi ý mình theo cách "hỏi 1000 người mua" như mình nêu bên trên. Mình nghĩ Autodesk họ không làm vậy đâu. Bởi dù bản vẽ của mình có lớn cỡ nào thì khi bật hộp thoại scale list edit nó vẫn hiện ra tức thì, không mất công duyệt từng đối tượng trên bản vẽ.  :)


  • 0

#1770 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 08 August 2014 - 10:15 AM

Visual lisp can thiệp vào Dynamic block bằng cách lấy hoặc gán giá trị trong bảng properties của đối tượng Không biết bạn get và set các dynamic properties như thế nào? nên ko có ý kiến về vấn đề này

Có lẽ bạn biết rằng Visual lisp là thứ ngôn ngữ kiểu nửa lạc nửa mỡ, vừa hỗ trợ lập trình hướng thủ tục, vừa lập trình hướng đối tượng (OOP) chứ không như Vanilla lisp chỉ lập trình hướng thủ tục. lisp, Visual lisp hay vanilla lisp cái nào cũng hướng thủ tục hết, lập trình OOP là một khái niệm hoàn toàn khác, bạn có thể Google để biết nó khác như thế nào

Điều mà mình muốn nói ở đây chính là việc chắn chắn không thể có 1 hàm hướng đối tượng dành cho Annotation scale kiểu như hàm vla-get-UseStandardScale nêu trên. bởi nếu có, nó phải có ngay từ đầu (không thể), hoặc được bổ sung khi Autocad bắt đầu hỗ trợ Annotative object Có thể nó ko có một hàm trực tiếp như thế nhưng nó sẽ có cách để làm được việc đó chỉ do mình chưa làm được thì ko nên khẳng định là ko thể làm dc (impossible)

 

Mình xem các ghi chú của bạn trong hình mà nghĩ hoài không ra chỗ nào là chỗ chỉ ra 1 tỷ lệ đang được sử dụng. H1: Text "aaa" (sample) có 2 anno 1:1 và 1:4 - H2: ti3 lệ 1:1 chính là A0 trong Dictionary ACAD_SCALELIST có handle là B7 (duy nhất) - H3: trong Model Space chứa Text - Text có extension Dictionary (ACDB_ANNOTATIONSCALE) - Dictionary có 2 giá trị ( gái trị 1 là 1 con trỏ (Hard pointer) chứa địa chỉ của vùng nhớ của đối tượng có Handle là B7 (chính là A0)

Ngoài ra bạn có thể cho mình biết bạn gọi hộp thoại quản lý bảng và từ điển như trên bằng lệnh nào không? hay nó là 1 tiện ích ngoài? Đó là 1 tiện ích bên ngoài có tên là Arx Development tool (ArxDbg)


  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#1771 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 08 August 2014 - 10:59 AM

@Detailing: Sau khi xem xét kỹ hình bạn gửi thì mình nhận ra hình như bạn cũng gợi ý mình theo cách "hỏi 1000 người mua" như mình nêu bên trên. Mình nghĩ Autodesk họ không làm vậy đâu. Bởi dù bản vẽ của mình có lớn cỡ nào thì khi bật hộp thoại scale list edit nó vẫn hiện ra tức thì, không mất công duyệt từng đối tượng trên bản vẽ.  :)

cái ví dụ của bạn cũng trừu tượng nhưng nó ko chính xác lắm vì trái đào với người bán ko có mối liên hệ nào cả :) .

Thử nghĩ theo cách này: Ở 1 bản điện có 5 cái phích cắm vào, mỗi cái lại chia ra 1 chùm dây,  bây giờ bạn cần rút 1 cái ra nhưng phải bảo đảm là ko có 1 thiết bị nào bị tắt vậy bạn phải làm sao? :D

Khi bật ra thì nó chỉ cần đọc cái dictionary thôi đâu có gì để mà lâu :D . Nếu ý bạn là sau đó nếu mình delete nhưng nó ko cho thì lại là 1 vấn đề khác.


  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#1772 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 08 August 2014 - 01:53 PM

Quote
Mình xem các ghi chú của bạn trong hình mà nghĩ hoài không ra chỗ nào là chỗ chỉ ra 1 tỷ lệ đang được sử dụng. H1: Text "aaa" (sample) có 2 anno 1:1 và 1:4 - H2: ti3 lệ 1:1 chính là A0 trong Dictionary ACAD_SCALELIST có handle là B7 (duy nhất) - H3: trong Model Space chứa Text - Text có extension Dictionary (ACDB_ANNOTATIONSCALE) - Dictionary có 2 giá trị ( gái trị 1 là 1 con trỏ (Hard pointer) chứa địa chỉ của vùng nhớ của đối tượng có Handle là B7 (chính là A0)
Ngoài ra bạn có thể cho mình biết bạn gọi hộp thoại quản lý bảng và từ điển như trên bằng lệnh nào không? hay nó là 1 tiện ích ngoài? Đó là 1 tiện ích bên ngoài có tên là Arx Development tool (ArxDbg)


Như vậy, phải chăng ý của Detailing là chỉ cần truy cập Extension Dictionary của model space là có thể tìm được danh sách tỷ lệ đã sử dụng. Có lẽ mình hiểu nhầm chính là chỗ này. do bản vẽ mẫu của bạn chỉ có 1 đối tượng text nên mình nghĩ đó là Extension Dictionary của đối tượng text đó. Mình sẽ kiểm chứng lại. Cảm ơn bạn!

Có vấn đề gì đó mà mình hiểu sai. Đây là đoạn code mình dùng để kiểm tra theo ý trên.
(setq extDic (vla-getextensiondictionary (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))
(setq contextDT (vla-item extDic "AcDbContextDataManager"))
Chương trình báo lỗi khi thực hiện dòng code thứ 2. Bởi "AcDbContextDataManager" thực sự không có trong extDic của modelspace. Mâu thuẫn với hình 3.

PS: Ý định của mình là viết 1 đoạn code tự động purge annotation scale khi người dùng đóng bản vẽ. Khi sự kiện DrawingWillClose sảy ra, đoạn code đó sẽ kiểm tra từng tỷ lệ, nếu tỷ lệ nào đã được ít nhất 1 đối tượng trên bản vẽ sử dụng thì không được xóa. Trong trường hợp này ví dụ của mình sát hơn cái ổ cắm của bạn:
- Người bán đào là người sở hữu mặt hàng mà bất kỳ đối tượng nào cũng có thể mua. => Kiểm tra người mua, sẽ phải kiểm tra tất cả.
- Còn cái ổ cắm của bạn, nó hoặc không liên kết với bất kỳ thiết bị nào, hoặc sẽ liên kết đến cả 1 chùm thiết bị. => kiểm tra thiết bị, chỉ cần kiểm tra 1 thiết bị trong nhóm.
Mình thì chỉ muốn kiểm tra người bán :)
  • 0

#1773 Detailing

Detailing

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 667 Bài viết
Điểm đánh giá: 278 (khá)

Đã gửi 09 August 2014 - 04:01 AM

:wacko:  :blink: Đọc xong mờ mắt 

 

Như vậy, phải chăng ý của Detailing là chỉ cần truy cập Extension Dictionary của model space là có thể tìm được danh sách tỷ lệ đã sử dụng. Có lẽ mình hiểu nhầm chính là chỗ này. do bản vẽ mẫu của bạn chỉ có 1 đối tượng text nên mình nghĩ đó là Extension Dictionary của đối tượng text đó. Mình sẽ kiểm chứng lại. Cảm ơn bạn!

Có vấn đề gì đó mà mình hiểu sai. Đây là đoạn code mình dùng để kiểm tra theo ý trên.
(setq extDic (vla-getextensiondictionary (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))))
(setq contextDT (vla-item extDic "AcDbContextDataManager"))
Chương trình báo lỗi khi thực hiện dòng code thứ 2. Bởi "AcDbContextDataManager" thực sự không có trong extDic của modelspace. Mâu thuẫn với hình 3.

PS: Ý định của mình là viết 1 đoạn code tự động purge annotation scale khi người dùng đóng bản vẽ. Khi sự kiện DrawingWillClose sảy ra, đoạn code đó sẽ kiểm tra từng tỷ lệ, nếu tỷ lệ nào đã được ít nhất 1 đối tượng trên bản vẽ sử dụng thì không được xóa. Trong trường hợp này ví dụ của mình sát hơn cái ổ cắm của bạn:
- Người bán đào là người sở hữu mặt hàng mà bất kỳ đối tượng nào cũng có thể mua. => Kiểm tra người mua, sẽ phải kiểm tra tất cả.
- Còn cái ổ cắm của bạn, nó hoặc không liên kết với bất kỳ thiết bị nào, hoặc sẽ liên kết đến cả 1 chùm thiết bị. => kiểm tra thiết bị, chỉ cần kiểm tra 1 thiết bị trong nhóm.
Mình thì chỉ muốn kiểm tra người bán :)

:unsure:  :wacko:  :blink:  B)  Đọc xong mờ mắt luôn :D

  1. Dictionary được lưu trong Database của bản vẽ ko phải trong ModelSpace (chỉ là 1 BlockTablecord) nó chứa tất cả scale list được khai báo ko phải đang sử dụng
  2.  AcDbContextDataManager là 1 class được wrap lại cho .NET ko phải cho lisp (dùng ActiveX với các Interface) nên code của bạn bị lỗi
  3. Về cái ví dụ của bạn, giải thích thì dài dòng và nảy sinh ra thêm nhiều vấn đề nữa nên mình gợi ý bạn google  những thứ sau để hiểu sự khác nhau giữa: người bán đưa trái đào (value) cho người mua và phích cắm nối với thiết bị điện để truyền điện (reference,  object reference, pointer point to memory address)  ngoài ra có thể tìm hiểu thêm sự khác nhau như giữa Hard PointerSoft Pointer trong AutoCAD

  • 0

Ideas don't matter, execution does!

1908412_308002392716743_8165279281236341


#1774 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 09 August 2014 - 09:06 AM

:wacko:  :blink: Đọc xong mờ mắt 

 

:unsure:  :wacko:  :blink:  B)  Đọc xong mờ mắt luôn :D

  1. Dictionary được lưu trong Database của bản vẽ ko phải trong ModelSpace (chỉ là 1 BlockTablecord) nó chứa tất cả scale list được khai báo ko phải đang sử dụng
  2.  AcDbContextDataManager là 1 class được wrap lại cho .NET ko phải cho lisp (dùng ActiveX với các Interface) nên code của bạn bị lỗi
  3. Về cái ví dụ của bạn, giải thích thì dài dòng và nảy sinh ra thêm nhiều vấn đề nữa nên mình gợi ý bạn google  những thứ sau để hiểu sự khác nhau giữa: người bán đưa trái đào (value) cho người mua và phích cắm nối với thiết bị điện để truyền điện (reference,  object reference, pointer point to memory address)  ngoài ra có thể tìm hiểu thêm sự khác nhau như giữa Hard PointerSoft Pointer trong AutoCAD

Bài viết của mình bị sao vậy nhỉ?  :wacko: 
1. Mình sẽ tiếp tục nghiên cứu ý này của bạn. Nếu có gì vướng mắc bạn chỉ thêm cho mình nhé.
2. Có gì đó không đúng. Mình vẫn khai thác được thông tin trong "AcDbContextDataManager" với một số trường hợp. như trường hợp sau:

Đây là hàm kiểm tra 1 đói tượng có phải là annotative object hay không

(defun Annotative-p (en /  exd ano)
 (if (= (type en) 'ENAME) (setq obj (vlax-ename->vla-object en)) (setq obj en))
 (and (eq (vla-get-HasExtensionDictionary obj) :vlax-true)
      (setq exd (vla-GetExtensionDictionary obj))
      (not (vl-catch-all-error-p (setq exd (vl-catch-all-apply 'vla-item (list exd "AcDbContextDataManager")))))
      (setq ano (vla-item exd "ACDB_ANNOTATIONSCALES"))
      (not (zerop (vla-get-Count ano)))))

3. Cảm ơn bạn với những gợi ý này.


  • 0

#1775 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 09 August 2014 - 01:33 PM

Cho em hỏi 1 chút.

Muốn biến đoạn Code này về dạng (mapcar '(lambda (......thì viết như thế nào các bác nhỉ?

(defun c:77(/ Lts1 Lts2 Lts i)
(setq Lts1 (list))
(setq Lts2 (list))
(setq i 0)
(setq lts (list '(8 9 nil) '(5 8 nil) '(nil 8 4) '(2 3 nil) '(8 nil 2)))
(while (< i (length Lts))
	(setq Lts1 (mapcar '(lambda (x) (if (= x nil) (not x) x)) (nth i lts)))
	(setq Lts2 (append Lts2 (list Lts1)))
	(setq i (1+ i))
)
(princ Lts2)
(princ)
)

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1776 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 09 August 2014 - 01:55 PM

Bạn chỉ cần viết :

 

(mapcar '(lambda(x) (mapcar '(lambda(y) (if (null y) t y)) x)) lts)


  • 2

#1777 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 09 August 2014 - 01:55 PM

Em đã làm được như này rồi, tuy nhiên phần tử đầu tiên vẫn chưa thực hiện được.

(OnFlag (list '(8 9 nil) '(5 8 nil) '(nil 8 4) '(2 3 nil) '(8 nil 2)) )
(defun OnFlag (l)
    (if l
      (cons (car l)
        (OnFlag
           (mapcar '(lambda (x) (mapcar '(lambda (e) (if (= e nil) (not e) e)) x) ) (cdr l))
        )
      )
    )
  )

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1778 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 09 August 2014 - 01:57 PM

Bạn chỉ cần viết :

 

(mapcar '(lambda(x) (mapcar '(lambda(y) (if (null y) t y)) x)) lts)

Dạ, ok rồi anh.

Cảm ơn anh nhiều. Em lại cứ phức tạp hóa vấn đề rùi. ^^


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#1779 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 09 August 2014 - 02:04 PM

Em đã làm được như này rồi, tuy nhiên phần tử đầu tiên vẫn chưa thực hiện được.

(OnFlag (list '(8 9 nil) '(5 8 nil) '(nil 8 4) '(2 3 nil) '(8 nil 2)) )
(defun OnFlag (l)
    (if l
      (cons (car l)
        (OnFlag
           (mapcar '(lambda (x) (mapcar '(lambda (e) (if (= e nil) (not e) e)) x) ) (cdr l))
        )
      )
    )
  )

Tại bạn (cons (car l) ...) (car l) nó không đổi, chỉ mấy cái sau nó đổi thôi. Cái này đâu cần dùng đệqui làm gì.


  • 1

#1780 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 09 August 2014 - 02:13 PM

Dạ, cảm ơn anh.

Em đã hiểu vấn đề rồi anh ạ.

:P


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn