Jump to content

Lisp for Revision Box - Need help


woodman78

Recommended Posts

Hi all. Hope everyone is good this Wednesday afternoon.

 

I am hoping someone can help with me with a lisp I copied and modified from the Afralisp site to allow the revision box on our titleblock to be filled in and altered. Until now I had it setup as a dynamic block with attributes and visibility states to control the number of lines shown.

 

I have a few issues with this I am trying to get over.

rev-box.dwg

 

Firstly, the dialog box:

Revision Box 01.png

Lines 1 - 8 contain text inline. I want to remove that and move it to the top of each column as I have shown but I can't get the text to line up. I removed the text from line 9 but now it seems alot more spaced out.

 

The revision box looks like this.

Revision Box.jpg

I am wondering how to control the number of lines to be shown. I was thinking of using a layer for each line and control it that way but I was wondering if it can be detected what line is empty and display to the line before it. So an automatic way of controlling the lines.

 

Another problem is that the code contains the block name. When I put the name of the block into the code it won't detect it but if I use the reference like *U55 then it will but that is a temporary name that changes so I get caught out. Anyone able to help with this?

 

The last thing is the first column on the dialog box. I want to be able to control whether the changes are applied to the current layout only or to all layouts so in other words only the blocks on the current tab on to all the blocks within the drawing. How do I go about this?

 

I will include the code in the following posts. I would appreciate help with this. Thanks.

Edited by woodman78
Block naming issue
Link to comment
Share on other sites

  • Replies 78
  • Created
  • Last Reply

Top Posters In This Topic

  • woodman78

    42

  • pBe

    28

  • asos2000

    3

  • Lt Dan's legs

    3

Top Posters In This Topic

Posted Images

attab : dialog {
       label = "Drawing Title Block";
: boxed_radio_column { 
label = "Application" ;				//give it a label
: row  {
	 : radio_button {			//define radion button
    	  	key = "rb1" ;			//give it a name
    	  	label = "Apply to Current Layout ONLY" ;	//give it a label
    	 	value = "1" ;			//switch it on
      		 }
	 : radio_button {			//define radion button
    	  	key = "rb2" ;			//give it a name
    	  	label = "Apply to All Layouts" ;	//give it a label
      		 }		
}
}
: boxed_column {      
label = "Revision Data" ;				//give it a label
: row {
		: text {label = "Rev";}
	: text {label = "By";}
	: text {label = "Date";}
	: text {label = "Description";}
}
: row  {
	: edit_box { label = "9.";         key = "L1-Rev";  edit_limit = 2;  edit_width = 2;  }
       		: edit_box { key = "L1-By" ;  edit_limit = 3;  edit_width = 3;  }
       		: edit_box { key = "L1-Date"; edit_limit = 10; edit_width = 9;  }
       		: edit_box { key = "L1-Description";  edit_limit = 55; edit_width = 58; }
}
: row  {
      		: edit_box { label = "8.";         key = "L2-Rev";  edit_limit = 2;  edit_width = 2;  }
       		: edit_box { label = "By" ;         key = "L2-By" ;  edit_limit = 3;  edit_width = 3;  }
       		: edit_box { label = "Date";        key = "L2-Date"; edit_limit = 10; edit_width = 9;  }
       		: edit_box { label = "Description"; key = "L2-Description";  edit_limit = 55; edit_width = 58; }
     	 }
      	: row  {
        		: edit_box { label = "7.";         key = "L3-Rev";  edit_limit = 2;  edit_width = 2;  }
        		: edit_box { label = "By" ;         key = "L3-By" ;  edit_limit = 3;  edit_width = 3;  }
        		: edit_box { label = "Date";        key = "L3-Date"; edit_limit = 10; edit_width = 9;  }
        		: edit_box { label = "Description"; key = "L3-Description";  edit_limit = 55; edit_width = 58; }
      	}
      	: row  {
        		: edit_box { label = "6.";         key = "L4-Rev";  edit_limit = 2;  edit_width = 2;  }
        		: edit_box { label = "By" ;         key = "L4-By" ;  edit_limit = 3;  edit_width = 3;  }
        		: edit_box { label = "Date";        key = "L4-Date"; edit_limit = 10; edit_width = 9;  }
        		: edit_box { label = "Description"; key = "L4-Description";  edit_limit = 55; edit_width = 58; }
      	}
      	: row  {
        		: edit_box { label = "5.";         key = "L5-Rev";  edit_limit = 2;  edit_width = 2;  }
       		: edit_box { label = "By" ;         key = "L5-By" ;  edit_limit = 3;  edit_width = 3;  }
        		: edit_box { label = "Date";        key = "L5-Date"; edit_limit = 10; edit_width = 9;  }
        		: edit_box { label = "Description"; key = "L5-Description";  edit_limit = 55; edit_width = 58; }
     	 }
      	: row  {
        		: edit_box { label = "4.";         key = "L6-Rev";  edit_limit = 2;  edit_width = 2;  }
        		: edit_box { label = "By" ;         key = "L6-By" ;  edit_limit = 3;  edit_width = 3;  }
        		: edit_box { label = "Date";        key = "L6-Date"; edit_limit = 10; edit_width = 9;  }
        		: edit_box { label = "Description"; key = "L6-Description";  edit_limit = 55; edit_width = 58; }
     	 }
      	: row  {
        		: edit_box { label = "3.";         key = "L7-Rev";  edit_limit = 2;  edit_width = 2;  }
        		: edit_box { label = "By" ;         key = "L7-By" ;  edit_limit = 3;  edit_width = 3;  }
        		: edit_box { label = "Date";        key = "L7-Date"; edit_limit = 10; edit_width = 9;  }
        		: edit_box { label = "Description"; key = "L7-Description";  edit_limit = 55; edit_width = 58; }
      	}
      	: row  {
        		: edit_box { label = "2.";         key = "L8-Rev";  edit_limit = 2;  edit_width = 2;  }
        		: edit_box { label = "By" ;         key = "L8-By" ;  edit_limit = 3;  edit_width = 3;  }
        		: edit_box { label = "Date";        key = "L8-Date"; edit_limit = 10; edit_width = 9;  }
        		: edit_box { label = "Description"; key = "L8-Description";  edit_limit = 55; edit_width = 58; }
      	}
      	: row  {
        		: edit_box { label = "1.";         key = "L9-Rev";  edit_limit = 2;  edit_width = 2;  }
       		: edit_box { label = "By" ;         key = "L9-By" ;  edit_limit = 3;  edit_width = 3;  }
        		: edit_box { label = "Date";        key = "L9-Date"; edit_limit = 10; edit_width = 9;  }
        		: edit_box { label = "Description"; key = "L9-Description";  edit_limit = 55; edit_width = 58; }
     	}
}
             : row  {
	ok_cancel ;				//predifined OK/Cancel
    	}
 	}

