Author Topic: Where model space xref is shown on paper  (Read 1504 times)

0 Members and 1 Guest are viewing this topic.

kruuger

  • Swamp Rat
  • Posts: 635
Where model space xref is shown on paper
« on: February 05, 2014, 09:55:05 AM »
hello swampers,


for example: someone make a layout and thru viewport show xref from model.
now i open the drawing and i want quickly go to layout where xref occurs.


any ideas how to do this (just pseudo code) ?


thanks
kruuger

CAB

  • Global Moderator
  • Seagull
  • Posts: 10401
Re: Where model space xref is shown on paper
« Reply #1 on: February 05, 2014, 11:46:56 AM »
Humm  you must have a lot of Tabs.
I would use bread crumbs.

Save xdata pointer to the tab number or name.

I've reached the age where the happy hour is a nap. (°¿°)
Windows 10 core i7 4790k 4Ghz 32GB GTX 970
Please support this web site.

kruuger

  • Swamp Rat
  • Posts: 635
Re: Where model space xref is shown on paper
« Reply #2 on: February 05, 2014, 12:04:32 PM »
Humm  you must have a lot of Tabs.
I would use bread crumbs.

Save xdata pointer to the tab number or name.
sometimes it is 20-30 layout. maybe not too much but dwg is heavy with a lot of xrefs. skipping between layout is a pain.


xdata will work but we need additional tool for that. what if someone move viewport to another layout ?


i think the only option is:
- read all vports
- create outlines for every vports
- then user select point (in model) and program will check if point is inside at any border (layout)
kruuger


ronjonp

  • Needs a day job
  • Posts: 7529
Re: Where model space xref is shown on paper
« Reply #3 on: February 06, 2014, 10:50:07 AM »
Give this a try. Pick a point in modelspace near your items and it activates the paperspace tab with the corresponding viewport. I'm sure it could be improved upon as I ran out of time ( today ).  ;D

