Đến nội dung


Hình ảnh
- - - - -

nhờ kết hợp 2 lisp


  • Please log in to reply
23 replies to this topic

#1 buithengan1

buithengan1

    biết vẽ line

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

Đã gửi 22 August 2014 - 10:26 AM

http://www.cadviet.c.../52064_lisp.rar

mình có 2 lisp 1 lisp do độ dài đoạn thẳng và cập nhật vào 1 text và tự động thay đổi khi kích thước đường thẳng thay đổi (lisp tính lệnh là LL) nhưng hạn chế của nó là chỉ đo được 1 đường thẳng.

 

1lisp đo được nhiều đoạn thẳng (lisp tg lệnh là tg) nhưng không tự động cập nhật vào text được.

 

 

Mấy bạn giúp mình làm 1 lisp đo độ dài của nhiều đoạn thẳng và tự động cập nhật vào text hộ mình với cảm ơn các bạn nhiều


  • 0

#2 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 22 August 2014 - 11:28 AM

Cái này trước đây cũng có người hỏi rồi.

Tôi có 1 cái lsp có thể tự động cập nhật chiều dài, nhưng chỉ dùng với pline thôi, ko dùng cho line.


  • 1

#3 buithengan1

buithengan1

    biết vẽ line

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

Đã gửi 22 August 2014 - 01:26 PM

Cái này trước đây cũng có người hỏi rồi.

Tôi có 1 cái lsp có thể tự động cập nhật chiều dài, nhưng chỉ dùng với pline thôi, ko dùng cho line.

bạn có thể cho mình xin lisp đó được ko?


  • 0

#4 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 22 August 2014 - 01:42 PM

Thật ra cái này tuy tôi viết cũng lâu rồi nhưng chỉ mang tính thử nghiệm (làm cho biết), chưa có ứng dụng thực tế.

Bạn muốn dùng thì down cái lsp này về.

Trong file bạn phải có sẵn pline và text cho từng đoạn của pline (đặt text gần cái đoạn của nó).

Đánh lệnh "tao", chọn pline, quét các text của pline. XOng vẫn chưa thấy có gì khác, tuy nhiên nếu bạn thay đổi chiều dài đoạn thì text sẽ đổi.

Làm xong nhớ save file. 

Lần sau mở file lại load cái lsp này vào để cad hiểu các hàm của nó, nhưng không cần đánh lệnh "tao" lại (lệnh này chỉ làm 1 lần cho 1 pline thôi).

(defun print-length (notifier-object reactor-object parameter-list / lvt pl n tm)
    (setq lvt (getLength (setq pl (vlax-vla-object->ename notifier-object))))
    (mapcar '(lambda(x)
(setq obj (vla-HandleToObject adoc (last x)))
(vla-put-textstring obj (nth (car x) lvt))
(setq tm (laydinhdoan pl (car x)))
(vla-put-rotation obj (if (< (caar tm) (caadr tm)) (angle (car tm) (last tm))
     (angle (last tm) (car tm) )))       
(vla-put-TextAlignmentPoint obj (vlax-3d-point (midp (car tm) (last tm)))))
   
  (vlax-ldata-get "Rdict" (dxf 5 pl)))
    (princ) 
  )
  
  (defun laydoan(pl pt / obj) 
    (fix (vlax-curve-getParamAtPoint pl (vlax-curve-getClosestPointTo pl pt))))
  
  (defun laydinhdoan(pl n / obj) 
    (list (vlax-curve-getPointAtParam pl n) (vlax-curve-getPointAtParam pl (1+ n))))
  
  (defun getLength(pl / vt l obj)
    (setq vt 0 l nil)
    (repeat (fix (vlax-curve-getEndParam pl))
      (setq l (append l (list (rtos (- (vlax-curve-getDistAtParam pl (setq vt (1+ vt)))
              (vlax-curve-getDistAtParam pl (1- vt))) 2 0)))))
    l
  )
 
(defun C:tao (/ mypLine tt5 pl)
  (setq mypLine  (vlax-ename->vla-object (setq pl (car (entsel "\nChon Polyline:"))))
tt5 (dxf 5 pl))
  (prompt "\nChon text ghi chieu dai:")  
  
  (if (vlax-ldata-get "Rdict" tt5) (vlax-ldata-delete "Rdict" tt5))
  
  (vlax-ldata-put "Rdict" tt5
    (mapcar '(lambda(x)  (list (laydoan pl (vlax-curve-getClosestPointTo mypLine (dxf 10 x)))
(vla-get-Handle (vlax-ename->vla-object x)))) (ssto (ssget '((0 . "TEXT"))))))
  
  (setq plineReactor (vlr-object-reactor (list mypLine) "PLine Reactor" '((:vlr-modified . print-length))))
  (vlr-pers plineReactor)
  (princ)
)

  • 2

#5 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 22 August 2014 - 02:01 PM

Sorry, bạn chép thêm mấy cái hàm này đặt trong file lsp trên , nếu không sẽ báo lỗi (các hàm này vì tôi hay dùng nên tôi để chỗ khác)

(vl-load-com)
(defun dxf(id v) (cdr (assoc id (entget v))))
(setq aDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(defun midp(d1 d2) (polar d1 (angle d1 d2) (* 0.5 (distance d1 d2))))
(defun ssto (ss) (if ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))) nil))

  • 3

#6 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 August 2014 - 11:07 AM

@Tot77 : Tại sao không ứng dụng Field nhỉ :)


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#7 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 23 August 2014 - 11:30 AM

Tôi không thích dùng field vì những lý do sau:

1. Nó tạo 1 cái background quanh text, không đẹp.  :(

2. Phải regen mới cập nhật.

3. Công thức rắc rối và không linh động, khó nhét lisp vào công thức.


  • 2

#8 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 23 August 2014 - 01:30 PM

Mình có cơ hội phản biện lại không ^^


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#9 tanbqtb03

tanbqtb03

    biết vẽ ellipse

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

Đã gửi 27 August 2014 - 10:29 AM

Thread này hay sao ko thấy các bạn vào bình luận tiếp cho ae học mót nhỉ, có cái hay để xài.


  • 0

#10 hanh.phuc

hanh.phuc

    Chưa sử dụng CAD

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

Đã gửi 02 September 2014 - 01:57 AM

1. Nó tạo 1 cái background quanh text, không đẹp.  :(

 

(setvar "FIELDDISPLAY" 0)

 

:)


  • 0

( apply '= "hp" "happy" "hạnh phúc" "幸福" "행복" ) ; error: too many arguments


#11 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 02 September 2014 - 10:04 AM

Thanks hanhphuc đã giới thiệu thêm 1 cái biến của cad, nhưng đó chỉ là lý do phụ thôi khiến tôi không thích dùng field.

Khi lần đầu thấy có người đề nghị sửa cái lisp ban đầu để dùng cho pline, thì tôi cũng làm thử với field, nhưng thấy khó nuốt quá (do cái lý do thứ 3 kể trên) nên tôi mới thử chuyển qua dùng reactor. Thấy reactor hay hơn nên xài luôn.

Bên trên tôi quên không nói tới việc text khi dủng với field nó không "thèm"di chuyển khi  chiều dài pline,thay đổi, còn dùng reactor thì nó di chuyển ngon lành.


  • 0

#12 hung_xu20032000

hung_xu20032000

    biết vẽ ellipse

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

Đã gửi 15 September 2014 - 07:11 PM

Mình cũng muốn kết hợp 2 lisp. Các bác hộ e với.http://www.cadviet.c...0_dtich_v_1.lsp và http://www.cadviet.c.../8800_tkh_1.lsp

khi đánh "v" sẽ ra được diện tích vùng được giới hạn và diện tích của layer được chọn. Cảm ơn các bác. 


  • 0

#13 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 15 September 2014 - 08:56 PM

Bạn đóng gói 2 file đó vào file rar rồi gưi lại, gửi trực tiếp như trên không down được.
  • 0

#14 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 September 2014 - 09:12 AM

Hôm trước hỏi bạn n k thấy đồng ý, hôm nay lại thấy 2pic được khơi lại, ket lại vô chém bừa.

1. Có background mới là cái người dùng cần. Thứ nhất là nó không ảnh hưởng đến việc in ấn. Thứ 2 là có nó người dùng mới biết đâu là 1 text có liên kết mà không vô tình Edit nó. Biến điều khiển thì đã có post ở trên rồi.

 

2. Regen chỉ là để hiển thị cho mắt người đọc thôi. Nếu thấy lệnh này làm chậm tốc độ, bạn có thể nghĩ đến sử dụng lệnh Update Field, tự người dùng đánh hoặc reactor tự động sau 1 khoảng thời gian nào đó nếu trên khung nhìn hiện tại có chứa Field. Ý tưởng này hình như có bác đề xuất lâu lâu rồi, làm cũng không khó, nhất là khi kết hợp với DBMod

 

- Ngoài ra bạn cũng có thể sẽ ngạc nhiên với biến FieldEval. Biến này sẽ giúp chúng ta chẳng cần phải quan tâm đến việc nó hiển thị lúc này ra sao, kết quả nhận được khi ở trên tờ giấy luôn ngon lành

 

3. Công thức Field không phức tạp lắm đâu, có quy luật hết rồi mà.

 

4. Không bị phụ thuộc.

- Field còn cho phép mở rộng ra nhiều Properties, Biến, Công thức, Diesel ... Cái này chắc bạn thấy trong bảng lệnh Field rồi hén. Code của bạn viết cho Length dài vậy rồi, đến lúc viết cho các thứ khác thì chắc mệt lắm..

- Không cần phải load code của bạn để sử dụng hiệu ứng. Chỉ cần dùng bản CAD hỗ trợ Field là đủ.

- Có thể tự sửa công thức nếu thích. Mà Format của kết quả cũng được linh động

...

 

5. Với lại hình như cái code có vấn đề hay sao đó, hồi lâu lâu ket test thử thấy nó không cập nhật ngay, phải chờ mình thay đổi đối tượng. Không tính toàn bộ Pline (hình như tính có 1 segment thôi). Và nếu muốn sửa thì mình chịu chết ^^

 

6. Cám ơn bạn vì sự sáng tạo. Mình học được nhiều trong code này, nhưng cũng chưa viết được cái j mới cả ^^ Tạm để đó đã ^^


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#15 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 16 September 2014 - 11:11 AM

Nói chung không có ý tranh luận làm gì, đơn giản là thấy field khó xài hơn reactor nên dùng reactor.

Nếu có ai rành về field và lisp thì làm thử bài toán trên để tôi được mở rộng tầm mắt.


  • 0

#16 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 16 September 2014 - 12:05 PM

Hôm trước hỏi bạn n k thấy đồng ý, hôm nay lại thấy 2pic được khơi lại, ket lại vô chém bừa.

1. Có background mới là cái người dùng cần. Thứ nhất là nó không ảnh hưởng đến việc in ấn. Thứ 2 là có nó người dùng mới biết đâu là 1 text có liên kết mà không vô tình Edit nó. Biến điều khiển thì đã có post ở trên rồi.

 

2. Regen chỉ là để hiển thị cho mắt người đọc thôi. Nếu thấy lệnh này làm chậm tốc độ, bạn có thể nghĩ đến sử dụng lệnh Update Field, tự người dùng đánh hoặc reactor tự động sau 1 khoảng thời gian nào đó nếu trên khung nhìn hiện tại có chứa Field. Ý tưởng này hình như có bác đề xuất lâu lâu rồi, làm cũng không khó, nhất là khi kết hợp với DBMod

 

- Ngoài ra bạn cũng có thể sẽ ngạc nhiên với biến FieldEval. Biến này sẽ giúp chúng ta chẳng cần phải quan tâm đến việc nó hiển thị lúc này ra sao, kết quả nhận được khi ở trên tờ giấy luôn ngon lành

 

3. Công thức Field không phức tạp lắm đâu, có quy luật hết rồi mà.

 

4. Không bị phụ thuộc.

- Field còn cho phép mở rộng ra nhiều Properties, Biến, Công thức, Diesel ... Cái này chắc bạn thấy trong bảng lệnh Field rồi hén. Code của bạn viết cho Length dài vậy rồi, đến lúc viết cho các thứ khác thì chắc mệt lắm..

- Không cần phải load code của bạn để sử dụng hiệu ứng. Chỉ cần dùng bản CAD hỗ trợ Field là đủ.

- Có thể tự sửa công thức nếu thích. Mà Format của kết quả cũng được linh động

...

 

5. Với lại hình như cái code có vấn đề hay sao đó, hồi lâu lâu ket test thử thấy nó không cập nhật ngay, phải chờ mình thay đổi đối tượng. Không tính toàn bộ Pline (hình như tính có 1 segment thôi). Và nếu muốn sửa thì mình chịu chết ^^

 

6. Cám ơn bạn vì sự sáng tạo. Mình học được nhiều trong code này, nhưng cũng chưa viết được cái j mới cả ^^ Tạm để đó đã ^^

Có vài thông tin hay.


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


#17 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 September 2014 - 12:37 PM

Nói chung không có ý tranh luận làm gì, đơn giản là thấy field khó xài hơn reactor nên dùng reactor.

Nếu có ai rành về field và lisp thì làm thử bài toán trên để tôi được mở rộng tầm mắt.

 

Search nhẹ cái ra ngay này Tot77, ket post luôn code nhé ^^

 

;;--------------------=={ Length Field }==--------------------;;
;;                                                            ;;
;;  Creates an MText Field referencing the sum of the lengths ;;
;;  of selected objects.                                      ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;

(defun c:LenField ( / acdoc acspc format pt ss )

  (setq format "%lu6%qf1") ;; Field Formatting

  (setq acdoc (vla-get-activedocument (vlax-get-acad-object))
        acspc (vlax-get-property acdoc (if (= 1 (getvar 'CVPORT)) 'Paperspace 'Modelspace))
  )  
  (if
    (and
      (ssget '((0 . "LINE,*POLYLINE")))
      (setq pt (getpoint "\nPick Point for Field: "))
    )
    (
      (lambda ( ss fld )
        (vlax-for obj ss
          (setq fld
            (strcat fld "%<\\AcObjProp Object(%<\\_ObjId "
              (LM:GetObjectID acdoc obj) ">%).Length>% + "
            )
          )
        )
        (vla-addMText acspc (vlax-3D-point (trans pt 1 0)) 0.
          (setq fld
            (strcat
              (substr fld 1
                (- (strlen fld) (if (< 1 (vla-get-Count ss)) 3 5))
              )
              " \\f \"" format "\">%"
            )
          )
        )
        (vla-delete ss)
      )
      (setq ss (vla-get-ActiveSelectionSet acdoc))
      (if (< 1 (vla-get-Count ss)) "%<\\AcExpr " "")
    )
  )
  (princ)
)

;;-------------------=={ Get ObjectID }==---------------------;;
;;                                                            ;;
;;  Returns the ObjectID string for the supplied VLA-Object   ;;
;;------------------------------------------------------------;;
;;  Author: Lee Mac, Copyright © 2011 - www.lee-mac.com       ;;
;;------------------------------------------------------------;;
;;  Arguments:                                                ;;
;;  doc - VLA Document Object (req'd for 64-bit systems)      ;;
;;  obj - VLA Object to query                                 ;;
;;------------------------------------------------------------;;
;;  Returns:  ObjectID string for VLA-Object                  ;;
;;------------------------------------------------------------;;

(defun LM:GetObjectID ( doc obj )
  (if (vl-string-search "64" (getenv "PROCESSOR_ARCHITECTURE"))
    (vlax-invoke-method (vla-get-Utility doc) 'GetObjectIdString obj :vlax-false)
    (itoa (vla-get-Objectid obj))
  )
)

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#18 Tot77

Tot77

    biết lệnh adcenter

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

Đã gửi 16 September 2014 - 01:27 PM

 Cái này của Lee  Mac cũng chỉ là quan hệ dạng 1 <-> 1 như cái list c:LL ở #1 thôi, chứ không phải dạng n <-> n, chỉ tính tổng chiều dài pline chứ không tính từng segment, vả lại cũng không  thấy LM nhét biểu thức lisp vào. 


  • 0

#19 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 September 2014 - 04:00 PM

Gần như không hiểu ý Tot77 luôn. Ket dừng ý kiến tại đây ^_^

 

Mấy bạn giúp mình làm 1 lisp đo độ dài của nhiều đoạn thẳng và tự động cập nhật vào text hộ mình với cảm ơn các bạn nhiều


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#20 hung_xu20032000

hung_xu20032000

    biết vẽ ellipse

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

Đã gửi 16 September 2014 - 10:25 PM

http://www.cadviet.c...0_dtich_v_1.rar và http://www.cadviet.c.../8800_tkh_1.rar các bác hộ e với. E xin cảm ơn. Lisp của e như sau. Đánh "V" sẽ ra diện tích vùng bao và diện tích hatch theo vùng bao tự điền diện tích vào text đã có. 


  • -1