Link to comment
Share on other sites

Add an additional button "Next" that jumps to a identical dialog box with the numbering starting at 10... Just a thought

Link to comment
Share on other sites

;CODING STARTS HERE
(prompt "\nATTAB Loaded....Type ATTAB to run.....")
(defun c:attab (/)
(setq ss1 (ssget "X" '((0 . "INSERT")(66 . 1))))
 (if ss1
   (progn
     (setq count 0
    emax  (sslength ss1)
     )
     (while (< count emax)
(setq en   (ssname ss1 count)
      ed   (entget en)
      blkn (dxf 2 ed)
)
(if (= "*U54" blkn)
  (setq	count emax
	found T
  )
 	(setq count (1+ count))
);if
     );while
     (if found
(ddisplay)

;cannot find our block
(alert
  "\nDrawing Sheet has No Attributes
           \n     Use Manual Edit"
)
     );if
   );progn
   (alert
     "\nIncorrect Drawing Sheet
     \n    Use Manual Edit"
   )
 );if
(princ)
);defun

;;;**********************************************************

(defun ddisplay (/)
 	(setq dcl_id (load_dialog "attab.dcl"))
 	(if (not (new_dialog "attab" dcl_id))
   	(exit)
 	);if
(setq edata (entget en))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L1-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L1-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L1-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L1-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L2-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L2-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L2-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L2-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L3-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
 	  (setq L3-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L3-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L3-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L4-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L4-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L4-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L4-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L5-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L5-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L5-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L5-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
 (setq L6-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L6-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L6-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L6-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L7-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L7-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L7-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L7-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L8-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L8-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L8-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L8-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L9-Rev (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L9-By (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L9-Date (dxf 1 edata))
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq L9-Description (dxf 1 edata))
       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (set_tile "L1-Rev" L1-Rev)
 (set_tile "L1-By" L1-By)
 (set_tile "L1-Date" L1-Date)
 (set_tile "L1-Description" L1-Description)
 (set_tile "L2-Rev" L2-Rev)
 (set_tile "L2-By" L2-By)
 (set_tile "L2-Date" L2-Date)
 (set_tile "L2-Description" L2-Description)
 (set_tile "L3-Rev" L3-Rev)
 (set_tile "L3-By" L3-By)
 (set_tile "L3-Date" L3-Date)
 (set_tile "L3-Description" L3-Description)
 (set_tile "L4-Rev" L4-Rev)
 (set_tile "L4-By" L4-By)
 (set_tile "L4-Date" L4-Date)
 (set_tile "L4-Description" L4-Description)
 (set_tile "L5-Rev" L5-Rev)
 (set_tile "L5-By" L5-By)
 (set_tile "L5-Date" L5-Date)
 (set_tile "L5-Description" L5-Description)
 (set_tile "L6-Rev" L6-Rev)
 (set_tile "L6-By" L6-By)
 (set_tile "L6-Date" L6-Date)
 (set_tile "L6-Description" L6-Description)
 (set_tile "L7-Rev" L7-Rev)
 (set_tile "L7-By" L7-By)
 (set_tile "L7-Date" L7-Date)
 (set_tile "L7-Description" L7-Description)
 (set_tile "L8-Rev" L8-Rev)
 (set_tile "L8-By" L8-By)
 (set_tile "L8-Date" L8-Date)
 (set_tile "L8-Description" L8-Description)
 (set_tile "L9-Rev" L9-Rev)
 (set_tile "L9-By" L9-By)
 (set_tile "L9-Date" L9-Date)
 (set_tile "L9-Description" L9-Description)

 (mode_tile "L1-Rev" 2)


 (action_tile
   "cancel"
   "(done_dialog) (setq userclick nil)"
 )

 ;if OK selected, retrieve the tile values
 (action_tile
   "accept"
   (strcat
     "(progn (setq L1-Reva (get_tile \"L1-Rev\"))"
     "(setq L1-Bya (get_tile \"L1-By\"))"
     "(setq L1-Datea (get_tile \"L1-Date\"))"
     "(setq L1-Descriptiona (get_tile \"L1-Description\"))"
     "(setq L2-Reva (get_tile \"L2-Rev\"))"
     "(setq L2-Bya (get_tile \"L2-By\"))"
     "(setq L2-Datea (get_tile \"L2-Date\"))"
     "(setq L2-Descriptiona (get_tile \"L2-Description\"))"
     "(setq L3-Reva (get_tile \"L3-Rev\"))"
     "(setq L3-Bya (get_tile \"L3-By\"))"
     "(setq L3-Datea (get_tile \"L3-Date\"))"
     "(setq L3-Descriptiona (get_tile \"L3-Description\"))"
     "(setq L4-Reva (get_tile \"L4-Rev\"))"
     "(setq L4-Bya (get_tile \"L4-By\"))"
     "(setq L4-Datea (get_tile \"L4-Date\"))"
     "(setq L4-Descriptiona (get_tile \"L4-Description\"))"
     "(setq L5-Reva (get_tile \"L5-Rev\"))"
     "(setq L5-Bya (get_tile \"L5-By\"))"
     "(setq L5-Datea (get_tile \"L5-Date\"))"
     "(setq L5-Descriptiona (get_tile \"L5-Description\"))"
     "(setq L6-Reva (get_tile \"L6-Rev\"))"
     "(setq L6-Bya (get_tile \"L6-By\"))"
     "(setq L6-Datea (get_tile \"L6-Date\"))"
     "(setq L6-Descriptiona (get_tile \"L6-Description\"))"
     "(setq L7-Reva (get_tile \"L7-Rev\"))"
     "(setq L7-Bya (get_tile \"L7-By\"))"
     "(setq L7-Datea (get_tile \"L7-Date\"))"
     "(setq L7-Descriptiona (get_tile \"L7-Description\"))"
     "(setq L8-Reva (get_tile \"L8-Rev\"))"
     "(setq L8-Bya (get_tile \"L8-By\"))"
     "(setq L8-Datea (get_tile \"L8-Date\"))"
     "(setq L8-Descriptiona (get_tile \"L8-Description\"))"
     "(setq L9-Reva (get_tile \"L9-Rev\"))"
     "(setq L9-Bya (get_tile \"L9-By\"))"
     "(setq L9-Datea (get_tile \"L9-Date\"))"
     "(setq L9-Descriptiona (get_tile \"L9-Description\"))"

    " (done_dialog)(setq userclick T))"
   )
 )

 (start_dialog)

 (unload_dialog dcl_id)

 (if userclick

(progn
  (setq edata (entget en))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L1-Reva) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L1-Bya) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L1-Datea) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L1-Descriptiona) (assoc 1 edata) edata))
  (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L2-Reva) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L2-Bya) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L2-Datea) (assoc 1 edata) edata))
  (entmod el)

	  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L2-Descriptiona) (assoc 1 edata) edata))
  (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L3-Reva) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L3-Bya) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L3-Datea) (assoc 1 edata) edata))
               (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L3-Descriptiona) (assoc 1 edata) edata))
  (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L4-Reva) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L4-Bya) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L4-Datea) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L4-Descriptiona) (assoc 1 edata) edata))
  (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L5-Reva) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L5-Bya) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L5-Datea) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L5-Descriptiona) (assoc 1 edata) edata))
  (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L6-Reva) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L6-Bya) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L6-Datea) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L6-Descriptiona) (assoc 1 edata) edata))
               (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L7-Reva) (assoc 1 edata) edata))
  (entmod el)


               (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L7-Bya) (assoc 1 edata) edata))
               (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L7-Datea) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L7-Descriptiona) (assoc 1 edata) edata))
  (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L8-Reva) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L8-Bya) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L8-Datea) (assoc 1 edata) edata))
  (entmod el)

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L8-Descriptiona) (assoc 1 edata) edata))
  (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L9-Reva) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L9-Bya) (assoc 1 edata) edata))
  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L9-Datea) (assoc 1 edata) edata))
  	  (entmod el)


  (setq edata (entget (entnext (dxf -1 edata))))
  (setq el (subst (cons 1 L9-Descriptiona) (assoc 1 edata) edata))
  (entmod el)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  ;regen the drawing
         (command "REGEN")

);progn

  );if