Code: [Select]
;; RJP 02.06.2014
(defun c:pt2tab   (/ _dxf _getvports out p vp x)
  (defun _getvports (/ _scale a b c lst ss)
    (defun _scale (ename)
      (if (and ename (= (type ename) 'ename))
   (/ 1. (vla-get-customscale (vlax-ename->vla-object ename)))
      )
    )
    (defun _dxf   (code ename)
      (if (and ename (= (type ename) 'ename))
   (cdr (assoc code (entget ename '("*"))))
      )
    )
    ;; Original code by CAB
    ;; Modified by RJP
    (if   (setq ss (ssget "_x" '((0 . "VIEWPORT"))))
      (foreach e (mapcar 'cadr (ssnamex ss))
   ;; Paper space block
   (if (and (setq a (_dxf 330 e))
       ;; Layout
       (setq b (_dxf 340 a))
       ;; Viewport not wanted
       (setq c (_dxf 331 b))
       )
     (or (equal c e)
         ;; List of taborder, VP ename, tabname, MS center, MS width, MS height
         (setq lst   (cons (list (_dxf 71 b)
                e
                (_dxf 410 e)
                (_dxf 12 e)
                (* (_scale e) (/ (_dxf 40 e) 2.))
                (* (_scale e) (/ (_dxf 41 e) 2.))
               )
               lst
         )
         )
     )
   )
      )
    )
    ;;Sort the list by taborder left to right
    (mapcar 'cdr (vl-sort lst (function (lambda (x y) (< (car x) (car y))))))
  )
  ;; (_getvports)
  (cond
    ((zerop (getvar 'tilemode)) (alert "This program needs to be used in modelspace..."))
    ((null (setq vp (_getvports))) (alert "No paperspace viewports in drawing..."))
    ((null (setq p (getpoint "\nPick a point: "))) (princ "\nBye..."))
    ((null (setq out (vl-remove-if-not
             '(lambda   (x)
           ;; X and Y of picked point within VP
           (and (equal (car p) (car (caddr x)) (nth 3 x))
                (equal (cadr p) (cadr (caddr x)) (last x))
           )
         )
             vp
           )
      )
     )
     (alert "No corresponding paperspace viewport found...")
    )
    ((= (length out) 1)
     (princ (strcat "\nOne viewport found on tab " (cadr (car out))))
     (setvar 'ctab (cadr (car out)))
     (redraw (caar out) 3)
    )
    ((and (> (length out) 1) (vl-every '(lambda (x) (eq x (cadr (car out)))) (mapcar 'cadr out)))
     (princ (strcat "\nMultiple viewports found on tab " (cadr (car out))))
     (setvar 'ctab (cadr (car out)))
     (mapcar '(lambda (x) (redraw x 3)) (mapcar 'car out))
    )
    ((alert (strcat "Multiple tabs found...\n"
          (apply 'strcat (mapcar '(lambda (x) (strcat x "\n")) (mapcar 'cadr out)))
       )
     )
    )
  )
  (princ)
)

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

kruuger

  • Swamp Rat
  • Posts: 635
Re: Where model space xref is shown on paper
« Reply #4 on: February 06, 2014, 04:34:00 PM »
Give this a try. Pick a point in modelspace near your items and it activates the paperspace tab with the corresponding viewport. I'm sure it could be improved upon as I ran out of time ( today ).  ;D

Code: [Select]
;; RJP 02.06.2014
(defun c:pt2tab   (/ _dxf _getvports out p vp x)
  (defun _getvports (/ _scale a b c lst ss)
    (defun _scale (ename)
      (if (and ename (= (type ename) 'ename))
   (/ 1. (vla-get-customscale (vlax-ename->vla-object ename)))
      )
    )
    (defun _dxf   (code ename)
      (if (and ename (= (type ename) 'ename))
   (cdr (assoc code (entget ename '("*"))))
      )
    )
    ;; Original code by CAB
    ;; Modified by RJP
    (if   (setq ss (ssget "_x" '((0 . "VIEWPORT"))))
      (foreach e (mapcar 'cadr (ssnamex ss))
   ;; Paper space block
   (if (and (setq a (_dxf 330 e))
       ;; Layout
       (setq b (_dxf 340 a))
       ;; Viewport not wanted
       (setq c (_dxf 331 b))
       )
     (or (equal c e)
         ;; List of taborder, VP ename, tabname, MS center, MS width, MS height
         (setq lst   (cons (list (_dxf 71 b)
                e
                (_dxf 410 e)
                (_dxf 12 e)
                (* (_scale e) (/ (_dxf 40 e) 2.))
                (* (_scale e) (/ (_dxf 41 e) 2.))
               )
               lst
         )
         )
     )
   )
      )
    )
    ;;Sort the list by taborder left to right
    (mapcar 'cdr (vl-sort lst (function (lambda (x y) (< (car x) (car y))))))
  )
  ;; (_getvports)
  (cond
    ((zerop (getvar 'tilemode)) (alert "This program needs to be used in modelspace..."))
    ((null (setq vp (_getvports))) (alert "No paperspace viewports in drawing..."))
    ((null (setq p (getpoint "\nPick a point: "))) (princ "\nBye..."))
    ((null (setq out (vl-remove-if-not
             '(lambda   (x)
           ;; X and Y of picked point within VP
           (and (equal (car p) (car (caddr x)) (nth 3 x))
                (equal (cadr p) (cadr (caddr x)) (last x))
           )
         )
             vp
           )
      )
     )
     (alert "No corresponding paperspace viewport found...")
    )
    ((= (length out) 1)
     (princ (strcat "\nOne viewport found on tab " (cadr (car out))))
     (setvar 'ctab (cadr (car out)))
     (redraw (caar out) 3)
    )
    ((and (> (length out) 1) (vl-every '(lambda (x) (eq x (cadr (car out)))) (mapcar 'cadr out)))
     (princ (strcat "\nMultiple viewports found on tab " (cadr (car out))))
     (setvar 'ctab (cadr (car out)))
     (mapcar '(lambda (x) (redraw x 3)) (mapcar 'car out))
    )
    ((alert (strcat "Multiple tabs found...\n"
          (apply 'strcat (mapcar '(lambda (x) (strcat x "\n")) (mapcar 'cadr out)))
       )
     )
    )
  )
  (princ)
)
WOW! :) fantastic
this is how we can deal with multitabs

Code: [Select]
    ( T
      ;(alert
      ;  (strcat "Multiple tabs found...\n"
      ;    (apply 'strcat (mapcar '(lambda (x) (strcat x "\n")) (mapcar 'cadr out)))
      ;  )
      ;)
       (cd:DCL_StdListDialog
         (setq tab (mapcar 'cadr out))
         0
         "List of Layouts" "Select layout:"
         30 15 2 13 (list "&Ok" "&Cancel")
         nil T T
        '(setvar "ctab" (nth (atoi res) tab))
       )
    )
thanks ronjonp

ronjonp

  • Needs a day job
  • Posts: 7529
Re: Where model space xref is shown on paper
« Reply #5 on: February 06, 2014, 09:35:58 PM »
Glad to help  8)

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC