Skip to content

Commit 8a456d5

Browse files
committed
Fix : GeometricExtents not working so used GetBoundingBox to get min an max point of entity
1 parent 1b7e7b5 commit 8a456d5

File tree

7 files changed

+65
-25
lines changed

7 files changed

+65
-25
lines changed

AutoCAD/AutoCAD_Module.py

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,7 @@ def explode_object(self, obj):
525525
except Exception as e:
526526
raise CADException(f"Error exploding object: {e}")
527527

528+
528529
def get_block_extents(self, block_name):
529530
"""
530531
Gets the geometric extents (bounding box) of a block reference.
@@ -538,28 +539,56 @@ def get_block_extents(self, block_name):
538539
try:
539540
for entity in self.iter_objects("AcDbBlockReference"):
540541
if entity.Name == block_name:
541-
min_point = APoint(*entity.GeometricExtents.MinPoint)
542-
max_point = APoint(*entity.GeometricExtents.MaxPoint)
543-
return min_point, max_point
542+
print(entity.GetBoundingBox)
543+
min_pt, max_pt = entity.GetBoundingBox()
544+
return APoint(*min_pt), APoint(*max_pt)
544545
except Exception as e:
545546
raise CADException(f"Error getting extents of block '{block_name}': {e}")
546547

548+
def get_entity_extents(self, entity):
549+
"""
550+
Returns the bounding box (min and max APoint) of any AutoCAD entity using GetBoundingBox.
551+
552+
Args:
553+
entity: The AutoCAD COM object (line, block, polyline, etc.)
554+
Returns:
555+
tuple(APoint, APoint): Min and Max APoint
556+
Raises:
557+
CADException: If bounding box can't be computed
558+
"""
559+
try:
560+
min_pt, max_pt = entity.GetBoundingBox()
561+
return APoint(*min_pt), APoint(*max_pt)
562+
except Exception as e:
563+
raise CADException(f"Cannot get bounding box for entity: {e}")
564+
547565
def add_overall_dimensions(self, entity):
548566
"""
549-
Adds overall horizontal and vertical dimensions to an entity based on its geometric extents.
567+
Adds overall horizontal and vertical dimensions to an entity based on its bounding box.
550568
Args:
551569
entity: The AutoCAD object to dimension.
552570
Raises:
553571
CADException: If dimensions cannot be added.
554572
"""
555573
try:
556-
min_point, max_point = APoint(*entity.GeometricExtents.MinPoint), APoint(*entity.GeometricExtents.MaxPoint)
557-
self.add_dimension(Dimension(min_point, APoint(max_point.x, min_point.y, min_point.z),
558-
APoint(min_point.x, min_point.y - 5, min_point.z), DimensionType.ALIGNED))
559-
self.add_dimension(Dimension(min_point, APoint(min_point.x, max_point.y, min_point.z),
560-
APoint(min_point.x - 5, min_point.y, min_point.z), DimensionType.ALIGNED))
574+
min_point, max_point = self.get_entity_extents(entity)
575+
576+
self.add_dimension(Dimension(
577+
min_point,
578+
APoint(max_point.x, min_point.y, min_point.z),
579+
APoint((min_point.x + max_point.x) / 2, min_point.y - 5, min_point.z),
580+
DimensionType.ALIGNED
581+
))
582+
583+
self.add_dimension(Dimension(
584+
min_point,
585+
APoint(min_point.x, max_point.y, min_point.z),
586+
APoint(min_point.x - 5, (min_point.y + max_point.y) / 2, min_point.z),
587+
DimensionType.ALIGNED
588+
))
589+
561590
except Exception as e:
562-
raise CADException(f"Error adding overall dimensions: {e}")
591+
raise CADException(f"Failed to add overall dimensions: {e}")
563592

564593
def get_user_defined_blocks(self):
565594
"""
@@ -1193,18 +1222,19 @@ def zoom_extents(self):
11931222

11941223
def zoom_to_object(self, obj):
11951224
"""
1196-
Zooms the active viewport to fit a specific object.
1225+
Zooms the active viewport to fit a specific object using GetBoundingBox.
11971226
Args:
11981227
obj: The AutoCAD object to zoom to.
11991228
Raises:
12001229
CADException: If the zoom operation fails.
12011230
"""
12021231
try:
1203-
min_point_variant = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8,
1204-
obj.GeometricExtents.MinPoint)
1205-
max_point_variant = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8,
1206-
obj.GeometricExtents.MaxPoint)
1232+
min_pt, max_pt = obj.GetBoundingBox()
1233+
min_point_variant = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, min_pt)
1234+
max_point_variant = win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, max_pt)
1235+
12071236
self.acad.ZoomWindow(min_point_variant, max_point_variant)
1237+
12081238
except Exception as e:
12091239
raise CADException(f"Error zooming to object: {e}")
12101240