(princ)

);defun

;;;***********************************************************

(defun dxf (code elist)

 (cdr (assoc code elist))

);defun
;;;**********************************************************

;load clean
(princ)

;;;**********************************************************
;
;CODING ENDS HERE

 

I would appreciate help with this. Thanks.

Link to comment
Share on other sites

Add another button next to ok_cancel in the attab dialog Example:

: row { ok_cancel; : button { key= "next"; label = "next"; fixed_width = true; }}

Copy the attab dialog, and call it attab2. This can be saved in the same file.

"L9-Date" becomes "L19-DATE" and etc.

 

In lisp, when you click on next

(action_tile "next" "(done_dialog 4)")

 

make sure add this when ending the lisp dialog

 

(setq flag (start_dialog))

(unload_dialog dcl_id)

(cond

( (eq flag 4)

...

now copy the previous section where you load the dialog and all its settings. Make sure you load attab2.

 

**Remember you've changed the keys so you'll have to revise the copied portion to reflect.

Link to comment
Share on other sites

Forgive me, I thought you wanted more lines for input... The, sun was in my eyes :oops:

 

 

I just didn't read your post

Edited by Lt Dan's legs
The truth
Link to comment
Share on other sites

Regarding Blcok name, How may Rev_Box block are you expecting to find on your drawing?

The way its written now.. it checks ALL blocks with attributes [iNSERT/66]

Then it process the selection till you find "REV_BLK", but in your case "*U54" which you already figured that its not always the case

So. if it is indeed 1 bllock. Depending on your current setup

 (setq ss1 (ssget "X" '((0 . "INSERT")(66 . 1)[color=blue][b](2 . "REV-BOX,`*U*")[/b][/color])))

That snippet will select ALL blocks with attributes that meet the condition i.e. "REV-BOX" and Anonymnous Block names (if any) . You can however add another filter

 (setq ss1 (ssget "X" '((0 . "INSERT")(66 . 1)(2 . "REV-BOX,`*U*")[color=blue][b](410 . "MODEL")[/b][/color])))

Selects REV-BOX (or Anonymous DB names) exclusively on Model Space or

 (setq ss1 (ssget "X" [color=blue][b](list[/b][/color] [b][color=blue]'[/color][/b](0 . "INSERT")[b][color=blue]'[/color][/b](66 . 1)[color=blue][b]'[/b][/color](2 . "REV-BOX,`*U*")[color=blue][b](cons 410  (getvar 'Ctab))))[/b][/color])

Selects REV-BOX (or Anonymous DB names) on current layout tab

 

So then:

 
(if (setq ss1 (ssget "X" '((0 . "INSERT")(66 . 1)(2 . "REV-BOX,`*U*")))) ;<-- again depending on your current setup
(progn
     (setq count 0  emax  (sslength ss1))
     (while (< count emax)
            (setq en   (ssname ss1 count) ed (entget en))
            (if [b][color=blue](eq  (strcase (vla-get-effectivename[/color][/b]
[b][color=blue]                         (vlax-ename->vla-object en))) "REV-BOX")[/color][/b]
                    (setq count emax found T)
    (setq count (1+ count))
                   )
           )
...... 
)
.....          

 

As for the DCL. i might need some time to disect your DCL . ;)

Link to comment
Share on other sites

I have an automated return routine and this is the part of coding i use to count and determine the coordinates of where my next rev is going to go. if you would like the entire file let me know.

 

(defun GetCord ()
(setq SS_Blk (ssget "X" (list (cons 0 "INSERT")(cons 2 "[color="red"]BLOCK NAME[/color]"))))
(if (= ss_blk nil)
(setq cord "[color="red"]DEFAULT COORD IF CNT IS NIL[/color]")
	(progn
	(setq Cnt (sslength ss_Blk))
		(cond
			((= cnt 1)(setq cord "[color="red"]INPUT COORDINATES[/color]"))
			((= cnt 2)(setq cord "[color="red"]INPUT COORDINATES[/color]"))
			((= cnt 3)(setq cord "[color="red"]INPUT COORDINATES[/color]"))
			((= cnt 4)(setq cord "[color="red"]INPUT COORDINATES[/color]"))
			((= cnt 5)(setq cord "[color="red"]INPUT COORDINATES[/color]"))
			((= cnt 6)(setq cord "[color="red"]INPUT COORDINATES[/color]"))
			((= cnt 7)(setq cord "[color="red"]INPUT COORDINATES[/color]"))
			((= cnt (setq cord "[color="red"]INPUT COORDINATES[/color]"))
			(t nil)
		);cond
	);progn
);if
);getcord

Link to comment
Share on other sites

pBe, Thanks for your help. I got the lisp to recognise the block using your first method. It turns out the name is case sensitive.

On your option to select the block on the current tab how it one select the blocks on all tabs?

Link to comment
Share on other sites

btraemoore, I like that. I could setup my block and drop them in as needed. How could I count? By taking the first blank attribute and setpping back one?

Link to comment
Share on other sites

pBe, Thanks for your help. I got the lisp to recognise the block using your first method. It turns out the name is case sensitive.

On your option to select the block on the current tab how it one select the blocks on all tabs?

 

Try this:

(defun _sel  (bn flg att )
     (setq lst (list '(0 . "insert")
                     (cons 2 (strcat bn ",`*U*"))
                     (cons 410
                           (if flg
                                 (getvar 'Ctab)
                                 "*"))))
     (ssget "x"
            (if att
                  (append lst '((66 . 1)))
                  lst))
     )

bn first argument - Block name (not case sensitive really)

flg second argument - T for current layout nil for All layout tab

att third argument - T for Attribute blocks only nil anything goes

 

(_sel "REV-BOX" T T) :

(_sel "REV-BOX" T nil) :

(_sel "REV-BOX" nil T) :

(_sel "REV-BOX" nil nil) :

 

(setq sel (_sel "REV-BOX" T T))

 

HTH

Edited by pBe
Link to comment
Share on other sites

i couldn't open the dwg's you attached, if you could save the format to 2006 i can open them and play around with the program you created... maybe add a few little perks and get it back to you. but the coding for my routine is below, maybe you can read through it and see if there is anything you can use... excuese the sloopyness of it, it was one of my first routines... (ignore the very short routines, my brother created a routine to shorten the code writing.)

;;;===============================================================================================
;;  Created by Trae Moore 04/03/2012
;   
;;
;;; This routine automates modifying the drawing portion of return process
;;  see notes below for function definitions.
;
;;
;;;==================================================================================================


;;; ================================================================================
;;  This function deletes all polylines on the "REV" layer. IE: "revclouds"
;   ================================================================================
(defun polydelete (/ ss_poly) 
       (setq ss_poly (ssget "X" (list (cons -4 "<OR")(cons 0 "POLYLINE")(cons 0 "LWPOLYLINE")(cons -4 "OR>")(cons 8 "REV")))) 
       (if SS_poly 
	(command "erase" SS_poly "") 
       );if 
);polydelete 


;;; ================================================================================
;;  Here we delete all "Revision triangles" and "Issued bug"
;   ================================================================================
(defun revdelete(/ ss_rev)
(setq ss_rev (ssget "X" (list (cons 0 "INSERT")(cons -4 "<OR")(cons 2 "REVTAG")(cons 2 "BUG")(cons 2 "APPROVAL")(cons -4 "OR>"))))
(if SS_rev
	(command "erase" SS_rev "")
);if
);revdelete


;;; ================================================================================
;;  Here we get the highest letter revision.
;   ================================================================================
(defun LetterRev()
(if (and (= ATT_NAME "REVNO")(> (ascii ATT_TEXT) 64)(< (ascii ATT_TEXT) 91))
	(if (> ATT_TEXT M_letter)(setq M_letter ATT_TEXT))
);if
);letterRev


;;; ================================================================================
;;  Here we get the highest number revision.
;   ================================================================================
(defun NumRev()
(if (and (= ATT_NAME "REVNO")(= (type (read ATT_TEXT)) 'INT))
	(if (> ATT_TEXT M_number)(setq M_number ATT_TEXT))
);if
);numRev




;;; ================================================================================
;;  Here we change the titleblock revision to M_number
;   ================================================================================
(defun titlechange()
(if (= ATT_NAME "DWGREV")
	(Mod_DXF ENT "TEXT" M_number)
);if
);titlechange


;;; ================================================================================
;;  Here we we call the functions for new drawing or an old drawing.
;   ================================================================================
(defun newold ()
(if (= M_number "-"); Setting the M_number to "-" is how we determine if were no number revisions
	;=============
	; and if true
	;=============
	(progn		
		(SETQ M_CHR M_LETTER)(SAVAR)
		(setq M_number "0")
		(polydelete)
		(revdelete)
		(Mod_SS "INSERT" "NAME" "APPROVAL" DELBUG)
	);progn
	;=============
	;or if false
	;=============
	(progn		
		(setq M_number (itoa (+ (atoi M_number) 1)))
		(Mod_SS "INSERT" "NAME" "REVTAG" CHGTRI)
		(Mod_SS "INSERT" "NAME" "APPROVAL" DELAPP)
		(Mod_SS "INSERT" "NAME" "BUG" DELBUG)
	);progn
);if
);newold


;;; ================================================================================
;;  Here we change all the revision triangles to the current M_rev
;   ================================================================================
(defun CHGTRI ()
(if (= ATT_NAME "REV#")
	(Mod_DXF ENT "TEXT" M_number)
);if
);CHGTRI


;;; ================================================================================
;;  Here we delete the approval bug, our old wfrevs and the stupid x over the rev
;   ================================================================================
(defun DELAPP()
(command "erase" ENT_HANDLE "")
);WFdel

(defun MletDEL()
(if (= ATT_NAME "REVNO")
	(if (= ATT_TEXT M_letter)
		(command "erase" ENT_HANDLE "")
	);if
);if
);WFdel

(defun WFdel()
(if (= ATT_NAME "REVNO")
	(if (and (/= ATT_TEXT M_letter)(> (ascii ATT_TEXT) 64)(< (ascii ATT_TEXT) 91))
		(command "erase" ENT_HANDLE "")
	);if
);if
);WFdel

(defun delbug ()
(command "erase" ENT_HANDLE "")
);ChgRev

(defun linedel(/ ss_line cnt i nm ent len startp endp tendp b a c)
(setq ss_line (ssget "X" (list (cons 0 "line"))) len "0.78312" endp 0.375)
(if ss_line
	(progn
	(setq Cnt (sslength ss_line))
	(setq i 0 delcnt 0)
		(while (< i cnt)
		(setq NM (ssname ss_line i))
		(setq ENT (entget NM))
			(setq tendp (car (cdr (cdr (assoc 10 ent)))))
			(if (= endp tendp)
				(progn
					(entdel NM)
					(setq delcnt (+ delcnt 1))
				);progn
			);if
			(setq i (+ i 1))
		);while
	);progn
);if
(PRINC "Got")
(princ delcnt)
);defun





;;; ================================================================================
;;  Here we are setting our cord's for the insertion of the new WFREV block.
;   ================================================================================
(defun GetCord ()
(setq SS_Blk (ssget "X" (list (cons 0 "INSERT")(cons 2 "WFREV"))))
(if (= ss_blk nil)
(setq cord "22.75,0.4375,0")
	(progn
	(setq Cnt (sslength ss_Blk))
		(cond
			((= cnt 1)(setq cord "22.75,0.6875,0"))
			((= cnt 2)(setq cord "22.75,0.9375,0"))
			((= cnt 3)(setq cord "22.75,1.1875,0"))
			((= cnt 4)(setq cord "22.75,1.4375,0"))
			((= cnt 5)(setq cord "17.00,0.4375,0"))
			((= cnt 6)(setq cord "17.00,0.6875,0"))
			((= cnt 7)(setq cord "17.00,0.9375,0"))
			((= cnt (setq cord "17.00,1.1875,0"))
			(t nil)
		);cond
	);progn
);if
);getcord





;;; ================================================================================
;;  Here we are getting the wanted contents from WFrev block containing M_number
;   ================================================================================
(defun SAVAR ()
(setq ss_Blk (ssget "X" (list (cons 0 "INSERT")(cons 2 "wfrev"))))
(if SS_BLK 
	(progn
		(setq Cnt (sslength ss_Blk))
		(setq i 0)
		(repeat Cnt
			(setq NM (ssname SS_BLK i))
			(setq ENT (entget NM))
			(while (or (= (cdr (assoc 66 ENT)) 1)(/= (cdr (assoc 0 ENT)) "SEQEND")) 
				(setq NM (entnext NM))
				(setq ENT (entget NM))
				(if (and (= (cdr (assoc 2 ENT)) "REVNO")(= (cdr (assoc 1 ENT)) M_CHR))
					(progn
						(while (/= (cdr (assoc 0 ENT)) "SEQEND")
							(setq NM (entnext NM))
							(setq ENT (entget NM))					
							(cond
							((= (cdr (assoc 2 ENT)) "REVPR")(setq REVPR (cdr (assoc 1 ENT))))
							((= (cdr (assoc 2 ENT)) "REVMOC")(setq REVMOC (cdr (assoc 1 ENT))))
							((= (cdr (assoc 2 ENT)) "REVDWN")(setq REVDWN (cdr (assoc 1 ENT))))
							((= (cdr (assoc 2 ENT)) "REVCHK")(setq REVCHK (cdr (assoc 1 ENT))))
							((= (cdr (assoc 2 ENT)) "REVAPP")(setq REVAPP (cdr (assoc 1 ENT))))
							((= (cdr (assoc 2 ENT)) "REVDATE")(setq REVDATE (cdr (assoc 1 ENT))))
							;((= (cdr (assoc 2 ENT)) "REVINFO1")(setq REVINFO1 (cdr (assoc 1 ENT))))
							;((= (cdr (assoc 2 ENT)) "REVINFO2")(setq REVINFO2 (cdr (assoc 1 ENT))))
							(t nil)
							);cond
						);while
					);progn	
				);if
			);while
			(setq NM nil)
			(setq ENT nil)
			(setq i (+ i 1)) 
		);repeat
	);progn
);if
);savar


;;; ================================================================================
;;  Here we are changing all the values for the new wfrev block
;   ================================================================================
(defun ModNew ()
(setq ss_Blk (ssget "X" (list (cons 0 "INSERT")(cons 2 "wfrev"))))
(if SS_BLK 
	(progn
		(setq Cnt (sslength ss_Blk))
		(setq i 0)
		(repeat Cnt
			(setq NM (ssname SS_BLK i))
			(setq ENT (entget NM))
			(while (or (= (cdr (assoc 66 ENT)) 1)(/= (cdr (assoc 0 ENT)) "SEQEND")) 
				(setq NM (entnext NM))
				(setq ENT (entget NM))
				(if (and (= (cdr (assoc 2 ENT)) "REVNO")(= (cdr (assoc 1 ENT)) "*"))
					(progn	
					(setq REVINFO1 "LAST ISSUED FOR CONSTRUCTION") ;;; <--- "THIS CAN BE CHANGED TO WHAT EVER THE ISSUE WILL BE."
						(while (/= (cdr (assoc 0 ENT)) "SEQEND")
							(setq NM (entnext NM))
							(setq ENT (entget NM))					
							(cond
							((= (cdr (assoc 2 ENT)) "REVINFO1")(setq ENT (subst (cons 1 REVINFO1)(assoc 1 ENT) ENT))(entmod ENT))
							((= (cdr (assoc 2 ENT)) "REVPR")(setq ENT (subst (cons 1 REVPR)(assoc 1 ENT) ENT))(entmod ENT))
							;((= (cdr (assoc 2 ENT)) "REVINFO2")(setq ENT (subst (cons 1 REVINFO2)(assoc 1 ENT) ENT))(entmod ENT))
							((= (cdr (assoc 2 ENT)) "REVMOC")(setq ENT (subst (cons 1 REVMOC)(assoc 1 ENT) ENT))(entmod ENT))
							((= (cdr (assoc 2 ENT)) "REVDWN")(setq ENT (subst (cons 1 REVDWN)(assoc 1 ENT) ENT))(entmod ENT))
							((= (cdr (assoc 2 ENT)) "REVCHK")(setq ENT (subst (cons 1 REVCHK)(assoc 1 ENT) ENT))(entmod ENT))
							((= (cdr (assoc 2 ENT)) "REVAPP")(setq ENT (subst (cons 1 REVAPP)(assoc 1 ENT) ENT))(entmod ENT))
							(t nil)
							);cond
						);while
					);progn		
				);if
			);while
			(setq NM nil)
			(setq ENT nil)
			(setq i (+ i 1)) 
		);repeat
	);progn
);if
);modnew


(defun Chgrevno ()
(if (= ATT_NAME "REVNO")
	(if (= (ascii ATT_TEXT) 42)
		(Mod_DXF ENT "TEXT" M_number)		
	);if
);if
);ChgRev

;;; ================================================================================
;;  Here is where we will call on our work functions.
;   ================================================================================
(defun main ()	

;;; ================================================================================
;;  Here we load all of our functions to do the work for us!!!
;   ================================================================================
(NEWOLD)
(Mod_SS "INSERT" "NAME" "WFREV" WFdel)	
(MOD_SS "INSERT" "NAME" "WFREV" MletDEL)
(GetCord)
(COMMAND "-LAYER" "SET" "TEXT" "")
(COMMAND "-INSERT" "WFREV" CORD "" "" "")
(MODNEW)
(MOD_SS "INSERT" "NAME" "WFREV" Chgrevno)
(Mod_SS "INSERT" "NAME" "wftitle" titlechange)

;;; ================================================================================
;;  Here we reset our variables back to the default values.
;   ================================================================================
(setvar "OSMODE" Ol_Osmode)
(setvar "ATTREQ" 1)
(setvar "FILEDIA" 1)

;;; ================================================================================ 
;;  These commands are optional and notated out
;   ================================================================================
(C:NFD)
(COMMAND "REGEN")
(COMMAND "QSAVE")
;(COMMAND "CLOSE")
);main


;;; ================================================================================
;;  Here is where we will call on our evaluation functions to test if the drawing can be returned
;   ================================================================================
(defun c:rtn ()

;;; ================================================================================
;;  Here we load our backing routine (specific to short hand code writing)
;   ================================================================================
(Load "C:\\Acad2006\\Lisp\\PowerMod.lsp")
(setq Ol_Osmode (getvar "OSMODE"))
(setvar "OSMODE" 0)
(setvar "ATTREQ" 0)
(setvar "FILEDIA" 0)


;;; ================================================================================
;;  Here we call on our evaluation fuctions
;   ================================================================================
(setq M_letter "-" M_number "-")
(Mod_SS "INSERT" "NAME" "WFREV" LetterRev)
(Mod_SS "INSERT" "NAME" "WFREV" numRev)
(setq M_chr M_letter)
(if (= M_letter "-")
	(setq M_chr M_number))
(SAVAR)
(linedel)
(if (/= M_letter "-")
	(main)
	(progn
		(getcord)
		(NEWOLD)
		(COMMAND "-LAYER" "SET" "TEXT" "")
		(COMMAND "-INSERT" "WFREV" CORD "" "" "")
		(MODNEW)
		(MOD_SS "INSERT" "NAME" "WFREV" Chgrevno)
	);progn
);if
;;; ================================================================================
;;  Here we reset our variables back to the default values.
;   ================================================================================
(setvar "OSMODE" Ol_Osmode)
(setvar "ATTREQ" 1)
(setvar "FILEDIA" 1)

;;; ================================================================================ 
;;  These commands are optional and notated out
;   ================================================================================
(C:NFD)
(COMMAND "REGEN")
;(COMMAND "QSAVE")
;(COMMAND "CLOSE")

);C:rtn

 

as far as your count and block placement i would probably define it some where around here

  "\nDrawing Sheet has No Attributes
           \n     Use Manual Edit"

in stead of using a manual edit, why not have it create block and put it where it goes :)

Link to comment
Share on other sites

I re-read your first post this morning woodman, It appears that you indeed have more than one Rev box

Apply to Current Layout ONLY Apply to ALL layouts which tells me there are mroe than 1 layout tab at one time.

 

I am wondering how to control the number of lines to be shown. I was thinking of using a layer for each line and control it that way but I was wondering if it can be detected what line is empty and display to the line before it. So an automatic way of controlling the lines.

 

Would you rather "grey out" the blank Rev lines? (mode_tile ...) and add an option for New / Edit . soemthing like this.

 

revbox.jpg

 

Detecting the current rev is not that hard really.

Link to comment
Share on other sites

Your DCL

 

ed1 : edit_box  { edit_limit = 2;  edit_width = 2;}
ed2 : edit_box  { edit_limit = 3;  edit_width = 3;}
ed3 : edit_box  { edit_limit = 10;  edit_width = 9;}
ed4 : edit_box  { edit_limit = 58;  edit_width = 58;}
attab : dialog {
label = "Drawing Title Block";
: boxed_radio_column { 
label = "Application" ;    //give it a label
: row  {
: radio_button {    //define radion button
       key = "rb1" ;     //give it a name
       label = "Apply to Current Layout ONLY" ; //give it a label
       value = "1" ;     //switch it on
         }
: radio_button {    //define radion button
        key = "rb2" ;    //give it a name
        label = "Apply to All Layouts" ; //give it a label
         }  
}
}
: boxed_column {      
label = "Revision Data" ;    //give it a label
: row  {
: column  {
 : text {label = "Rev No."; alignment = centered;} 
 : ed1  { label = "9."; key = "L1-Rev"; }
 : ed1  { label = "8."; key = "L2-Rev"; }
         : ed1  { label = "7."; key = "L3-Rev"; }
         : ed1  { label = "6."; key = "L4-Rev"; }
         : ed1  { label = "5."; key = "L5-Rev"; }
         : ed1  { label = "4."; key = "L6-Rev"; }
         : ed1  { label = "3."; key = "L7-Rev"; }
         : ed1  { label = "2."; key = "L8-Rev"; }
         : ed1  { label = "1."; key = "L9-Rev"; }
}
: column  {
 : text {label = "By"; alignment = centered;}
 : ed2  { key = "L1-By" ; }
        : ed2  { key = "L2-By" ; }
        : ed2  { key = "L3-By" ; }
        : ed2  { key = "L4-By" ; }
        : ed2  { key = "L5-By" ; }
        : ed2  { key = "L6-By" ; }
 : ed2  { key = "L7-By" ; }
        : ed2  { key = "L8-By" ; }
        : ed2  { key = "L9-By" ; }         
       }
       : column {
        : text {label = "Date"; alignment = centered;}
 : ed3  { key = "L1-Date";  }
         : ed3  { key = "L2-Date";  }
         : ed3  { key = "L3-Date";  }
         : ed3  { key = "L4-Date";  }
         : ed3  { key = "L5-Date";  }
         : ed3  { key = "L6-Date";  }
         : ed3  { key = "L7-Date";  }
         : ed3  { key = "L8-Date";  }
         : ed3  { key = "L9-Date";  }
       }
       : column {
        : text {label = "Description"; }
 : ed4  { key = "L1-Description"; }
         : ed4  { key = "L2-Description"; }
         : ed4  { key = "L3-Description"; }
         : ed4  { key = "L4-Description"; }
         : ed4  { key = "L5-Description"; }
         : ed4  { key = "L6-Description"; }
         : ed4  { key = "L7-Description"; }
         : ed4  { key = "L8-Description"; }
         : ed4  { key = "L9-Description"; }
       }
       }
       spacer ;
}
             : row  {
  ok_cancel ;    //predifined OK/Cancel
     }
  }

 

I was thinking of writing a routine that will show only ACTIVE rev lines + 1 Blank depending on the last current Rev number instead of Dynamic block with visibilty. What do you think?

 

EDIT:

Question for you, if you select ALL layouts, does that mean all Rev-Box rev nos/by/dat/description all the same for all layout tabs? That will complicate things if they're not.

Also, 1 Title Block per layout tab?

Edited by pBe
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...