oldsoftboss Posted October 4, 2010 Share Posted October 4, 2010 (edited) Hi all, Have started playing around with lisps and can see plenty of possibilities. One repeated command we carry out is to hatch a rectangle (or closed polyline) with the hatch pattern ASNI37 with a scale of 32, an angle of 0 on the Duct-HA layer. This is to signify insulated ductwork on our shop drawings. I would love to create a lisp where I could simply type HH and select the object, (drawn around the duct area) create a hatch and then delete the object. I have read several posts about creating hatches, but my autolisp knowledge is pretty basic I need a bit of help. Thanks, Dave Edited October 4, 2010 by oldsoftboss Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 4, 2010 Share Posted October 4, 2010 Hi all, Have started playing around with lisps and can see plenty of possibilities. One repeated command we carry out is to hatch a rectangle (or closed polyline) with the hatch pattern ASNI37 with a scale of 32 on the Duct-HA layer. I would love to create a lisp where I could simply type HH and select the object, and a hatch would be created. I have read several posts about creating hatches, but my autolisp knowledge is pretty basic I need a bit of help. Thanks, Dave Hi Dave, This program I used on a recent thread and modified it to suit your need. If it still needs to be tweeked, Then let me know. This code is getting some mileage on it. This is the link of the thread. http://www.cadtutor.net/forum/showthread.php?52876-Create-Ansi-31-Hatch-Linetype Here is your code below: The defaults in red can be changed to suit. Sorry about the crummy format after it was pasted. ANSI37.lsp ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Start-Up. ; (defun C:ANSI37 (/ CL01 CL02 RAD# DEG# PT01 PT02 PT03 PT04 DLEN E01 CPS SUS HPRP HSCL HWID HANG LNAM LCLR LTYP) (ANSI37_SUS) (princ)) (princ "\nANSI37.lsp loaded... Type ANSI37 to start.") ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Save User Settings. ; (defun ANSI37_SUS () (setq SUS_LST (list "cmdecho" "orthomode" "osmode" "blipmode" "angbase" "angdir" "aunits" "clayer") SUS (mapcar 'getvar SUS_LST) TERR *error* *error* ANSI37_ET) (ANSI37_MF) (princ)) ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Main Function. ; (defun ANSI37_MF () [color=red] (or H:WID (setq H:WID 12)) ;Defualt Hatch Width = 12[/color] [color=red] (setq HPRP "ANSI37" ;Default Hatch Pattern = ANSI37[/color] [color=red] HSCL 32 ;Default Hatch Scale = 32[/color] [color=red] HANG 180 ;Default Hatch Angle = 0°[/color] [color=red] LNAM "DUCT-HA" ;Default Layer Name = DUCT-HA[/color] [color=red] LCLR 1 ;Default Layer Color = 1 or RED[/color] [color=red] LTYP "Continuous") ;Default Layer Linetype = Continuous[/color] (setq H:WID ;Set the hatch width (cond ;Condition ((getint (strcat "\nSpecify hatch width. <"(itoa H:WID)">: ")))(T H:WID))) ;Get the hatch width (setq HWID H:WID) ;Set the Hatch Width (setvar "osmode" (nth 2 SUS)) ;Turn on Saved User Snaps (setq CL01 (getpoint "\nSpecify first point along duct: ")) ;Get the first point (while ;While loop (if (/= (setq CL02 (getpoint CL01 "\nSpecify next point along duct: ")) nil) ;Get the next point, if the next point is nil, Go to the Loop Function (progn ;Then do the following (ANSI37_CPS) ;Go to Change Program Settings Function (setq RAD# (angle CL01 CL02) ;Get the angle in radians DEG# (ANSI37_RTD RAD#) ;Convert the radians to degrees DLEN (distance CL01 CL02) ;Get the distance from first point to the next point CL01 (trans CL01 1 0) ;Translate coordinate system CL02 (trans CL02 1 0) ;Translate coordinate system PT01 CL01 ;Calculate Point 01 PT02 (polar PT01 (ANSI37_DTR (+ DEG# 0)) DLEN) ;Calculate Point 02 PT03 (polar PT01 (ANSI37_DTR (+ DEG# 270)) HWID) ;Calculate Point 03 PT04 (polar PT02 (ANSI37_DTR (+ DEG# 270)) HWID)) ;Calculate Point 04 (ANSI37_ML LNAM LCLR LTYP) ;Set layer name, color, linetype (setvar "clayer" LNAM) ;Set layer current (setvar "osmode" 0) ;Turn off snaps (command "._pline" PT01 PT02 PT04 PT03 "C") ;Start Polyline command for hatch perimeter (setq E01 (entlast)) ;Set polyline as last entity to E01 (command "._-bhatch" "_a" "_a" "_y" "" "_p" HPRP HSCL HANG "_s" "_l" "" "") ;Start Hatch command and fill the polyline (command "._erase" E01 "") ;Erase entity E01 or the polyline perimeter (setvar "osmode" (nth 2 SUS)) ;Turn on Saved User Snaps (setq CL01 CL02)))) ;Set the next point to the first point (ANSI37_LF) ;Go to the Loop Function (princ)) ;Exit quietly ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Loop Function. ; (defun ANSI37_LF () (setq LOOP "Y") ;Default Loop Y or Yes (initget "Y N") ;Set the keywords (setq LOOP ;Set variable LOOP (cond ;Condition ((getkword (strcat "\nContinue? [Y or N] <"LOOP">: ")))(T LOOP))) ;Do you wish to continue? Y or N (cond ;Condition ((= LOOP "N")(ANSI37_RUS)) ;If N or No was selected go to ANSI37_RUS, Restore User Settings function ((= LOOP "Y")(ANSI37_MF))) ;If Y or Yes was selected go to HLIN_MF, Main Function (princ)) ;Exit quietly ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Degrees To Radians. ; (defun ANSI37_DTR (DEG#)(* pi (/ DEG# 180.0))) ;Convert degrees to radians ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Radians To Degrees. ; (defun ANSI37_RTD (RAD#)(* 180.0 (/ RAD# pi))) ;Convert radiand to degrees ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Make Layer. ; (defun ANSI37_ML (L:NAM L:CLR L:TYP) (if (null (tblsearch "layer" L:NAM)) (entmake (list (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 L:NAM) (cons 70 0) (cons 62 L:CLR) (cons 6 L:TYP) (cons 290 1)))) (princ)) (princ) ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Change Program Settings. ; (defun ANSI37_CPS () (setq CPS (list 0 1 0 0 0 0)) (mapcar (function setvar)(list "cmdecho" "orthomode" "blipmode" "angbase" "angdir" "aunits") CPS) (princ)) (princ) ; ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Restore User Settings. ; (defun ANSI37_RUS () (setq *error* TERR) (if SUS (mapcar 'setvar SUS_LST SUS)) (princ "\nANSI37.lsp has completed successfully and will now restore your settings.") (princ)) (princ) ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Error Trap. ; (defun ANSI37_ET (ERRORMSG) (command nil nil nil) (if (not (member ERRORMSG '("console break" "Function cancelled"))) (princ (strcat "\nError:" ERRORMSG))) (if SUS (mapcar 'setvar SUS_LST SUS)) (princ "\nANSI37.lsp has encountered a user error!") (princ "\nProgram will now restore your settings and exit.") (terpri) (setq *error* TERR) (princ)) (princ) ; ;///////////////////////////////////////////////////////////////////////////////////////// Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted October 4, 2010 Share Posted October 4, 2010 (edited) Perhaps something like this? (defun c:HH ( / *error* _StartUndo _EndUndo doc spc ent hobj hl ) (vl-load-com) ;; © Lee Mac 2010 (setq hl "Duct-HA") ;; Hatch Layer (defun *error* ( msg ) (and doc (_EndUndo doc)) (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*") (princ (strcat "\n** Error: " msg " **"))) (princ) ) (defun _StartUndo ( doc ) (_EndUndo doc) (vla-StartUndoMark doc) ) (defun _EndUndo ( doc ) (if (= 8 (logand 8 (getvar 'UNDOCTL))) (vla-EndUndoMark doc) ) ) (LM:ActiveSpace 'doc 'spc) (or (tblsearch "LAYER" hl) (vla-add (vla-get-layers doc) hl) ) (if (setq ent (LM:Selectif (lambda ( x ) (vlax-curve-isClosed x)) entsel "\nSelect Object to Hatch: ")) (progn (_StartUndo doc) (if (not (vl-catch-all-error-p (setq hobj (vl-catch-all-apply 'vla-AddHatch (list spc acHatchPatternTypePredefined "ANSI37" :vlax-false 0) ) ) ) ) (progn (vlax-invoke hobj 'AppendOuterLoop (list (vlax-ename->vla-object ent))) (mapcar '(lambda ( p v ) (vlax-put-property hobj p v)) '(Layer AssociativeHatch PatternAngle PatternScale) (list hl :vlax-false 0.0 32.0) ) (vla-Evaluate hobj) (entdel ent) ) (princ (strcat "\n** Error: " (vl-catch-all-error-message hobj) " **")) ) (_EndUndo doc) ) ) (princ) ) ;;---------------------=={ Select if }==----------------------;; ;; ;; ;; Continuous selection prompts until the predicate function ;; ;; foo is validated ;; ;;------------------------------------------------------------;; ;; Author: Lee McDonnell, 2010 ;; ;; ;; ;; Copyright © 2010 by Lee McDonnell, All Rights Reserved. ;; ;; Contact: Lee Mac @ TheSwamp.org, CADTutor.net ;; ;;------------------------------------------------------------;; ;; Arguments: ;; ;; foo - optional predicate function taking ename argument ;; ;; fun - selection function to invoke ;; ;; str - prompt string ;; ;;------------------------------------------------------------;; ;; Returns: selected entity ename if successful, else nil ;; ;;------------------------------------------------------------;; (defun LM:Selectif ( foo fun str / e ) ;; © Lee Mac 2010 (while (progn (setq e (car (fun str))) (cond ( (eq 'ENAME (type e)) (if (and foo (not (foo e))) (princ "\n** Invalid Object Selected **") ) ) ) ) ) e ) ;;--------------------=={ ActiveSpace }==---------------------;; ;; ;; ;; Retrieves pointers to the Active Document and Space ;; ;;------------------------------------------------------------;; ;; Author: Lee McDonnell, 2010 ;; ;; ;; ;; Copyright © 2010 by Lee McDonnell, All Rights Reserved. ;; ;; Contact: Lee Mac @ TheSwamp.org, CADTutor.net ;; ;;------------------------------------------------------------;; ;; Arguments: ;; ;; *doc - quoted symbol other than *doc ;; ;; *spc - quoted symbol other than *spc ;; ;;------------------------------------------------------------;; (defun LM:ActiveSpace ( *doc *spc ) ;; © Lee Mac 2010 (set *spc (if (or (eq AcModelSpace (vla-get-ActiveSpace (set *doc (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ) ) (eq :vlax-true (vla-get-MSpace (eval *doc))) ) (vla-get-ModelSpace (eval *doc)) (vla-get-PaperSpace (eval *doc)) ) ) ) Edited October 5, 2010 by Lee Mac Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 4, 2010 Share Posted October 4, 2010 That is definitely much better and simpler to use. Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted October 4, 2010 Share Posted October 4, 2010 That is definitely much better and simpler to use. Thanks Buzzard, It was the first time I'd created a hatch using VL, and there are some things to watch out for when doing so (detailed in the VLIDE help files), so I thought I'd give it a try. Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 4, 2010 Share Posted October 4, 2010 I could almost swear you had already done something similar. I just cannot remember the thread. It still needs a layer function anyway, But I guess we cannot give away the store. Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted October 4, 2010 Share Posted October 4, 2010 I could almost swear you had already done something similar. I just cannot remember the thread. It still needs a layer function anyway, But I guess we cannot give away the store. Oh yeah - forgot about the layer... Quote Link to comment Share on other sites More sharing options...
oldsoftboss Posted October 4, 2010 Author Share Posted October 4, 2010 Thanks for the feedback everybody. Will post end result. Dave Quote Link to comment Share on other sites More sharing options...
oldsoftboss Posted October 5, 2010 Author Share Posted October 5, 2010 Hi Dave, This program I used on a recent thread and modified it to suit your need. If it still needs to be tweeked, Then let me know. This code is getting some mileage on it. This is the link of the thread. http://www.cadtutor.net/forum/showthread.php?52876-Create-Ansi-31-Hatch-Linetype Here is your code below: The defaults in red can be changed to suit. Sorry about the crummy format after it was pasted. ANSI37.lsp ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Start-Up. ; (defun C:ANSI37 (/ CL01 CL02 RAD# DEG# PT01 PT02 PT03 PT04 DLEN E01 CPS SUS HPRP HSCL HWID HANG LNAM LCLR LTYP) (ANSI37_SUS) (princ)) (princ "\nANSI37.lsp loaded... Type ANSI37 to start.") ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Save User Settings. ; (defun ANSI37_SUS () (setq SUS_LST (list "cmdecho" "orthomode" "osmode" "blipmode" "angbase" "angdir" "aunits" "clayer") SUS (mapcar 'getvar SUS_LST) TERR *error* *error* ANSI37_ET) (ANSI37_MF) (princ)) ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Main Function. ; (defun ANSI37_MF () [color=red] (or H:WID (setq H:WID 12)) ;Defualt Hatch Width = 12[/color] [color=red] (setq HPRP "ANSI37" ;Default Hatch Pattern = ANSI37[/color] [color=red] HSCL 32 ;Default Hatch Scale = 32[/color] [color=red] HANG 180 ;Default Hatch Angle = 0°[/color] [color=red] LNAM "DUCT-HA" ;Default Layer Name = DUCT-HA[/color] [color=red] LCLR 1 ;Default Layer Color = 1 or RED[/color] [color=red] LTYP "Continuous") ;Default Layer Linetype = Continuous[/color] (setq H:WID ;Set the hatch width (cond ;Condition ((getint (strcat "\nSpecify hatch width. <"(itoa H:WID)">: ")))(T H:WID))) ;Get the hatch width (setq HWID H:WID) ;Set the Hatch Width (setvar "osmode" (nth 2 SUS)) ;Turn on Saved User Snaps (setq CL01 (getpoint "\nSpecify first point along duct: ")) ;Get the first point (while ;While loop (if (/= (setq CL02 (getpoint CL01 "\nSpecify next point along duct: ")) nil) ;Get the next point, if the next point is nil, Go to the Loop Function (progn ;Then do the following (ANSI37_CPS) ;Go to Change Program Settings Function (setq RAD# (angle CL01 CL02) ;Get the angle in radians DEG# (ANSI37_RTD RAD#) ;Convert the radians to degrees DLEN (distance CL01 CL02) ;Get the distance from first point to the next point CL01 (trans CL01 1 0) ;Translate coordinate system CL02 (trans CL02 1 0) ;Translate coordinate system PT01 CL01 ;Calculate Point 01 PT02 (polar PT01 (ANSI37_DTR (+ DEG# 0)) DLEN) ;Calculate Point 02 PT03 (polar PT01 (ANSI37_DTR (+ DEG# 270)) HWID) ;Calculate Point 03 PT04 (polar PT02 (ANSI37_DTR (+ DEG# 270)) HWID)) ;Calculate Point 04 (ANSI37_ML LNAM LCLR LTYP) ;Set layer name, color, linetype (setvar "clayer" LNAM) ;Set layer current (setvar "osmode" 0) ;Turn off snaps (command "._pline" PT01 PT02 PT04 PT03 "C") ;Start Polyline command for hatch perimeter (setq E01 (entlast)) ;Set polyline as last entity to E01 (command "._-bhatch" "_a" "_a" "_y" "" "_p" HPRP HSCL HANG "_s" "_l" "" "") ;Start Hatch command and fill the polyline (command "._erase" E01 "") ;Erase entity E01 or the polyline perimeter (setvar "osmode" (nth 2 SUS)) ;Turn on Saved User Snaps (setq CL01 CL02)))) ;Set the next point to the first point (ANSI37_LF) ;Go to the Loop Function (princ)) ;Exit quietly ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Loop Function. ; (defun ANSI37_LF () (setq LOOP "Y") ;Default Loop Y or Yes (initget "Y N") ;Set the keywords (setq LOOP ;Set variable LOOP (cond ;Condition ((getkword (strcat "\nContinue? [Y or N] <"LOOP">: ")))(T LOOP))) ;Do you wish to continue? Y or N (cond ;Condition ((= LOOP "N")(ANSI37_RUS)) ;If N or No was selected go to ANSI37_RUS, Restore User Settings function ((= LOOP "Y")(ANSI37_MF))) ;If Y or Yes was selected go to HLIN_MF, Main Function (princ)) ;Exit quietly ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Degrees To Radians. ; (defun ANSI37_DTR (DEG#)(* pi (/ DEG# 180.0))) ;Convert degrees to radians ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Radians To Degrees. ; (defun ANSI37_RTD (RAD#)(* 180.0 (/ RAD# pi))) ;Convert radiand to degrees ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Make Layer. ; (defun ANSI37_ML (L:NAM L:CLR L:TYP) (if (null (tblsearch "layer" L:NAM)) (entmake (list (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 L:NAM) (cons 70 0) (cons 62 L:CLR) (cons 6 L:TYP) (cons 290 1)))) (princ)) (princ) ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Change Program Settings. ; (defun ANSI37_CPS () (setq CPS (list 0 1 0 0 0 0)) (mapcar (function setvar)(list "cmdecho" "orthomode" "blipmode" "angbase" "angdir" "aunits") CPS) (princ)) (princ) ; ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Restore User Settings. ; (defun ANSI37_RUS () (setq *error* TERR) (if SUS (mapcar 'setvar SUS_LST SUS)) (princ "\nANSI37.lsp has completed successfully and will now restore your settings.") (princ)) (princ) ; ;///////////////////////////////////////////////////////////////////////////////////////// ; ; Error Trap. ; (defun ANSI37_ET (ERRORMSG) (command nil nil nil) (if (not (member ERRORMSG '("console break" "Function cancelled"))) (princ (strcat "\nError:" ERRORMSG))) (if SUS (mapcar 'setvar SUS_LST SUS)) (princ "\nANSI37.lsp has encountered a user error!") (princ "\nProgram will now restore your settings and exit.") (terpri) (setq *error* TERR) (princ)) (princ) ; ;///////////////////////////////////////////////////////////////////////////////////////// Thank Buzzard. This lisp sort of does what I want, except I would like it to completely fill the rectangle, not put an edge arouund it. Basically, start the command, select an existing rectangle or closed polyline (some of the ducts are weired shapes) and fill it with the hatch. Dave Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 5, 2010 Share Posted October 5, 2010 Thank Buzzard. This lisp sort of does what I want, except I would like it to completely fill the rectangle, not put an edge arouund it. Basically, start the command, select an existing rectangle or closed polyline (some of the ducts are weired shapes) and fill it with the hatch. Dave I did the edit sort of fast, So I would expect some quirks. I would suggest you try Lee's program. I believe he put in everything you were looking for. By the way, My program was requesting duct width to set the hatch to and not leaving a rectangle behind. So I am unsure what exactly you mean, But again Lee's program is your best bet. Quote Link to comment Share on other sites More sharing options...
oldsoftboss Posted October 5, 2010 Author Share Posted October 5, 2010 I did the edit sort of fast, So I would expect some quirks. I would suggest you try Lee's program. I believe he put in everything you were looking for. By the way, My program was requesting duct width to set the hatch to and not leaving a rectangle behind. So I am unsure what exactly you mean, But again Lee's program is your best bet. Ah got you, I was actually tracing the complete rectangle, not just one edge. Now I understand, I will edit to say "enter duct width", rather than "Enter Hatch Width". Would still like the ability to simply pick a rectangle or closed polyline and fill it. As a side note, I couldn't get Lee's Lisp to run. Returned unknown command. ?? Cheers, Dave Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 5, 2010 Share Posted October 5, 2010 Ah got you, I was actually tracing the complete rectangle, not just one edge. Now I understand, I will edit to say "enter duct width", rather than "Enter Hatch Width". Would still like the ability to simply pick a rectangle or closed polyline and fill it. As a side note, I couldn't get Lee's Lisp to run. Returned unknown command. ?? Cheers, Dave Thats odd, Lee's code worked for me and I know he put (vl-load-com) at the top of the code, So that should not be an issue. He can answer you best on that one. I was working on the code I gave you to just do a select also, But the amount of time I have at the moment is somewhat limited. I will do the best I can. Quote Link to comment Share on other sites More sharing options...
oldsoftboss Posted October 5, 2010 Author Share Posted October 5, 2010 Hi again, Tried Lee's code at home and worked perfetly, just need to add the layer stuff. Thanks Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 5, 2010 Share Posted October 5, 2010 Hi again, Tried Lee's code at home and worked perfetly, just need to add the layer stuff. Thanks I thought he had taken care of the layers when I mentioned it. Check in with him later. Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted October 5, 2010 Share Posted October 5, 2010 Hi Guys, Updated code to correct layer - Glad it works for you. Quote Link to comment Share on other sites More sharing options...
antistar Posted October 5, 2010 Share Posted October 5, 2010 Hi guys, I work with CAD2002 and returns the following error message: Command: AP APPLOAD HH.LSP successfully loaded. Command: Command: HH Select Object to Hatch: ** Error: Too many actual parameters ** Command: Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 6, 2010 Share Posted October 6, 2010 Hi Guys, Updated code to correct layer - Glad it works for you. Lee, I am not sure if this is a version thing, But testing your code will put the hatch in but erase the object your hatching in the process. After running it a couple of times I get the following error: Select Object to Hatch: ** Error: Automation Error. Hatch pattern too dense ** Whats really strange about this is the objects are hardly that much different in size. I ran this test using 2004. I will test and see what happens on 2009. Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted October 6, 2010 Share Posted October 6, 2010 But testing your code will put the hatch in but erase the object your hatching in the process. I thought that was part of the request? Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 6, 2010 Share Posted October 6, 2010 Ok, I tested on 2009 and the error seems version related. I did not get it with 2009, However it still erases the object to be hatched which is just another issue. Also scamaru seems to be getting a different version error I would think. Quote Link to comment Share on other sites More sharing options...
The Buzzard Posted October 6, 2010 Share Posted October 6, 2010 I thought that was part of the request? I thought the object still needs to remain. I guess it is best to wait and see what oldsoftboss has to say. I could be wrong. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.