All Activity
- Past hour
-
kiljoos joined the community
-
Dhyzi joined the community
- Today
-
SLW210, Your concern is very much appreciated. As I now understand it, below is the key difference that is breaking the original program coded for AutoCAD when used in BricsCAD Researching per Grok AI: "The DXFIN command does not work exactly the same in AutoCAD and BricsCAD, though both support it and it relates to handling DXF files. Key Differences Core behavior — AutoCAD's DXFIN opens the DXF as a standalone drawing; BricsCAD's imports into the current one. Use cases — This reflects design philosophy: BricsCAD (and some other AutoCAD-compatible platforms like progeCAD) adds convenience for merging DXF data directly, a feature AutoCAD users often request but handle via workarounds. In AutoCAD The DXFIN command loads a DXF file in a way similar to the OPEN command. It typically opens the selected DXF file as a new or current drawing (often in a new tab if multiple drawings are allowed). This behavior aligns with historical use for converting DXF into an editable AutoCAD drawing, especially in older versions or for recovery purposes (e.g., exporting to DXF via DXFOUT and reloading via DXFIN to clean issues). AutoCAD lacks a built-in command to directly merge or import the full contents of a DXF file into an already open drawing. Users often work around this by opening the DXF separately and copying/pasting elements. In BricsCAD The DXFIN command explicitly opens a file dialog to select a DXF file and imports its contents into the current open drawing (merging the geometry, layers, etc., into the existing workspace). This makes it more like an "import/merge" tool. BricsCAD also has separate commands like OPEN (for opening DXF/DWG as new tabs) and IMPORT (for other formats or specific cases). Contextual nuances — Some BricsCAD forum discussions suggest slight variations (e.g., in scripts vs. interactive use), but official documentation confirms the import-into-current behavior." ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- I queried Grok about the Visual LISP code submitted. Here is the result: No, this LISP code will not work reliably in BricsCAD as written, though parts of it are compatible and could function with modifications. BricsCAD offers excellent AutoLISP and Visual LISP compatibility—most functions like vla-get-activedocument, vla-purgeall, vla-ZoomExtents, vlax-get-acad-object, vl-directory-files, and vl-file-directory-p work identically or very similarly to AutoCAD. The helper functions (_getfolder, _getfiles, void) are standard and platform-agnostic (assuming Windows for the Shell COM object in _getfolder). DXFIN Behavior and Erase Step BricsCAD's DXFIN command imports the DXF file's contents into the current drawing (merging geometry, layers, etc., with existing content), rather than replacing it outright. The code explicitly erases everything first with (command ".erase" "all" ""), which clears the drawing before importing. This effectively achieves a "replace" behavior, making this part intentional and effective for BricsCAD's merge-style import. However, the line (vl-cmdf "_.dxfin" dxf) supplies the filename directly. Official BricsCAD documentation states that DXFIN opens a file dialog. In scripted/LISP mode, this might: Open the dialog (requiring user interaction, breaking batch processing) Or accept the filename argument directly (common in some CAD platforms for scripting) Without suppressing dialogs (e.g., via (setvar "FILEDIA" 0)), it risks pausing for input. Save Command Issue This is the primary breaking point. The code uses (command ".save" (strcat ... )) to save each processed DXF as a DWG (using the original base name, no extension—BricsCAD would add .dwg). In BricsCAD, the SAVE command typically performs a quick save (QSAVE) to the current drawing's name or opens the Save As dialog if unnamed. It does not reliably accept a filename argument directly in command/LISP mode for a scripted Save As operation. As a result: The provided path/filename would likely be ignored. It would either quick-save to the current drawing's existing name (overwriting the first saved file repeatedly) or prompt a dialog. For multiple files, all conversions would end up saving to the same file (the one named after the first DXF), defeating the batch purpose. BricsCAD (like AutoCAD) uses SAVEAS for specifying a new filename in scripts, often requiring (setvar "FILEDIA" 0) to avoid dialogs, e.g.: lisp (setvar "FILEDIA" 0) (command "._saveas" "" (strcat path (vl-filename-base dxf) ".dwg")) (setvar "FILEDIA" 1) Or better, use ActiveX: (vla-SaveAs actDoc newFullPath acNative) for reliable, dialog-free saving. Other Minor Notes Undo marking/back: Works, but saves commit changes, so undoing at the end won't revert saved files. Expert set to 2: Suppresses warnings—fine. Path handling: Mix of / and \\ is usually tolerated on Windows. Purge after erase: Redundant but harmless. ZoomExtents: Fine via VLA. Suggested Fixes for BricsCAD To make this batch DXF-to-DWG converter work unattended: Suppress dialogs: Add (setvar "FILEDIA" 0) at start, restore at end. For DXFIN: Test if direct filename works; if not, use a workaround (e.g., OPEN the DXF in a new drawing, then copy/paste or save). Replace the save line with a proper SaveAs, preferably via vla-SaveAs. Optionally start with a new blank drawing. Have you tested this code in BricsCAD already? What specific error or behavior did you observe (e.g., dialogs appearing, wrong saves)? Knowing that would help pinpoint if DXFIN accepts direct files in your version. Alternatively, are you open to a modified version of the code that uses more reliable methods like vla-SaveAs? ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- I will proceed with testing a modified version of the code as supplied from the above suggestions that follows: START (defun c:DxfToDwg ( / actDoc dxf-folder dxf-list oldFileDia oldCmdEcho oldExpert) (setq actDoc (vla-get-activedocument (vlax-get-acad-object))) (vl-load-com) (cond ((not (setq dxf-folder (_getfolder "Select folder with dxf files"))) (princ "\nNo folder selected")) ((not (vl-consp (setq dxf-list (_getfiles dxf-folder "*.dxf")))) (princ (strcat "\nNo dxf files in folder " dxf-folder))) (t ;; Save and suppress dialogs/echo for scripted operation (setq oldFileDia (getvar "FILEDIA")) (setq oldCmdEcho (getvar "CMDECHO")) (setq oldExpert (getvar "EXPERT")) (setvar "FILEDIA" 0) (setvar "CMDECHO" 0) (setvar "EXPERT" 2) (command ".undo" "mark") (foreach dxf dxf-list (command ".erase" "all" "") (vla-purgeall actDoc) (vl-cmdf "_.dxfin" dxf) ;; Imports into current (cleared) drawing (vla-ZoomExtents (vlax-get-acad-object)) ;; Save as DWG with explicit .dwg extension using ActiveX (reliable in BricsCAD) (setq dwgPath (strcat (vl-filename-directory dxf) "\\" (vl-filename-base dxf) ".dwg")) (vla-SaveAs actDoc dwgPath) ;; Saves in current DWG format; overwrites if exists ) (command ".undo" "back") ;; Restore system variables (setvar "FILEDIA" oldFileDia) (setvar "CMDECHO" oldCmdEcho) (setvar "EXPERT" oldExpert) ) ) (princ) ) ;; Helper functions (unchanged from original) (defun _getfolder ( m / f s) (if (and (setq s (vlax-create-object "Shell.Application")) (setq f (vlax-invoke s 'browseforfolder 0 m 65536 ""))) (setq f (vlax-get-property (vlax-get-property f 'self) 'path)) ) (vl-catch-all-apply 'vlax-release-object (list s)) (if f (vl-string-translate "\\" "/" f)) ) (defun void (x) (or (eq x nil) (and (listp x) (not (vl-consp x))) (and (eq 'STR (type x)) (eq "" (vl-string-trim " \t\r\n" x)))) ) (defun _getfiles ( fol ext / lst) (cond ((or (void fol) (not (vl-file-directory-p fol))) (princ (strcat "\nInvalid folder :" (vl-princ-to-string fol)))) (t (if (vl-consp (setq lst (vl-directory-files fol ext 1))) (setq lst (mapcar '(lambda (x) (strcat fol "/" x)) lst)) ) ) ) lst ) THANKS! I want to thank the original submitter of this post and to all the concerned experts here that take time to assist. NOTE I realize that AI can only take you so far. It does not replace learning and advancing my LISP programming skills nor does it replace the important nuances and logic that us as humans can detect and serves to perfect the code. I will test the above code and provide an update. Thanks, Clint
-
Do you have an example file? Most likely a difference in AutoCAD and BricsCAD, I'll try to look at it next week, but a full workload so no guarantees. IIRC, I have not used that on AutoCAD 2026.
-
rlx started following Batch convert dxf to dwg
-
new to Bricad but this seems to work : (defun c:DxfToDwg ( / actDoc dxf-folder dxf-list ) (setq actDoc (vla-get-activedocument (vlax-get-acad-object))) (vl-load-com) (cond ((not (setq dxf-folder (_getfolder "Select folder with dxf files"))) (princ "\nNo folder selected")) ((not (vl-consp (setq dxf-list (_getfiles dxf-folder "*.dxf")))) (princ (strcat "\nNo dxf files in folder " dxf-folder))) (t (command ".undo" "mark")(setvar "expert" 2) (foreach dxf dxf-list (command ".erase" "all" "") (vla-purgeall actDoc) (vl-cmdf "_.dxfin" dxf) (vla-ZoomExtents (vlax-get-acad-object)) (command ".save" (strcat (vl-filename-directory dxf) "\\" (vl-filename-base dxf))) ) (command ".undo" "back") ) ) (princ) ) ; generic getfolder routine with possibility to create a new subfolder (_getfolder "select path") (defun _getfolder ( m / f s) (if (and (setq s (vlax-create-object "Shell.Application")) (setq f (vlax-invoke s 'browseforfolder 0 m 65536 "")))(setq f (vlax-get-property (vlax-get-property f 'self) 'path)) (setq f nil))(vl-catch-all-apply 'vlax-release-object (list s)) (if f (vl-string-translate "\\" "/" f))) (defun void (x) (or (eq x nil) (and (listp x)(not (vl-consp x))) (and (eq 'STR (type x)) (eq "" (vl-string-trim " \t\r\n" x))))) (defun _getfiles ( fol ext / lst) (cond ((or (void fol) (not (vl-file-directory-p fol))) (princ (strcat "\nInvalid folder :" (vl-princ-to-string fol)))) (t (if (vl-consp (setq lst (vl-directory-files fol ext 1))) (setq lst (mapcar '(lambda (x)(strcat fol "/" x)) lst)))) ) lst )
-
.... so it isn't importing the DXF file? Still holidays till Monday so CAD is still off but what happens if you do the 'dxfin' line manually: (command "DXFIN" (strcat "-FolderName"- "\\" "-fileName-" ) "Default" "" "")
-
Venkatesh munusaami joined the community
- Yesterday
-
Have some time again so will try to have another go, hopefully your metric makes life easier. I would start with a layout with a title block and say some viewports at different sizes out side the title block. So have insets, and larger ones. Drag a viewport to location on title block. Go to modelspace in viewport and zoom to approx view required, can then display current scale as a 1:x so enter correct scale, viewport is corrected for scale and a Rectang drawn in Model with a label etc. Does that sound helpful ? let me know.
-
If your being provided the pdf's as part of a project, then why are they not provided under some form of copy right agreement. Am I reading between the lines and you have found some pdf's that you want to use without contacting the original authors ? Where I worked we often had out side consultants provide a dwg to us and we had an agreement about how we would use what was provided to us.
-
MEP-easy-maker9209 joined the community
-
MEP to PCF file for AUtoCAD Isometric WS
MEP-easy-maker9209 replied to Pipeprincess's topic in AutoCAD Drawing Management & Output
A very late response here. Have you tried the PIPEEX PCF plug-in? It allows to generate isometric Shop drawings and is supported by several software solutions, not sure if AutoCAD MEP is among them though…check it -
Clint started following Batch convert dxf to dwg
-
A cursory inspection of the attached program is appreciated. I have a deadline today. The modified program shown above: DOES create the DWG files DOES NOT show the entities as shown in the source DXF files There is the possibility that I may have introduced in the code when editing it. I will thoroughly review and use the BricsCAD BLADE editor to debug it tomorrow BRICSCAD I use BricsCAD V25 that includes the DXFIN command just as AutoCAD. I took the liberty of changing the header but maintaining this link and the editor in the comments. ;;; DXF2DWG.lsp - Batch converts *.dxf drawings into *.dwg drawings ;;; Author: Written by M. Moolhuysen. Edited by C. Matthews. Edited by CEH ;;; Created on: 2024-01-10 ;;; Last edited: 2026-01-02 ;;; Description: ;;; Converts a list of BricsCAD *.dxf drawings into BricsCAD *.dwg drawings ;;; ;;;* DXFIN.LSP - Converts a list of BricsCAD *.dxf drawings into BricsCAD *.dwg drawings ;;; Start command by typing DXF2DWG ;;; ;;; Make the necessary adjustments to the following variables: ;;; --------------------------------------------------------- ;;; tx1 = path and name of a file that holds a list with names for all the *.dxf's to be imported, ;;; names of *.dxf drawings may be written without extension, as well as with extension, ;;; in plain text format, no return after the last line. ;;; tx2 = the path for the input folder, containing the actual *.dxf files to import. ;;; tx3 = the path for the output folder, where the drawings converted into *.dwg will be saved, ;;; (routine assumes that the *.dwg files do not exist yet) ;;; tx4 = name of the drawing model to import ;;; ;;; ;;; The routine reads drawing names from the file given in tx1 line-for-line. ;;; In each loop it performs a DXFIN from the folder given as tx2 into the existing AutoCAD drawing, ;;; does a Zoom Extends, saves the converted drawing result as *.dwg in the folder given as tx3, ;;; and finally restores the drawing to its original state, ready to receive the next DXFIN loop. ;;; ;;; The DELAY command for 1000 milliseconds (1 second) is needed to provide sufficient separation ;;; between the DXFIN and SAVEAS processes (otherwise it starts to mix up drawings). ;;; ;;; The DXFIN command trips when the name of the *.dxf to be imported contains a comma, ;;; I advise to rename drawings having this issue. ;;; ;;; This software may not be sold as commercial product or included as part of a commercial product. ;;; ;;; Modified by SLW210 A.K.A. Steve Wilson from DGN import to DXF import 01/10/2024 * ;;; In response to this thread at CADTutor * ;;; https://www.cadtutor.net/forum/topic/78909-batch-convert-dxf-to-dwg/#comment-626951 * ;;; ;;; ------------------------- Program Start ------------------------- ;;; (defun C:DXF2DWG (/ fil tx1 tx2 tx3 tx4 tx5) (princ "Please select input folder. \n") (setq tx1 (vl-directory-files (setq tx2 (acet-ui-pickdir)) "*.dxf")) ; Select the folder containing *.dxf files to be imported. (princ "Please select output folder. \n") (setq tx3 (acet-ui-pickdir) ; Select folder for the *.dwg files to be exported into. tx4 "Default" ) (setvar "FILEDIA" 0) (foreach tx5 tx1 (if (wcmatch tx5 "*`.???") (setq tx5 (substr tx5 1 (- (strlen tx5) 4))) ) (command "_UNDO" "_MARK" "DXFIN" (strcat tx2 "\\" tx5) tx4 "" "" "_ZOOM" "_E" "._DELAY" 500 "_SAVEAS" "2018(LT2018)" (strcat tx3 "\\" tx5 ".dwg") "_N" ) (command "_ERASE" "ALL" "") ;erases everything on the page after the save (command "_.purge" "_all" "" "_no") ;purges everything so you don't carry it over to the next drawing (command "_.purge" "_regapp" "" "_no") (command "_QNEW") ;opens a new drawing (setvar "FILEDIA" 0) ) (princ) ) DXF2DWG.lsp
-
There is a very, very minor difference between a W12x45 and a W12x40 and it has to do with the flange thickness. It will not affect the creation of any drawing required.
-
tombu started following Viewport Inset Generator
-
Lee's code allows the user to automatically generate polylines in modelspace representing the outline of a selected paperspace viewport, all viewports in the active paperspace layout, or all viewports found in all paperspace layouts. As long as the current layer is displayed in the Key Plan Viewport model space all those rectangles should display already. troggarf's code puts a copy of selected objects in paperspace.
-
tstaudigel joined the community
-
Okay gotcha. Thank you! I'm sure I'll be back soon with more questions I thought the type of steel girder PF called for changed. From what others have said it was W12x45's, now it's W1240's
-
Steven P started following Revit -> PDF -> Autocad
-
Didn't read this post earlier, but a word of caution, if the vendor won't send out vector files (PDFs, DWGs), there might be a reason for it - propriety information. But if you can't get them as vectors then as SLW210 says, got to do the work yourself converting raster graphics to proper lines - also be aware in any converted vectors, text drawn as lines and not text and exploded dashed lines, layer names will often be prefixed with PDF_ which I would also convert (I think Lee Mac has a LISP for that). Dimensions might also be off (intentionally?) to be fixed... Yeah, I love PDFs
-
neaga joined the community
- Last week
-
Papet joined the community
-
Linli joined the community
-
Dynamic Block w/Rotation and Stretch
Calteq replied to Bill Tillman's topic in AutoCAD Drawing Management & Output
Here's another enjoy CallOut_Imp.dwg -
@Danielm103 ""with mtext, you have to use a fixed width font" I agree, Monotxt.sHx I think was what I used. monotxt_.ttf EXTRA FONTS A-Z.txt Banner heading3.lsp
-
Even i have a real job. I just ask you to respect me and if it bothers you, don't respond. I don't want any controversy. Anyway, Happy New Year to everyone.
-
Most of the members here have real jobs as well and provide help as their own busy schedules allow. I do not believe anyone was being rude, just nudging you along to do a little work for yourself.
-
I have done something like this a couple of years ago :
-
I would like to help someone who, like me, will need it and post the list. (defun c:SetByBlockDeep (/ sel i ent obj name nameList) (vl-load-com) ;; --- Funzione Ricorsiva per processare le definizioni --- (defun process-block-def (blockName / bDef) (setq bDef (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) blockName)) (vlax-for subEnt bDef ;; 1. Cambia Colore e Trasparenza dell'entità corrente (vla-put-color subEnt 0) ; 0 = ByBlock (vla-put-entitytransparency subEnt "ByBlock") ;; 2. Se l'entità è a sua volta un blocco (nidificato), processa la sua definizione (if (= (vla-get-ObjectName subEnt) "AcDbBlockReference") (progn (if (vlax-property-available-p subEnt 'EffectiveName) (process-block-def (vla-get-EffectiveName subEnt)) (process-block-def (vla-get-Name subEnt)) ) ) ) ) ) ;; ------------------------------------------------------- (princ "\nSeleziona blocchi (verranno processati tutti i livelli nidificati)...") (if (setq sel (ssget '((0 . "INSERT")))) (progn (setq nameList '()) (repeat (setq i (sslength sel)) (setq ent (ssname sel (setq i (1- i)))) (setq obj (vlax-ename->vla-object ent)) ;; Ottieni il nome (gestendo i dinamici) (if (vlax-property-available-p obj 'EffectiveName) (setq name (vla-get-EffectiveName obj)) (setq name (vla-get-Name obj)) ) ;; Se non abbiamo ancora processato questo blocco, avvia la ricorsione (if (not (member name nameList)) (progn (process-block-def name) (setq nameList (cons name nameList)) ) ) ) (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acAllViewports) (princ (strcat "\nCompletato. " (itoa (length nameList)) " definizioni di blocco e relativi sotto-blocchi aggiornati.")) ) (princ "\nNessun blocco selezionato.") ) (princ) )
-
Thank you @Steven P, Cheers .
-
thanks for your gide
-
architectsarath joined the community
-
so this makes the color byblock and the transparency byblock in the blocks?
-
I'm working and I don't have time. Not everyone is as good at programming as you. Why did you respond so rudely? I think that without creating unnecessary controversy you could have not responded if the matter bothered you. Did you have a bad Christmas? However thanks
-
with mtext, you have to use a fixed width font import traceback from pyrx import Ap, Db, Ed import art @Ap.Command() def doit(): try: db = Db.curDb() mt = Db.MText() mt.setDatabaseDefaults() val = art.text2art("Sup Dude!", font="big", sep ="\\P") mt.setContents("{\\Fmonotxt8|c0;" + val + "}") db.addToModelspace(mt) except Exception as err: traceback.print_exception(err)
-
here's your big text import traceback from pyrx import Ap, Db, Ed ascii = {'A': ['▄████▄ ', '██ ██ ', '██████ ', '██ ██ ', '██ ██ '], 'B': ['█████ ', '██ ██ ', '█████ ', '██ ██ ', '█████ '], 'C': ['▄█████ ', '██ ', '██ ', '██ ', '▀█████ '], 'D': ['█████ ', '██ ██ ', '██ ██ ', '██ ██ ', '█████ '], 'E': ['▄█████ ', '██ ', '█████ ', '██ ', '▀█████ '], 'F': ['██████ ', '██ ', '████ ', '██ ', '██ '], 'G': ['▄█████ ', '██ ', '██ ███ ', '██ ██ ', '▀████▀ '], 'H': ['██ ██ ', '██ ██ ', '██████ ', '██ ██ ', '██ ██ '], 'I': ['██ ', '██ ', '██ ', '██ ', '██ '], 'J': [' ██ ', ' ██ ', ' ██ ', '██ ██ ', '██████ '], 'K': ['██ ██ ', '██ ██ ', '█████ ', '██ ██ ', '██ ██ '], 'L': ['██ ', '██ ', '██ ', '██ ', '█████ '], 'M': ['▄██████▄ ', '██ ██ ██ ', '██ ██ ██ ', '██ ██ ', '██ ██ '], 'N': ['██ ██ ', '███ ██ ', '██████ ', '██ ███ ', '██ ██ '], 'O': ['▄████▄ ', '██ ██ ', '██ ██ ', '██ ██ ', '▀████▀ '], 'P': ['█████ ', '██ ██ ', '█████ ', '██ ', '██ '], 'Q': [' ████ ', '██ ██ ', '██▀▄██ ', '██ ██ ', ' ███ █ '], 'R': ['█████ ', '██ ██ ', '█████ ', '██ ██ ', '██ ██ '], 'S': ['▄████ ', '██ ', '▀███▄ ', ' ██ ', '████▀ '], 'T': ['██████ ', ' ██ ', ' ██ ', ' ██ ', ' ██ '], 'U': ['██ ██ ', '██ ██ ', '██ ██ ', '██ ██ ', ' ████ '], 'V': ['██ ██ ', '██ ██ ', '██ ██ ', ' ██ ██ ', ' ███ '], 'W': ['██ █ ██ ', '██ █ ██ ', '██ █ ██ ', '▀█████▀ ', ' █ █ '], 'X': ['██ ██ ', '██ ██ ', ' ██ ', '██ ██ ', '██ ██ '], 'Y': ['██ ██ ', '██ ██ ', ' ████ ', ' ██ ', ' ██ '], 'Z': ['██████ ', ' ██ ', ' ██ ', '██ ', '██████ '], '0': [' ████ ', '██ ██ ', '██▀▄██ ', '██ ██ ', ' ████ '], '1': [' ██ ', '▄███ ', ' ██ ', ' ██ ', ' ██ '], '2': [' ████ ', '█ ██ ', ' ██ ', '██ ', '██████ '], '3': ['█████ ', ' ██ ', '█████ ', ' ██ ', '█████ '], '4': ['██ ██ ', '██ ██ ', '██████ ', ' ██ ', ' ██ '], '5': ['█████ ', '██ ', '████ ', ' ██ ', '████ '], '6': [' █████ ', '██ ', '█████ ', '██ ██ ', ' ████ '], '7': ['██████ ', ' ██ ', ' ██ ', ' ██ ', '██ '], '8': [' ████ ', '██ ██ ', ' ████ ', '██ ██ ', ' ████ '], '9': [' ████ ', '██ ██ ', ' █████ ', ' ██ ', ' ███ '], ':': [' ', '██ ', ' ', '██ ', ' '], '&': [' ███ ', '██ ██ ', ' █████ ██ ', '██ ███ ', ' █████ ██ '], ' ': [' ',' ',' ',' ',' '] } def _Big_text(text: str): lines = [""] * 5 text = text.upper() for char in text: pattern = ascii.get(char, [" ??? " ] * 5) for i in range(5): lines[i] += pattern[i] for line in lines: print(line) @Ap.Command() def doit1(): try: _Big_text("Sup coders") except Exception as err: traceback.print_exception(err)
-
There's also art https://pypi.org/project/art/ might take some work to get it in am mtext import traceback from pyrx import Ap, Db, Ed import art @Ap.Command() def doit1(): try: art.tprint("Sup coders") except Exception as err: traceback.print_exception(err)
