Wednesday, November 29, 2023

Pandas for data extraction, merging DataFrames, Python for AutoCAD

 

I explored Groupby and Aggregate here

import traceback
import pandas as pd
from pyrx import Ap, Ax, Db, Ed, Ge, Gi
 
@Ap.Command()
def PyRxCmd_doit():
    try:
        #setup dictionaries to hold our data
        lineMap = {"Type": [], "Layer": [], "Length": [], "QTY": []}
        circleMap = {"Type": [], "Layer": [], "Diameter": [], "QTY": []}

        #current database
        db = Db.curDb()
        model = Db.BlockTableRecord(db.modelSpaceId())

        #search model for all lines (derived from)
        lineIds = model.objectIds(Db.Line.desc())
        for id in lineIds:
            line = Db.Line(id)
            lineMap["Type"].append("Line")
            lineMap["Layer"].append(line.layer())
            lineMap["Length"].append(line.startPoint().distanceTo(line.endPoint()))
            lineMap["QTY"].append(1)

        #search model for all circles (derived from)
        circleIds = model.objectIds(Db.Circle.desc())
        for id in circleIds:
            circle = Db.Circle(id)
            circleMap["Type"].append("Circle")
            circleMap["Layer"].append(circle.layer())
            circleMap["Diameter"].append(circle.diameter())
            circleMap["QTY"].append(1)

        #create the DataFrames
        lfd = pd.DataFrame(lineMap)
        cfd = pd.DataFrame(circleMap)

        # called before concat because the column names are different
        # groupby & aggregate
        lfd = (lfd.groupby(["Type", "Layer", "Length"],
                        sort=False, as_index=False).agg({"QTY": "sum"}))

        # groupby & aggregate
        cfd = (cfd.groupby(["Type", "Layer", "Diameter"],
                        sort=False, as_index=False).agg({"QTY": "sum"}))


        # concat the DataFrames
        result = pd.concat([lfd, cfd])

        # write to excel, but don't write the index
        with pd.ExcelWriter("e:\\pandas_to_excel.xlsx") as writer:
            result.to_excel(writer, sheet_name="sheet1", index=False)

    except Exception as err:
        traceback.print_exception(err)


 


No comments:

Post a Comment

TraceBoundary sample in Python for AutoCAD

    import traceback from pyrx import Ap , Db , Ed , Ge , Gi @ Ap . Command () def TB () -> None :     try :         db = Db . curD...