woodman78 Posted July 10, 2009 Share Posted July 10, 2009 Hi, I am writing program for services for our office. I have written a DCL file with radio buttons and four options which is fine. I now want to have a lisp load depending on which of the 4 radio buttons is selected. This is what I have but I would really appreciate some help. I am try to use the COND but not sure if I am calling the follows routines right. When I run the lisp I get no function definition :T. ESS1500, ESS1350, ESS1200, ESS1050 are the functions I want to call. (defun C:samp4 () ;define function (vl-load-com) (setq dcl_id (load_dialog "samp3.dcl")) ;load dialog (setq T TB2); ?????Not sure if i need this (if (not (new_dialog "samp3" dcl_id) ;test for dialog );not (exit) ;exit if no dialog );if (action_tile "T1" "(setq hole \"TB1\")") ;*store hole type (action_tile "T2" "(setq hole \"TB2\")") ;*store hole type (action_tile "T3" "(setq hole \"TB3\")") ;*store hole type (action_tile "T4" "(setq hole \"TB4\")") ;*store hole type (action_tile "cancel" ;if cancel button pressed "(done_dialog) (setq userclick nil)" ;close dialog, set flag );action_tile (action_tile "accept" ;if O.K. pressed " (done_dialog)(setq userclick T))" ;??? Is this standard code. (cond (=(T "TB1")ESS1500) (=(T "TB2")ESS1350) (=(T "TB3")ESS1200) (=(T "TB4")ESS1050) ('t (princ "\nNothing changed.") ) ;_ end of optional else condition ) ;_ end of cond statement );action tile (start_dialog) ;start dialog (unload_dialog dcl_id) ;unload (princ) );defun C:samp (princ) Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 10, 2009 Share Posted July 10, 2009 mate if you could provide the dcl file, it would make it alot easyer to work out what you are doing, i assume you are using radio_button's Regards flower Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 10, 2009 Share Posted July 10, 2009 please excuse me if i make any mistakes, i am quite blind, But (cond (=(T "TB1")ESS1500) (=(T "TB2")ESS1350) (=(T "TB3")ESS1200) (=(T "TB4")ESS1050) ('t (princ "\nNothing changed.") ) ;_ end of optional else condition ) should be (cond (=(hole "TB1")ESS1500) (=(hole "TB2")ESS1350) (=(hole "TB3")ESS1200) (=(hole "TB4")ESS1050) ('t (princ "\nNothing changed.") ) ;_ end of optional else condition ) Quote Link to comment Share on other sites More sharing options...
woodman78 Posted July 10, 2009 Author Share Posted July 10, 2009 Hi Flower, Here is the DCL: samp3 : dialog { //dialog name label = "Structural Holes" ; //give it a label :boxed_radio_column { //*define radio column label = "Choose a Type" ; //*give it a label : radio_button { //*define radion button key = "T1" ; //*give it a name label = "Type &1" ; //*give it a label value = "1" ; //*switch it on } //*end definition : radio_button { //*define radio button key = "T2" ; //*give it a name label = "Type &2" ; //*give it a label } //*end definition : radio_button { //*define radio button key = "T3" ; //*give it a name label = "Type &3" ; //*give it a label } //*end definition : radio_button { //*define radio button key = "T4" ; //*give it a name label = "Type &4" ; //*give it a label } //*end definition } //*end radio column ok_cancel ; //predifined OK/Cancel : row { //define row : paragraph { //define paragraph : text_part { //define text label = "Designed by BD"; //give it some text } //end text : text_part { //define more text label = "for CCC NNRDO"; //some more text } //end text } //end paragraph } //end row } //end dialog Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 10, 2009 Share Posted July 10, 2009 Mate, had a look, didnt run it, should be fine in princaple Not alot of changes really, If you want me to explane why i changed things im happy to explain just one note When posting code please put in the code tages it the # key in with all the format **** on the top of the reply box. it just keeps formats and easyer on the eyes (defun C:samp4 () ;define function (vl-load-com) (setq dcl_id (load_dialog "samp3.dcl")) ;load dialog ; (setq T TB2); ?????Not sure if i need this ;not sure what you want from this, but i belive its not needed, but i do not know your varibles (if (not (new_dialog "samp3" dcl_id) ;test for dialog );not (progn (alert "Can not find you dcl file") (exit) ;exit if no dialog ) );if (action_tile "T1" "(setq hole \"TB1\")") ;*store hole type (action_tile "T2" "(setq hole \"TB2\")") ;*store hole type (action_tile "T3" "(setq hole \"TB3\")") ;*store hole type (action_tile "T4" "(setq hole \"TB4\")") ;*store hole type (action_tile "cancel" ;if cancel button pressed "(done_dialog) (setq userclick nil)" ;close dialog, set flag );action_tile (action_tile "accept" ;if O.K. pressed "(done_dialog)(setq userclick T))" ;??? Is this standard code. );action tile (start_dialog) ;start dialog (unload_dialog dcl_id) ;unload (if userclick (cond (=(hole "TB1")ESS1500) (=(hole "TB2")ESS1350) (=(hole "TB3")ESS1200) (=(hole "TB4")ESS1050) (t (princ "\nNothing changed.") ) ;_ end of optional else condition ) ;_ end of cond statement ) (princ) );defun C:samp (princ "\nThis loaded fine") (princ) and dcl, it is unchanged samp3 : dialog { //dialog name label = "Structural Holes" ; //give it a label :boxed_radio_column { //*define radio column label = "Choose a Type" ; //*give it a label : radio_button { //*define radion button key = "T1" ; //*give it a name label = "Type &1" ; //*give it a label value = "1" ; //*switch it on } //*end definition : radio_button { //*define radio button key = "T2" ; //*give it a name label = "Type &2" ; //*give it a label } //*end definition : radio_button { //*define radio button key = "T3" ; //*give it a name label = "Type &3" ; //*give it a label } //*end definition : radio_button { //*define radio button key = "T4" ; //*give it a name label = "Type &4" ; //*give it a label } //*end definition } //*end radio column ok_cancel ; //predifined OK/Cancel : row { //define row : paragraph { //define paragraph : text_part { //define text label = "Designed by BD"; //give it some text } //end text : text_part { //define more text label = "for CCC NNRDO"; //some more text } //end text } //end paragraph } //end row } //end dialog sorry my pasting format turns out quite **** for some reason. Quote Link to comment Share on other sites More sharing options...
woodman78 Posted July 10, 2009 Author Share Posted July 10, 2009 Thanks for that Flower, It has gotten rid of the errors but it still doesn't run any of the ESS routines. I have them in the same .lsp file. Do i need to call them in a different way or something. I ran one of the ESS routines from the command line and it runs fine. I would appreciate any ideas.. Quote Link to comment Share on other sites More sharing options...
PHPGator Posted July 10, 2009 Share Posted July 10, 2009 Do you have them set as functions in the same file? If so, you could do this: (cond (=(hole "TB1") (C:ESS1500)) (=(hole "TB2") (C:ESS1350)) (=(hole "TB3") (C:ESS1200)) (=(hole "TB4") (C:ESS1050)) ('t (princ "\nNothing changed.") ) ;_ end of optional else condition ) Since you said that you can run the routines from the command line you could also simply do this: (cond (=(hole "TB1") (command "ESS1500")) (=(hole "TB2") (command "ESS1350") (=(hole "TB3") (command "ESS1200")) (=(hole "TB4") (command "ESS1050")) ('t (princ "\nNothing changed.") ) ;_ end of optional else condition ) Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 11, 2009 Share Posted July 11, 2009 Sorry mate i missed that lastnight (cond (=(hole "TB1")(ESS1500)) (=(hole "TB2")(ESS1350)) (=(hole "TB3")(ESS1200)) (=(hole "TB4")(ESS1050)) (t (princ "\nNothing changed.")) ;_ end of optional else condition ) Aswell Do you call the routenes up from the command line all the time? Or just for the testing faze.As i would ride the "c:" part. then the above should work (defun ESS1350 () "the code here" ) Or do as PHPGator (cond (=(hole "TB1") (C:ESS1500))(=(hole "TB2") (C:ESS1350)) (=(hole "TB3") (C:ESS1200)) (=(hole "TB4") (C:ESS1050)) ('t (princ "\nNothing changed.") ) ;_ end of optional else condition ) Quote Link to comment Share on other sites More sharing options...
woodman78 Posted July 13, 2009 Author Share Posted July 13, 2009 Thanks guys, Just into the office now and tried your solution but no joy. I am getting an error ; error: bad function: "TB3" depending on which radio button I choose. Any ideas, this is the full code. Thanks again. (defun C:samp4 () ;define function (vl-load-com) (setq dcl_id (load_dialog "samp3.dcl")) ;load dialog ;not sure what you want from this, but i belive its not needed, but i do not know your varibles (if (not (new_dialog "samp3" dcl_id) ;test for dialog );not (progn (alert "Can not find you dcl file") (exit) ;exit if no dialog ) );if (action_tile "T1" "(setq hole \"TB1\")") ;*store hole type (action_tile "T2" "(setq hole \"TB2\")") ;*store hole type (action_tile "T3" "(setq hole \"TB3\")") ;*store hole type (action_tile "T4" "(setq hole \"TB4\")") ;*store hole type (action_tile "cancel" ;if cancel button pressed "(done_dialog) (setq userclick nil)" ;close dialog, set flag );action_tile (action_tile "accept" ;if O.K. pressed "(done_dialog)(setq userclick T))" ;??? Is this standard code. );action tile (start_dialog) ;start dialog (unload_dialog dcl_id) ;unload (if userclick (cond (=(hole "TB1") (command "ESS1500")) (=(hole "TB2") (command "ESS1350")) (=(hole "TB3") (command "ESS1200")) (=(hole "TB4") (command "ESS1050")) (t (princ "\nNothing changed.") ) ;_ end of optional else condition ) ;_ end of cond statement ) (princ) );defun C:samp (princ "\nThis loaded fine") (princ) (defun c:ESS1500() (setq a "CCC_DR_1500") (if (= (tblsearch "ltype" a) nil) (command "-linetype" "l" a "acadiso.lin" "") (princ)) (graphscr) (command "._-layer" "N" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1500" "M" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1500" "L" "CCC_DR_1500" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1500" "C" "84" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1500" "LW" "0.3" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1500" "" ) (command "pline" pause "width" "0.0" "0.0" pause "width" "0.0" "0.0") (setvar "cmdecho" 1) (princ) ) ;;;;;;;;;;Existing Storm_Sewer 1500mm;;;;;;;;;; End ;;;;;;;;;;Existing Storm_Sewer 1350mm;;;;;;;;;; Start (defun c:ESS1350() (setq a "CCC_DR_1350") (if (= (tblsearch "ltype" a) nil) (command "-linetype" "l" a "acadiso.lin" "") (princ)) (graphscr) (command "._-layer" "N" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1350" "M" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1350" "L" "CCC_DR_1350" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1350" "C" "84" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1350" "LW" "0.3" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1350" "" ) (command "pline" pause "width" "0.0" "0.0" pause "width" "0.0" "0.0") (setvar "cmdecho" 1) (princ) ) ;;;;;;;;;;Existing Storm_Sewer 1350mm;;;;;;;;;; End ;;;;;;;;;;Existing Storm_Sewer 1200mm;;;;;;;;;; Start (defun c:ESS1200() (setq a "CCC_DR_1200") (if (= (tblsearch "ltype" a) nil) (command "-linetype" "l" a "acadiso.lin" "") (princ)) (graphscr) (command "._-layer" "N" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1200" "M" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1200" "L" "CCC_DR_1200" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1200" "C" "84" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1200" "LW" "0.3" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1200" "" ) (command "pline" pause "width" "0.0" "0.0") (setvar "cmdecho" 1) (princ) ) ;;;;;;;;;;Existing Storm_Sewer 1200mm;;;;;;;;;; End ;;;;;;;;;;Existing Storm_Sewer 1050mm;;;;;;;;;; Start (defun c:ESS1050() (setq a "CCC_DR_1050") (if (= (tblsearch "ltype" a) nil) (command "-linetype" "l" a "acadiso.lin" "") (princ)) (graphscr) (command "._-layer" "N" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1050" "M" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1050" "L" "CCC_DR_1050" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1050" "C" "84" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1050" "LW" "0.3" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1050" "" ) (command "pline" pause "width" "0.0" "0.0") (setvar "cmdecho" 1) (princ) ) ;;;;;;;;;;Existing Storm_Sewer 1050mm;;;;;;;;;; End Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 13, 2009 Share Posted July 13, 2009 Sorry mate, Didnt pick up, was drunk or hung ova try with (cond (= hole "TB1") (command "ESS1500")) (= hole "TB2") (command "ESS1350")) (= hole "TB3") (command "ESS1200")) (= hole "TB4") (command "ESS1050")) (t (princ "\nNothing changed.") ) ;_ end of optional else condition ) Please note that if you dont pick any thing, it will return nothing change. But, defult for radio buttons is to have one enabbled, Either go with toggle buttons , and extra option as "none" or some thing , or not have that option Quote Link to comment Share on other sites More sharing options...
woodman78 Posted July 13, 2009 Author Share Posted July 13, 2009 Does this mean I can't use the radio buttons at all?? I can get the dialog box to load with none pre-selected. After I load and run the lsp i am still getting the BAD Function error when i select one of the buttons. None of the ESS commands will run but they will run when typed into the command line directly just as a test. I must be missing something here! Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 13, 2009 Share Posted July 13, 2009 Bro like i said before (cond (= hole "TB1") (ESS1500)) (= hole "TB2") (ESS1350)) (= hole "TB3") (ESS1200)) (= hole "TB4") (ESS1050)) (t (princ "\nNothing changed.") ) ;_ end of optional else condition ) with the other ones as. this formatt should work (defun ESS1350 () "the code here" ) Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 13, 2009 Share Posted July 13, 2009 or purhaps some thing like this (defun C:samp4 (/ hole) (vl-load-com) (setvar "cmdecho" 0) (defun MkLay (Nme Col lTyp lWgt Plt / lays lay) ;thank lee for this one (setq lays (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object) ) ) lay (cond ((tblsearch "LAYER" Nme) (vla-item lays Nme) ) (t (vla-add lays Nme)) ) ) (and Col (vla-put-Color lay Col)) (and lTyp (lTload lTyp) (vla-put-Linetype lay lTyp)) (and lWgt (vla-put-LineWeight lay (eval (read (strcat "acLnWt" lWgt))))) (and (not Plt) (vla-put-Plottable lay :vlax-false)) ) (defun lTload (lTyp) (or (tblsearch "LTYPE" lTyp) (vla-load (vla-get-Linetypes (vla-get-ActiveDocument (vlax-get-acad-object) ) ) lTyp "acad.lin" ) ) ) (defun drawingstuff(a layername /) (if (not(tblsearch "layer" layername)) (MkLay layername 84 a 030 nil) ) (setvar "clayer" layername) (command "pline" '(0 0 0) "width" "0.0" "0.0" //) (setvar "cmdecho" 1) (command "pline") ) (setq dcl_id (load_dialog "samp3.dcl")) (if (not (new_dialog "samp3" dcl_id) ) (progn (alert "Can not find you dcl file") (exit) ) ) (action_tile "T1" "(setq hole \"TB1\")(set_tile \"T2\" \"0\")(set_tile \"T3\" \"0\")(set_tile \"T4\" \"0\")(if (= (get_tile \"T1\") \"0\")(setq hole nil)))") (action_tile "T2" "(setq hole \"TB2\")(set_tile \"T1\" \"0\")(set_tile \"T3\" \"0\")(set_tile \"T4\" \"0\")(if (= (get_tile \"T2\") \"0\")(setq hole nil)))") (action_tile "T3" "(setq hole \"TB3\")(set_tile \"T1\" \"0\")(set_tile \"T2\" \"0\")(set_tile \"T4\" \"0\")(if (= (get_tile \"T3\") \"0\")(setq hole nil)))") (action_tile "T4" "(setq hole \"TB4\")(set_tile \"T1\" \"0\")(set_tile \"T2\" \"0\")(set_tile \"T3\" \"0\")(if (= (get_tile \"T4\") \"0\")(setq hole nil)))") (action_tile "cancel" "(done_dialog)(setq userclick nil)") (action_tile "accept" "(done_dialog)(setq userclick T))") (start_dialog) (unload_dialog dcl_id) (if userclick (cond ((= hole "TB1") (drawingstuff "CCC_DR_1500""CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1500")) ((= hole "TB2") (drawingstuff "CCC_DR_1350" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1350")) ((= hole "TB3") (drawingstuff "CCC_DR_1200" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1200")) ((= hole "TB4") (drawingstuff "CCC_DR_1050" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1050")) (t (princ "\nNothing changed.")) ) ) (princ) ) Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 13, 2009 Share Posted July 13, 2009 woops here's the dcl aswell samp3 : dialog { //dialog name label = "Structural Holes" ; :boxed_radio_column { label = "Choose a Type" ; :toggle {key = "T1" ; label = "Type &1"; } :toggle {key = "T2" ; label = "Type &2"; } :toggle {key = "T3" ; label = "Type &3"; } :toggle {key = "T4" ; label = "Type &4"; } } //*end radio column ok_cancel ; //predifined OK/Cancel : row { //define row : paragraph { //define paragraph : text_part { label = "Designed by BD"; } //end text : text_part { //define more text label = "for CCC NNRDO"; } //end text } //end paragraph } //end row } //end dialog Quote Link to comment Share on other sites More sharing options...
woodman78 Posted July 13, 2009 Author Share Posted July 13, 2009 That did the job alright. Thanks for that. Was there a fundamental problem with what i did or is it just that the visual lisp is better coding?? Thanks Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 13, 2009 Share Posted July 13, 2009 If you hadnt the need for the option of nothing, you would of almost been on the mark. Except with the cond That wasnt quite correct, not far off tho. All i did was change it to a toggle, that accepts nil. Used a different way to create a layer Used a different way to load the linetype. And I simplfied the multiple commands into one. with a cond to pass the values on to it. Quote Link to comment Share on other sites More sharing options...
woodman78 Posted July 13, 2009 Author Share Posted July 13, 2009 Thanks for that but the problem is that I don't understand what is going on there. I can't follow the code in order to modify it for other routines I want to run. I understand the one I have but not why it won't load the other ESS routines. Quote Link to comment Share on other sites More sharing options...
flowerrobot Posted July 14, 2009 Share Posted July 14, 2009 Mate hope this helps let me know if note, here are some notes (defun C:samp4 (/ hole) (vl-load-com) (setvar "cmdecho" 0) ;this creates the layer, Give it, name , colour , lintype. lineweight eg 030 and plot (t or nil) (defun MkLay (Nme Col lTyp lWgt Plt / lays lay) ;thank lee for this one (setq lays (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object) ) ) lay (cond ((tblsearch "LAYER" Nme) (vla-item lays Nme) ) (t (vla-add lays Nme)) ) ) (and Col (vla-put-Color lay Col)) (and lTyp (lTload lTyp) (vla-put-Linetype lay lTyp)) (and lWgt (vla-put-LineWeight lay (eval (read (strcat "acLnWt" lWgt))))) (and (not Plt) (vla-put-Plottable lay :vlax-false)) ) ;this just searchs for line type, adds it if needed (defun lTload (lTyp) (or (tblsearch "LTYPE" lTyp) (vla-load (vla-get-Linetypes (vla-get-ActiveDocument (vlax-get-acad-object) ) ) lTyp "acad.lin" ) ) ) ;this is your draw function ;because your codes where all the similar except layer & linetype (defun drawingstuff(a layername /) ;This searchs for layer (if (not(tblsearch "layer" layername)) (MkLay layername 84 a 030 nil) ) ;this changes the layer (setvar "clayer" layername) ;this sets up the width then exits it (command "pline" '(0 0 0) "width" "0.0" "0.0" //) ;returns cmdecho back, so it has promps for commands (setvar "cmdecho" 1) ;runs pline & lets user do what they want with it (command "pline") ) ;loadinc dcl (setq dcl_id (load_dialog "samp3.dcl")) (if (not (new_dialog "samp3" dcl_id) ) (progn (alert "Can not find you dcl file") (exit) ) ) ;will set the the flag to respected vale, and will set all the tiles to bank ;because there toggle boxes, they can be on all at once, so it stops it, ;it will the cheack if current tile is nil or not ;if it is set the flag nil (action_tile "T1" "(setq hole \"TB1\")(set_tile \"T2\" \"0\")(set_tile \"T3\" \"0\")(set_tile \"T4\" \"0\")(if (= (get_tile \"T1\") \"0\")(setq hole nil)))") (action_tile "T2" "(setq hole \"TB2\")(set_tile \"T1\" \"0\")(set_tile \"T3\" \"0\")(set_tile \"T4\" \"0\")(if (= (get_tile \"T2\") \"0\")(setq hole nil)))") (action_tile "T3" "(setq hole \"TB3\")(set_tile \"T1\" \"0\")(set_tile \"T2\" \"0\")(set_tile \"T4\" \"0\")(if (= (get_tile \"T3\") \"0\")(setq hole nil)))") (action_tile "T4" "(setq hole \"TB4\")(set_tile \"T1\" \"0\")(set_tile \"T2\" \"0\")(set_tile \"T3\" \"0\")(if (= (get_tile \"T4\") \"0\")(setq hole nil)))") (action_tile "cancel" "(done_dialog)(setq userclick nil)") (action_tile "accept" "(done_dialog)(setq userclick T))") (start_dialog) (unload_dialog dcl_id) ;if accepted ;search which flag is done, will the pass the line type value and layer name to the funtion (if userclick (cond ((= hole "TB1") (drawingstuff "CCC_DR_1500""CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1500")) ((= hole "TB2") (drawingstuff "CCC_DR_1350" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1350")) ((= hole "TB3") (drawingstuff "CCC_DR_1200" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1200")) ((= hole "TB4") (drawingstuff "CCC_DR_1050" "CCC_SERVICES_EXISTING_Drainage_Storm_Sewer_1050")) (t (princ "\nNothing changed.")) ) ) (princ) ) Quote Link to comment Share on other sites More sharing options...
woodman78 Posted July 14, 2009 Author Share Posted July 14, 2009 Thanks for that. Lee Mac and Buzzard got me sorted. 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.