3Minimal ZLayout example without external dependencies.
5This example demonstrates core functionality without requiring
13sys.path.insert(0, os.path.join(os.path.dirname(__file__),
'..'))
19 """Test basic geometry operations."""
21 print(
"=== Basic Geometry Tests ===")
28 print(f
"Point 1: {p1}")
29 print(f
"Point 2: {p2}")
30 print(f
"Distance p1 to p2: {p1.distance_to(p2):.2f}")
36 print(f
"\nRectangle 1: {rect1}")
37 print(f
"Rectangle 2: {rect2}")
38 print(f
"Rectangles intersect: {rect1.intersects(rect2)}")
39 print(f
"Point {p3} in rect1: {rect1.contains_point(p3)}")
48 print(f
"\nTriangle: {triangle}")
49 print(f
"Triangle area: {triangle.area():.2f}")
50 print(f
"Triangle is convex: {triangle.is_convex()}")
52 return rect1, rect2, triangle
56 """Test quadtree spatial indexing."""
58 print(
"\n=== Spatial Indexing Tests ===")
72 print(f
"Adding {len(objects)} objects to quadtree...")
73 for i, obj
in enumerate(objects):
74 success = quadtree.insert(obj)
75 print(f
" Object {i+1}: {'✓' if success else '✗'}")
77 print(f
"QuadTree size: {quadtree.size()}")
81 found_objects = quadtree.query_range(query_region)
82 print(f
"Objects in region (0,0,30,30): {len(found_objects)}")
85 containing_objects = quadtree.query_point(query_point)
86 print(f
"Objects containing point (12,12): {len(containing_objects)}")
92 """Test layout analysis without visualization."""
94 print(
"\n=== Layout Analysis Tests ===")
133 for comp
in components:
134 processor.add_component(comp)
137 print(
"Running layout analysis...")
138 results = processor.analyze_layout(
139 sharp_angle_threshold=45.0,
140 narrow_distance_threshold=2.0
144 print(f
"Results structure: {results.keys()}")
147 print(f
"\nAnalysis Results:")
148 print(f
" Sharp angles found: {analysis['sharp_angles']['count']}")
149 if analysis[
'sharp_angles'][
'count'] > 0:
150 print(f
" Sharpest: {analysis['sharp_angles']['sharpest']:.1f}°")
152 print(f
" Narrow regions found: {analysis['narrow_distances']['count']}")
153 if analysis[
'narrow_distances'][
'count'] > 0:
154 print(f
" Minimum distance: {analysis['narrow_distances']['minimum']:.3f}")
156 print(f
" Intersecting polygon pairs: {analysis['intersections']['polygon_pairs']}")
159 optimization = processor.optimize_layout()
160 print(f
"\nOptimization Score: {optimization['optimization_score']:.1f}/100")
162 if optimization[
'suggestions']:
163 print(
"Suggestions:")
164 for suggestion
in optimization[
'suggestions']:
165 print(f
" • {suggestion}")
167 print(
"✅ No issues found!")
169 return processor, optimization
173 """Helper function to print design rule checking results without conditionals in main test."""
176 print(f
" ✅ Passes {process_name} constraints")
180 print(f
" ❌ {violations} violations for {process_name}")
181 print(f
" Sharp angles: {analysis['sharp_angles']['count']}")
182 print(f
" Spacing issues: {analysis['narrow_distances']['count']}")
186 """Test prototype manufacturing process constraints."""
187 print(
"\n--- Prototype Process ---")
188 analysis = processor.analyze_layout(sharp_angle_threshold=20, narrow_distance_threshold=0.5)
189 violations = (analysis[
'sharp_angles'][
'count'] + analysis[
'narrow_distances'][
'count'] +
190 analysis[
'intersections'][
'polygon_pairs'])
195 """Test standard manufacturing process constraints."""
196 print(
"\n--- Standard Process ---")
197 analysis = processor.analyze_layout(sharp_angle_threshold=30, narrow_distance_threshold=1.5)
198 violations = (analysis[
'sharp_angles'][
'count'] + analysis[
'narrow_distances'][
'count'] +
199 analysis[
'intersections'][
'polygon_pairs'])
204 """Test high-precision manufacturing process constraints."""
205 print(
"\n--- High-precision Process ---")
206 analysis = processor.analyze_layout(sharp_angle_threshold=45, narrow_distance_threshold=2.5)
207 violations = (analysis[
'sharp_angles'][
'count'] + analysis[
'narrow_distances'][
'count'] +
208 analysis[
'intersections'][
'polygon_pairs'])
213 """Test design rule checking for different manufacturing processes."""
215 print(
"\n=== Design Rule Checking ===")
231 processor.add_component(sharp_poly)
240 """Run all minimal tests."""
242 print(
"ZLayout - Minimal Functionality Test")
258 print(
"\n" +
"=" * 40)
259 print(
"✅ All tests completed successfully!")
260 print(
"\nNote: For visualization features, install matplotlib:")
261 print(
" pip install matplotlib")
263 except Exception
as e:
264 print(f
"\n❌ Test failed with error: {e}")
266 traceback.print_exc()
272if __name__ ==
"__main__":
2D point with high-precision coordinates and utility methods
Polygon class supporting both convex and concave polygons.
Axis-aligned rectangle for bounding boxes and simple EDA components.
Quadtree spatial index for efficient range and intersection queries.
_test_standard_process(processor)
_print_design_rule_results(process_name, violations, analysis)
_test_high_precision_process(processor)
_test_prototype_process(processor)