@@ -1219,7 +1249,6 @@ def add_table(self, table_obj: Table):
12191249
CADException: If the table cannot be created or data is inconsistent.
12201250
"""
12211251
try:
1222-
# --- 1. Validate input and determine dimensions ---
12231252
if not table_obj.data or not isinstance(table_obj.data[0], list):
12241253
raise ValueError("Input 'data' must be a non-empty list of lists.")
12251254

@@ -1256,13 +1285,13 @@ def add_table(self, table_obj: Table):
12561285

12571286
current_row = 0
12581287
if has_title:
1259-
table.SetRowType(current_row, 1) # 1 = acTitleRow
1288+
table.SetRowType(current_row, 1)
12601289
table.SetText(current_row, 0, table_obj.title)
12611290
table.MergeCells(current_row, 0, current_row, num_cols - 1)
12621291
current_row += 1
12631292

12641293
if has_headers:
1265-
table.SetRowType(current_row, 2) # 2 = acHeaderRow
1294+
table.SetRowType(current_row, 2)
12661295
for col_idx, header_text in enumerate(table_obj.headers):
12671296
table.SetText(current_row, col_idx, header_text)
12681297
current_row += 1

AutoCAD/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from .AutoCAD_Module import *
2-
__version__ = "0.1.5"
2+
__version__ = "0.1.6"

AutoCAD/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
print("| workflows,enabling efficient drawing manipulations, custom |")
55
print("| scripting, and automation of repetitive CAD tasks |")
66
print("| using Python. |")
7-
print("| version : 0.1.5 By - JonesPeter |")
7+
print("| version : 0.1.6 By - JonesPeter |")
88
print("| github : https://github.com/Jones-peter |")
99
print("| |")
1010
print("╚──────────────────────────Unlimited CAD Automation───────────────────────────╝")

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
![Banner](./images/banner.png)
22

3-
# AutoCAD - python library Latest Version 0.1.5
3+
# AutoCAD - python library Latest Version 0.1.6
44
[![GitHub](https://img.shields.io/badge/GitHub-Jones--peter-181717?style=for-the-badge&logo=github&logoColor=white)](https://github.com/Jones-peter) [![Instagram](https://img.shields.io/badge/Instagram-jones__peter__-E4405F?style=for-the-badge&logo=instagram&logoColor=white)](https://www.instagram.com/jones_peter__/) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Jones--Peter-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/jones-peter-121157221/) [![Website](https://img.shields.io/badge/Website-jonespeter.site-0078D4?style=for-the-badge&logo=google-chrome&logoColor=white)](https://jonespeter.site)
55

66
## Overview
@@ -394,6 +394,11 @@ cad = AutoCAD()
394394
cad.distribute_objects([circle, line, rectangle], 5)
395395
```
396396

397+
- **get_entity_extents(entity):**: To get Min and Max Point of an Entity
398+
```python
399+
min_point, max_point = cad.get_entity_extents(entity)
400+
```
401+
397402
### Error Handling ❌
398403

399404
The module includes custom error handling through the `CADException` class, which provides detailed error messages for AutoCAD-related operations.

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
project = 'AutoCAD'
66
author = 'Jones Peter'
7-
release = '0.1.5'
7+
release = '0.1.6'
88

99
extensions = [
1010
'sphinx.ext.autodoc',

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
setup(
99
name="AutoCAD",
10-
version="0.1.5",
10+
version="0.1.6",
1111
packages=find_packages(),
1212
install_requires=requirements,
1313
entry_points={

tests/test.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
# Print details about the blocks
1313
for block in blocks:
1414
print(f"Block Name: {block.Name}, Insertion Point: {block.InsertionPoint}")
15-
time.sleep(2)
15+
time.sleep(1)
1616
if not block.Name == "A$C625fddc0":
17-
acad.move_object(block, APoint(0, 0, 0))
17+
acad.move_object(block, APoint(150, 150, 0))
18+
time.sleep(1)
19+
min_point, max_point = acad.get_block_extents(block.Name)
20+
print(f"min : {min_point} max : {max_point}")
21+
acad.add_rectangle(max_point, min_point)
22+
acad.add_overall_dimensions(block)
23+
acad.zoom_to_object(block)

0 commit comments

Comments
 (0)