Author Topic: The block aligns the block according to the text number + the insertion point!  (Read 1904 times)

0 Members and 1 Guest are viewing this topic.

well20152016

  • Newt
  • Posts: 130
The block aligns the block according to the text number + the insertion point!
« Last Edit: August 15, 2017, 06:44:44 AM by well20152016 »

kdub_nz

  • Mesozoic keyThumper
  • SuperMod
  • Water Moccasin
  • Posts: 2125
  • class keyThumper<T>:ILazy<T>
Nice interesting little project.

How many sets do you need to arrange ?
How many in each set usually ?

Is this ongoing repeat work or only for one project ?

Are the item ID numbers always sequential ?
I assume the corner ID numbers and the plate ID's don't repeat ?

Your detail does not actually join the edges, if so, what gap is required ?

I assume you want to select ALL the items in one arrangement and have the program put the assembly together automatically ?

Regards,


added:
Are there always only 4 numbered points per item ?
Called Kerry in my other life
Retired; but they dragged me back in !

I live at UTC + 13.00

---
some people complain about loading the dishwasher.
Sometimes the question is more important than the answer.

well20152016

  • Newt
  • Posts: 130
If the situation is perfect,There may be 2 / 4 / 6 / 8... Number sub items

fools

  • Newt
  • Posts: 72
  • China
