Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 10/28/2025 in Posts

  1. Seneca said: “Homines dum docent discunt.” Which, roughly, means: Learn to explain and explain to learn
    3 points
  2. 100% agree. I'd take BIGAL's route but idk if it would suffer from the same issue as my first screenshot. but the macro could be used to update old drawings easily. Coming from cad one of my main grips about solidworks was the customization and how you had to go digging around menus to change things. But I inderstand why it's that way. Did see if you had a dimension selected in the option panel you could go to other tab > override > feet inch and it would use like 3' - 6“ but if it was less than 12" it would only use in. Our drawings only show the number and just have a note in the title block saying. all dimensions are in inches unless otherwise called out. We have some Europe contracts so we will have to do things in metric from time to time.
    1 point
  3. Yes, GP_'s need Express Tools AFAIK. As I posted, It still is off from yours on some corners. It also creates lines and splines, though easy enough to make them polylines.
    1 point
  4. For these examples, I’ll be working with a folder with copies of the same drawing, pretend they’re floors of the same building or something
    1 point
  5. Working with the layout manager in a side database context, LayoutManager methods have overloads that take a database argument import traceback from pyrx import Db, Ed, Ge, Ap, Rx, Gs from timeit import default_timer as timer from collections import defaultdict def processDWG(db: Db.Database, allLayouts: dict[list]): lm = Db.LayoutManager() # LayoutManager methods have overloads that take a database argument # here we just want to get the layout names for layoutName, LayoutId in lm.getLayouts(db).items(): allLayouts[db.getFilename()].append(layoutName) # example if we want to search for title blocks # ignore the model tab if not "MODEL".casefold() in layoutName.casefold(): layout = Db.Layout(LayoutId) ps = Db.BlockTableRecord(layout.getBlockTableRecordId()) for id in ps.objectIds(Db.BlockReference.desc()): ref = Db.BlockReference(id) print(ref.getBlockName()) def readDWG(file: str, allLayouts): sideDb = Db.Database(False, True) sideDb.readDwgFile(file) sideDb.closeInput(True) processDWG(sideDb, allLayouts) @Ap.Command() def doit(): try: start = timer() allLayouts = defaultdict(list) for file in Ap.Application.listFilesInPath("E:\\temp", ".dwg"): readDWG(file, allLayouts) print("Time = {} seconds: ".format(timer() - start)) for k, v in allLayouts.items(): print(k, v) except Exception as err: traceback.print_exception(err) Command: DOIT Project data <--- a block I added to paperspace, could be a title block Time = 0.0780531999989762 seconds: E:\temp\Floor Plan Sample1.dwg ['Layout1', 'Model'] E:\temp\Floor Plan Sample2.dwg ['Layout1', 'Model'] E:\temp\Floor Plan Sample3.dwg ['Layout1', 'Model'] E:\temp\Floor Plan Sample4.dwg ['Layout1', 'Model'] E:\temp\Floor Plan Sample5.dwg ['Layout1', 'Model'] E:\temp\Floor Plan Sample6.dwg ['Layout1', 'Model'] E:\temp\Floor Plan Sample7.dwg ['Layout1', 'Model'] E:\temp\Floor Plan Sample8.dwg ['Layout1', 'Layout2', 'Model']
    1 point
  6. Yes. Part of the problem is with arcs whose initial angle (group 50 in the database) is greater than the final angle (group 51 in the database). But you also have to specify point p2 inside the arc so that it's drawn in the correct location. I had to spend a bit of time figuring this out. (defun C:bm (/ obj num i obj1 db ct rd a1 a2 p1 p2 r ptlist osmant) (setq osmant (getvar "OSMODE")) (setvar "osmode" 0) ; Turn off OSNAP (setq obj (ssget '((0 . "LWPOLYLINE,ARC")))) (setq num (sslength obj)) (setq i 0) (repeat num (setq obj1 (ssname obj i)) (setq db (entget obj1) ptlist (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) db)) ) (if (= (cdr (assoc 0 db)) "ARC") (progn (setq ct (cdr (assoc 10 db))) (setq rd (cdr (assoc 40 db))) (setq a1 (cdr (assoc 50 db)); angulo inicial del arco a2 (cdr (assoc 51 db)); angulo final del arco ) (setq a (if (> a1 a2) (+ a1 (/ (- (* 2. PI) (- a1 a2) ) 2.)) (/ (+ a1 a2) 2.))) (setq p1 (polar ct a1 rd)) (setq p2 (polar ct a (* rd 0.9))) (setq p3 (polar ct a (* rd 1.1))) (command "_.dimradius" "_non" p1 "_non" p2 "") (command "_.dimarc" "_non" p1 "_non" p3 "") ) ;progn ;;; (progn ;polyline arc segment ;;;;;code (foreach l db (if (= (car l) 10) (if p1 (if bulge (progn (command "_.dimradius" "_non" p1 "_non" (cdr l) "") (command "_.dimarc" "_non" p1 "_non" (setq p1 (cdr l)) "") ; ) ) (setq p1 (cdr l)) ) (if (= (car l) 42) (setq bulge (/= (cdr l) 0.0))) ) ) ;progn ) (setq i (1+ i)) ) ;repeat end ; Turn off OSNAP (setvar "osmode" osmant) (princ) )
    1 point
  7. The working database https://help.autodesk.com/view/OARX/2025/ENU/?guid=OARX-RefGuide-AcDbHostApplicationServices__workingDatabase AcDbHostApplicationServices::workingDatabase AcDbHostApplicationServices::setWorkingDatabase It’s mostly legacy stuff at this point; there are some function calls in ObjectARX that do not have a database parameter. They work assuming that that the working database has been set. This is the same sample as above, but we use AutoWorkingDatabase import traceback from pyrx import Db, Ed, Ge, Ap, Rx, Gs from timeit import default_timer as timer from collections import defaultdict def processDWG(allphones: dict[int]): # shortcut to # Db.HostApplicationServices.workingDatabase() db = Db.workingDb() refs = [Db.BlockReference(id) for id in db.objectIds(Db.BlockReference.desc())] for ref in refs: if ref.getBlockName() != "FNPHONE": continue allphones[db.getFilename()] += 1 def readDWG(file: str, allphones): sideDb = Db.Database(False, True) sideDb.readDwgFile(file) sideDb.closeInput(True) # use RAII to set and restore the working db wdb = Db.AutoWorkingDatabase(sideDb) processDWG(allphones) @Ap.Command() def doit(): try: start = timer() # read all text from a collection of drawings allphones = defaultdict(int) for file in Ap.Application.listFilesInPath("E:\\temp", ".dwg"): readDWG(file, allphones) print("Time = {} seconds: ".format(timer() - start)) for k, v in allphones.items(): print(k, v) except Exception as err: traceback.print_exception(err) same output Command: DOIT Time = 0.12193889999980456 seconds: E:\temp\Floor Plan Sample1.dwg 51 E:\temp\Floor Plan Sample2.dwg 51 E:\temp\Floor Plan Sample3.dwg 51 E:\temp\Floor Plan Sample4.dwg 51 E:\temp\Floor Plan Sample5.dwg 51 E:\temp\Floor Plan Sample6.dwg 51 E:\temp\Floor Plan Sample7.dwg 51 E:\temp\Floor Plan Sample8.dwg 51
    1 point
  8. If you notice, everywhere a class or function returns an objectId collection, you can apply a type filter refs = [Db.BlockReference(id) for id in db.objectIds(Db.BlockReference.desc())]
    1 point
  9. One thing to keep in mind, is that way python’s garbage collector works; First created, First deleted. We want to break up the functions to ensure that the side database is not deleted before any of it’s objects. This example, we will iterate though all eight files and count the number of phones by floor import traceback from pyrx import Db, Ed, Ge, Ap, Rx, Gs from timeit import default_timer as timer from collections import defaultdict def processDWG(db: Db.Database, allphones: dict[int]): # scan the entire database for blocks, this is a tad slower than just scanning # modelspace refs = [Db.BlockReference(id) for id in db.objectIds(Db.BlockReference.desc())] for ref in refs: if ref.getBlockName() != "FNPHONE": continue allphones[db.getFilename()] += 1 def readDWG(file: str, allphones): # we reading an already created drawing, so change # buildDefaultDrawing: bool = False, # noDocument: bool = True # we want to keep this in a seperate function sideDb = Db.Database(False, True) sideDb.readDwgFile(file) sideDb.closeInput(True) processDWG(sideDb, allphones) @Ap.Command() def doit(): try: start = timer() # read all text from a collection of drawings allphones = defaultdict(int) for file in Ap.Application.listFilesInPath("E:\\temp", ".dwg"): readDWG(file, allphones) print("Time = {} seconds: ".format(timer() - start)) for k, v in allphones.items(): print(k, v) except Exception as err: traceback.print_exception(err) Command: DOIT Time = 0.1402779999998529 seconds: E:\temp\Floor Plan Sample1.dwg 51 E:\temp\Floor Plan Sample2.dwg 51 E:\temp\Floor Plan Sample3.dwg 51 E:\temp\Floor Plan Sample4.dwg 51 E:\temp\Floor Plan Sample5.dwg 51 E:\temp\Floor Plan Sample6.dwg 51 E:\temp\Floor Plan Sample7.dwg 51 E:\temp\Floor Plan Sample8.dwg 51
    1 point
  10. You changed label format, the lisp routine trying to sort the strings by extracting the number at the 3rd position L-1 – L32 You will need to fix it to extract the number from XXX-XXX-1(20) The issue is, we don’t know if XXX-XXX will eventually contain a number I.e. A23-ACB-1(20) We don’t know what number you want the labels sorted by. Think about this and report back when you have a standardized label
    1 point
  11. Better late the never this will add a " to the end of dimensions for a drawing that is set to IPS. tho doesn't work quite right when tolerances are used. will also prompt you if you are going to overwrite any data Sub addtick() Dim swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View, swDispDim As SldWorks.DisplayDimension, swDim As SldWorks.Dimension Dim unitSystem As Long, okRun As Boolean, sCurrSuffix As String, id As String Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If swModel Is Nothing Then MsgBox "No active document.", vbExclamation, "Add Inch Tick" Exit Sub End If If swModel.GetType <> swDocDRAWING Then MsgBox "This macro only runs on drawings.", vbExclamation, "Add Inch Tick" Exit Sub End If unitSystem = swModel.Extension.GetUserPreferenceInteger( _ swUserPreferenceIntegerValue_e.swUnitSystem, _ swUserPreferenceOption_e.swDetailingNoOptionSpecified) If unitSystem <> swUnitSystem_e.swUnitSystem_IPS Then MsgBox "This macro will only run in IPS(Inch, Pound, Second) Drawing.", vbExclamation, "Add Inch Tick" Exit Sub End If Set swDraw = swModel Set swView = swDraw.GetFirstView Do While Not swView Is Nothing Set swDispDim = swView.GetFirstDisplayDimension5 Do While Not swDispDim Is Nothing Set swDim = swDispDim.GetDimension sCurrSuffix = swDispDim.GetText(swDimensionTextSuffix) If sCurrSuffix <> "" And Not sCurrSuffix = """" Then If MsgBox("Overwrite """ & sCurrSuffix & """?", vbQuestion + vbYesNo) = vbYes Then swDispDim.SetText swDimensionTextSuffix, """" End If Else swDispDim.SetText swDimensionTextSuffix, """" End If Set swDispDim = swDispDim.GetNext3 Loop Set swView = swView.GetNextView Loop swModel.GraphicsRedraw2 MsgBox "Ticks Added to Drawing" End Sub
    1 point
  12. Well, for the DEBUG CONSOLE, I stumbled on the problem when I wasn't searching. I had a filter active at the top right of the bottom Code Panel. On deleting it, suddenly I saw all the blue reports. Yay!
    1 point
  13. Since we're all going off topic (thanks a lot Bigal ) , might as well join the band. Added the 'check before paste' lisp to my toolbar. Not sure if I'm ever gonna use it but that wasn't the point, was working on a way to make it a little more easier for myself to update the toolbars for my colleagues (the old last century toolbars , you oldies know what I mean) so lazy as I am , created a button for that too. It hasn't been field tested though so it may or may not work at all... New for me was the help part. Never used html in my life before and also read-write stream only used a couple of times (to create a few .bmp files for the toolbar by means of lisp , look for the Party button) So lets party yeah! euh ...the button I mean (oh just press the darn help button) Easy_Toolbar_Creator.lsp
    1 point
×
×
  • Create New...