zwonko Posted December 8, 2023 Posted December 8, 2023 Is there option to delete row in AutoCAD table in autolisp? For example row number 4. Didn't find anything on web. Maybe anybody know easy workaround? Quote
mhupp Posted December 8, 2023 Posted December 8, 2023 (edited) I don't know how to ask user to Select a cell or test that a cell has been selected. so just do that before running this command. maybe someone can figure that out. ;;----------------------------------------------------------------------------;; ;; Delete current row from table _O = Operation _RO = delete ROw _Q = Quit (defun C:DCR(\) ;ask user to select a cell and wait for selection (setvar 'cmdecho 0) (command "_EditTableCell" "_O" "_RO" "_Q") (setvar 'cmdecho 1) (princ) ) Edited December 8, 2023 by mhupp 1 Quote
zwonko Posted December 8, 2023 Author Posted December 8, 2023 thank You!!! Renember that "pause" gives user option to choose. But I want to implement it in other code. I've I manage I will paste code here. Quote
BIGAL Posted December 8, 2023 Posted December 8, 2023 (edited) Lee-mac has a Hit-test that returns the cell address of a table. Have a look for it. (setq obj (vlax-ename->vla-object (car (entsel "Pick table obj")))) (vla-DeleteRows obj 3 1) ; row how many (vla-put-regeneratetablesuppressed obj :vlax-false) ; regen tablea Edited December 8, 2023 by BIGAL 2 Quote
Danielm103 Posted December 9, 2023 Posted December 9, 2023 As an option, you can do it with one click using HitTest, This is ActiveX, so it should be translatable to Autolisp import traceback import PyRx as Rx import PyGe as Ge import PyGi as Gi import PyDb as Db import PyAp as Ap import PyEd as Ed import AxApp24 as Ax def PyRxCmd_deleterow(): try: axApp = Ax.getApp() axDoc = axApp.ActiveDocument #select the cell but also make a slection fence normal = (0, 0, 1) #z hitPnt = axDoc.Utility.GetPoint("\nSelect cell: ") minmax = hitPnt + axDoc.GetVariable("VSMAX") #select using out new fence axSs = axDoc.SelectionSets.Add("AXTBLSS") axSs.SelectByPolygon(Ax.constants.acSelectionSetFence, minmax, [0], ["ACAD_TABLE"]) #run the hittest for axEnt in axSs: axTable = Ax.IAcadTable(axEnt) hit = axTable.HitTest(hitPnt, normal) if hit[0]: axTable.DeleteRows(hit[1],1) except Exception as err: traceback.print_exception(err) finally: axSs.Delete() 2 Quote
BIGAL Posted December 10, 2023 Posted December 10, 2023 Like this (setq obj (vlax-ename->vla-object (car (entsel "Pick obj")))) (setq pt (getpoint "\nPick point inside cell ")) (If (Eq :Vlax-true (Vla-hittest Obj (Vlax-3d-point (Trans Pt 1 0))(Vlax-3d-point (Trans (Getvar 'Viewdir) 1 0)) 'R 'C)) (List O R C) ) (NIL 3 0) = (nil row column) 2 Quote
zwonko Posted December 11, 2023 Author Posted December 11, 2023 (edited) Great thanks for everyone. For me the best was @BIGAL from third post. There is not so much info about vla-DeleteRows, but that gives me everything. (vla-DeleteRows obj 3 1) ; row how many My goal was to automatically clean/delete row from table, if values are same in next rows. Maybe somebody will find this code usefull. (defun c:RemoveDuplicateRows_WORKING_clean_old4 (/ ent row tbl cell1 cell2 col) (if (setq ent (car (entsel "\nSelect a table: "))) ; allows the user to select a table (progn (princ "\nTable selected successfully.") ; displays a message after selecting a table (setq tbl (vlax-ename->vla-object ent)) (setq col 1) (setq row 0) (princ "\nRow 0 selected.") ; displays a message after selecting a row (while (< row (vla-get-rows tbl)) ; recalculates the number of rows after each deletion (setq cell1 (vla-GetText tbl row col)) ; compares only the first column (setq cell2 (vla-GetText tbl (+ row 1) col)) ; compares only the first column (princ "\nCells read.") ; displays a message after reading the cells (if (and cell1 cell2 (= cell1 cell2)) (progn (vla-DeleteRows tbl (+ row 1) 1) ; vla-DeleteRows objectTable rowNumber HowManyRowsToDelete (princ (strcat "\nRow " (itoa row) " and row " (itoa (+ row 1)) " are the same.")) ; displays a message if the rows are the same ) (setq row (+ row 1)) ) ) (princ (strcat "\nNumber of rows after removing duplicates: " (itoa (vla-get-rows tbl)))) ; displays the number of rows after removing duplicates ) ) (princ) ) Code is cleaning table/deleting rows If the data in subsequent rows is identical and repeated several times in a row. For example data: 1 1520 2 1520 3 1520 4 1530 5 1540 6 1520 7 1520 8 1545 we will revive: 1 1520 4 1530 5 1540 6 1520 8 1545 The next goal to achieve is that in the first column you will get something resembling a rep count. If I manage to achieve this, I will post the code here. Wan't to get it like: 1to3 1520 4 1530 5 1540 6to7 1520 8 1545 Edited December 11, 2023 by zwonko Quote
BIGAL Posted December 11, 2023 Posted December 11, 2023 Ok rather than delete rows you can remove duplicates in a list that would be easier, then make the table. You do though need to sort the list for it to work. yes can get 1520 3, 1540 4 and so on as a count then put in table. Will see what I can do later working on something similar at moment. Quote
zwonko Posted December 12, 2023 Author Posted December 12, 2023 (edited) Yes, I also thought it's easier to make a list and prepare the table. I even have a code for it. However, the problem is that I need to set the appropriate styles/height/etc in the generated table - to make it looks like source. So I've get back to deleting. Code for new table is: (defun c:NewTableWithRemovedDuplicateRow_WORKING (/ ent row tbl cell1 cell2 newtbl pt rowmax inspt uniqueData) (if (setq ent (car (entsel "\nSelect a table: "))) ; allows the user to select a table (progn (princ "\nTable selected successfully.") ; displays a message after selecting a table (setq tbl (vlax-ename->vla-object ent)) (setq inspt (vlax-get tbl 'InsertionPoint)) ; reads the insertion point of the table (setq colWidth1 (vla-getColumnWidth tbl 0)) (setq rowHeight (vla-getRowHeight tbl 2)) (setq row 0) (setq rowmax (vla-get-rows tbl)) ; reads the number of rows in the table (setq uniqueData '()) ; initializes the list of unique data (while (< row 2) ; copies the first two rows without checking (setq uniqueData (append uniqueData (list (list (vla-GetText tbl row 0) (vla-GetText tbl row 1))))) ; adds the row to the end of the list (setq row (+ row 1)) ) (while (< row rowmax) ; recalculates the number of rows after each removal (setq cell1 (vla-GetText tbl row 1)) ; compares only the second column (if (not (member cell1 (mapcar 'cadr uniqueData))) ; checks if the value is already in uniqueData (setq uniqueData (append uniqueData (list (list (vla-GetText tbl row 0) (vla-GetText tbl row 1)))))) ; adds the unique row to the end of the list (setq row (+ row 1)) ) (setq pt (getpoint "\nEnter the insertion point for the new table: ")) ; asks the user for the insertion point (setq newtbl (vla-addtable (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) (vlax-3d-point (list (car pt) (cadr pt))) (length uniqueData) 2 rowHeight colWidth1)) ; creates a new table based on the length of uniqueData (setq row 0) ; starts from the first row (foreach item uniqueData (vla-SetText newtbl row 0 (nth 0 item)) ; copies the unique data to the new table (vla-SetText newtbl row 1 (nth 1 item)) ; copies the unique data to the new table (setq row (+ row 1)) ) (princ (strcat "\nNumber of rows in the new table: " (itoa (vla-get-rows newtbl)))) ; displays the number of rows in the new table (princ (strcat "\nInsertion point of the selected table: " (vl-princ-to-string inspt))) ; displays the insertion point of the selected table ) ) (princ) ) Can't manage to get same textsize inside new table, so get back for deleting. And actually this code is not exactly what it meant to be. Problem was that it is making just UniqueData. And I wan't to have only the same deleted if there is new value only in previous cell. Probably I've manage to do it but somewhere I've lost the code.. If somebody knows way to set same textHeight like in source table, code for new table is probably faster. Edited December 12, 2023 by zwonko Quote
BIGAL Posted December 12, 2023 Posted December 12, 2023 When you make a table it uses the default table style. Once you make a table you can reset a lot of things like column sizes, text size & alignment. I make a table with Title heading and 1 data row then reset it all to how I want it to look. Then use insertrow method to add rows. Post a dwg with a sample table set up the way you want it to look. Quote
zwonko Posted December 22, 2023 Author Posted December 22, 2023 Sorry, but I've catch some disease... Here is sample. delete_table_row.dwg Quote
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.