Code: [Select]
;;Multi block near alignment
;;Author: Fools, 2017.8.12
;;Just for practice
(DEFUN C:RefAlign (/ ANG ELST ENT2 LST1 LST2 MAT PTS1 PTS2 SSG)
  (SETQ ssg (SSGET '((0 . "INSERT"))))
  (SETQ elst (F-Ss2Lst ssg))
  ;;Sort by X axis
  (SETQ elst (VL-SORT elst '(LAMBDA (x1 x2) (< (CAR (F-Dxf 10 (ENTGET x1))) (CAR (F-Dxf 10 (ENTGET x2)))))))
  (WHILE elst
    ;;First BlockReference
    (SETQ lst1 (F-BlockPtToRef (CAR elst)))
    (IF (SETQ ent2 (CADR elst))
      (PROGN ;;Second BlockReference
     (SETQ lst2 (F-BlockPtToRef (CADR elst)))
     ;;交集-返2 (same number on Second)
     (SETQ pts2 (F-Change (MAPCAR 'CADR (VL-REMOVE-IF-NOT '(LAMBDA (x) (ASSOC (CAR x) lst1)) lst2))))
     ;;交集-返1 (same number on First)
     (SETQ pts1 (F-Change (MAPCAR 'CADR (VL-REMOVE-IF-NOT '(LAMBDA (x) (ASSOC (CAR x) lst2)) lst1))))
     (SETQ pts1 (F-Polar pts1)) ;_offset 300
     ;;Rotate angle
     (SETQ ang (- (APPLY 'ANGLE pts1) (APPLY 'ANGLE pts2)))
     ;;Trans to 0,0  -> Rotate  -> Trans from 0,0
     (SETQ mat (MAT:mxm (Mat:Tv (CAR pts1)) (MAT:mxm (Mat:Rz ang) (Mat:Tv (MAPCAR '- (CAR pts2))))))
     (VLA-TRANSFORMBY (VLAX-ENAME->VLA-OBJECT ent2) (VLAX-TMATRIX mat))
      )
    )
    (SETQ elst (CDR elst))
  )
  (PRINC)
)

;;偏移300
;;offset 300
(DEFUN F-Polar (pts / ang)
  (SETQ ang (- (APPLY 'ANGLE pts) (* 0.5 PI)))
  (MAPCAR '(LAMBDA (x) (POLAR x ang 300.)) pts)
)

;;调整Y值较小点为起点
;;Sort by Y axis
(DEFUN F-Change (pts)
  (IF (MINUSP (CADR (APPLY 'MAPCAR (CONS '- pts))))
    pts
    (REVERSE pts)
  )
)

;;将图块定义中的点坐标转换为图块实例处的世界坐标
;;Trans block pt to wcs
(DEFUN F-BlockPtToRef (BlockRef / ENTLST LST MAT)
  (SETQ entlst (ENTGET BlockRef))
  (SETQ lst (F-BlockEnts BlockRef))
  (SETQ mat (MAT:RefGeom BlockRef))
  (MAPCAR '(LAMBDA (x) (LIST (CAR x) (CAR (LM:ApplyMatrixTransformation (CDR x) (CAR mat) (CADR mat)))))
  lst
  )
)

;;DXF
(DEFUN F-Dxf (num lst) (CDR (ASSOC num lst)))

;;遍历图块
;;Block Table
(DEFUN F-BlockEnts (BlockRef / ename entlst outlst)
  (SETQ ename (CDR (ASSOC -2 (TBLSEARCH "BLOCK" (CDR (ASSOC 2 (ENTGET BlockRef)))))))
  (SETQ outlst nil)
  (WHILE ename
    (SETQ entlst (ENTGET ename))
    (IF (= "TEXT" (CDR (ASSOC 0 entlst)))
      (SETQ outlst (CONS (LIST (F-Dxf 1 entlst) (F-Dxf 10 entlst)) outlst))
    )
    (SETQ ename (ENTNEXT ename))
  )
  outlst
)

;;ssget -> list
(DEFUN F-Ss2Lst (ss / n lst)
  (SETQ lst nil)
  (REPEAT (SETQ n (SSLENGTH ss)) (SETQ lst (CONS (SSNAME ss (SETQ n (1- n))) lst)))
  lst
)

;;;-----------------------------------------------------------;;
;;; 矩阵转置                                                  ;;
;;; MAT:trp Transpose a matrix -Doug Wilson-                  ;;
;;; 输入:矩阵                                                ;;
;;; 输出:转置后的矩阵                                        ;;
;;;-----------------------------------------------------------;;
(DEFUN MAT:trp (m) (APPLY 'MAPCAR (CONS 'LIST m)))

;;;-----------------------------------------------------------;;
;;; 矩阵相乘                                                  ;;
;;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky-      ;;
;;;-----------------------------------------------------------;;
(DEFUN MAT:mxm (m q) (MAPCAR (FUNCTION (LAMBDA (r) (MAT:mxv (MAT:trp q) r))) m))

;;;-----------------------------------------------------------;;
;;; 向量或点的矩阵变换(向量乘矩阵)                            ;;
;;; Matrix x Vector - Vladimir Nesterovsky                    ;;
;;; Args: m - nxn matrix, v - vector in R^n                   ;;
;;;-----------------------------------------------------------;;
(DEFUN MAT:mxv (m v) (MAPCAR (FUNCTION (LAMBDA (r) (APPLY '+ (MAPCAR '* r v)))) m))

;;矩阵绕Z轴旋转
;;Rotate around the Z axis
(DEFUN Mat:Rz (ang)
  (LIST (LIST (COS ang) (- (SIN ang)) 0. 0.)
(LIST (SIN ang) (COS ang) 0. 0.)
'(0. 0. 1. 0.)
'(0. 0. 0. 1.)
  )
)

;;;-----------------------------------------------------------;;
;;; 平移变换矩阵方式       ;;
;;; 参数:       ;;
;;; v - 位移矢量                                              ;;
;;;-----------------------------------------------------------;;
;;;---------------=={ Translate by Matrix }==-----------------;;
;;;                                                           ;;
;;; Translation Matrix                                        ;;
;;;-----------------------------------------------------------;;
;;; Author: highflybird, Copyright ? 2012                     ;;
;;;-----------------------------------------------------------;;
;;; Arguments:                                                ;;
;;; v  - Displacement vector by which to translate            ;;
;;;-----------------------------------------------------------;;
(DEFUN Mat:Tv (v)
  (LIST (LIST 1. 0. 0. (CAR v)) (LIST 0. 1. 0. (CADR v)) (LIST 0. 0. 1. (CADDR v)) '(0. 0. 0. 1.))
)

;;;-----------------------------------------------------------;;
;;; 功能:图块的变换矩阵                                      ;;
;;; 输入:块参照的图元名                                      ;;
;;; 输出:块参照的变换矩阵                                    ;;
;;;-----------------------------------------------------------;;
;;; MAT:RefGeom (gile)       ;;
;;; Returns a list which first item is a 3x3 transformation   ;;
;;; matrix(rotation,scales normal) and second item the object ;;
;;; insertion point in its parent(xref, bloc or space)       ;;
;;;       ;;
;;; Argument : an ename       ;;
;;;-----------------------------------------------------------;;
(DEFUN MAT:RefGeom (ename / elst ang norm mat)
  (SETQ elst (ENTGET ename)
ang  (CDR (ASSOC 50 elst))
norm (CDR (ASSOC 210 elst))
  )
  (LIST (SETQ mat (MAT:mxm (MAPCAR (FUNCTION (LAMBDA (v) (TRANS v 0 norm T))) '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0)))
   (MAT:mxm (LIST (LIST (COS ang) (- (SIN ang)) 0.0) (LIST (SIN ang) (COS ang) 0.0) '(0.0 0.0 1.0))
    (LIST (LIST (CDR (ASSOC 41 elst)) 0.0 0.0)
  (LIST 0.0 (CDR (ASSOC 42 elst)) 0.0)
  (LIST 0.0 0.0 (CDR (ASSOC 43 elst)))
    )
   )
  )
)
(MAPCAR '-
(TRANS (CDR (ASSOC 10 elst)) norm 0)
(MAT:mxv mat (CDR (ASSOC 10 (TBLSEARCH "BLOCK" (CDR (ASSOC 2 elst))))))
)
  )
)

;;;-----------------------------------------------------------;;
;;; 变换函数               ;;
;;; 参数:       ;;
;;; target - vla-object 或者点                                ;;
;;; matrix - 3x3 矩阵                                         ;;
;;; vector - 移动向量                                         ;;
;;;-----------------------------------------------------------;;
;;;----------=={ Apply Matrix Transformation }==--------------;;
;;;                                                           ;;
;;; Transforms a VLA-Object or Point List using a             ;;
;;; Transformation Matrix                                     ;;
;;;-----------------------------------------------------------;;
;;; Author: Lee Mac, Copyright ? 2010 - www.lee-mac.com       ;;
;;;-----------------------------------------------------------;;
;;; Arguments:                                                ;;
;;; target - VLA-Object or Point List to Transform            ;;
;;; matrix - 3x3 Matrix by which to Transform object          ;;
;;; vector - 3D translation vector                            ;;
;;;-----------------------------------------------------------;;
(DEFUN LM:ApplyMatrixTransformation (target matrix vector)
  (COND ((EQ 'VLA-OBJECT (TYPE target))
(VLA-TRANSFORMBY
   target
   (VLAX-TMATRIX
     (APPEND (MAPCAR (FUNCTION (LAMBDA (x v) (APPEND x (LIST v)))) matrix vector) '((0. 0. 0. 1.)))
   )
)
)
((LISTP target)
(MAPCAR (FUNCTION (LAMBDA (point) (MAPCAR '+ (MAT:mxv matrix point) vector))) target)
)
  )
)

(PRINC "\nType RefAlign to start!")
(PRINC)
Good good study , day day up . Sorry about my Chinglish .

ronjonp

  • Needs a day job
  • Posts: 7526
Very nice  8)

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

well20152016

  • Newt
  • Posts: 130
Very nice   !THANK!

fools

  • Newt
  • Posts: 72
  • China
@Ronjonp, Thanks for your encouragement.
@Well20152016, Glad to help you.
 :-)
Good good study , day day up . Sorry about my Chinglish .

well20152016

  • Newt
  • Posts: 130
A difficult example?