You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cabinet Vision菱形孔网格半循环问题修复方案

菱形孔堆叠图案生成代码的半循环问题与修复

问题背景

我编写了一个循环函数,可基于父对象尺寸和预定义变量(如形状长度、最小边框、间隙距离)生成一排菱形孔,上方一行会缩进,形成类似堆叠桶的图案。但遇到半循环问题:以15英寸高度的对象为例,手动可放置2行孔,但代码无法实现。尝试修改LOOPY、LOOPCUTY变量仅会添加完整循环行,无法生成目标2行。

原核心代码(第一组形状在;***First Row***处生成,第二组缩进形状在;***SecondRow***处生成):

;Modifies Adjustable Shelf

 For Each S_DSLAB Part

 IF WINERACKROUTE = NULL THEN
 WINERACKROUTE = 0
 END IF
 
 IF WINERACKROUTE = 0 THEN
 EXIT
 END IF
 
IF !DIADX THEN
 DIADX<MEAS> = 4.25 
 DIADX<STYLE> = 1 
 DIADX<DESC> = 'DIAMOND SIZE' 
END IF
IF !DIAGAP THEN
 DIAGAP<MEAS> = 1 
 DIAGAP<STYLE> = 1 
 DIAGAP<DESC> = 'DIAMOND SPCING' 
END IF
IF !MINBORDER THEN
 MINBORDER<MEAS> = .25 
 MINBORDER<STYLE> = .25 
 MINBORDER<DESC> = 'MINIMUM BORDER' 
END IF

 
 CROSSDIA = SQRT(2*(DIADX^2))
 CROSSGAP = SQRT(2*(DIAGAP^2)) 
  XBORDER = 999
  YBORDER = 999     
  
LOOPX = 0
LOOPY = 0 
      
WHILE XBORDER > (CROSSDIA + CROSSGAP)/2 DO 
 LOOPX += 1 
 XBORDER := (  DX - MINBORDER - MINBORDER - (LOOPX*CROSSDIA) - ((LOOPX-1)*CROSSGAP)  )/2
END WHILE 
WHILE YBORDER > (CROSSDIA + CROSSGAP)/2 DO 
 LOOPY += 1 
 YBORDER := (  DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY-1)*CROSSGAP)  )/2
END WHILE 


;***First Row***
 LOOPCUTY := 0 
 WHILE LOOPCUTY < LOOPY DO
  LOOPCUTX := 0
  LOOPCUTY += 1 
 WHILE LOOPCUTX < LOOPX DO
  LOOPCUTX += 1
  Dim DIAMOND as New ROUTE
  DIAMOND.TOOLID = 230
  DIAMOND.NAME = 'DIAMOND'
  DIAMOND.Visible<bool> := True
  DIAMOND.DX = DIADX
  DIAMOND.DY = DIADX
  DIAMOND.DZ = :DZ
  DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTX-1)*(CROSSDIA+CROSSGAP)
  DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTY-1)*(CROSSDIA+CROSSGAP)
  DIAMOND.Z := 0
  DIAMOND.AX<deg> = 0
  DIAMOND.AY<deg> = 0
  DIAMOND.AZ<deg> = -45
  DIAMOND._FACEWP = 1
  DIAMOND._RCUT = 0
 END WHILE  
 END WHILE  

;***Second Row***
 LOOPCUTTY := 0 
 WHILE LOOPCUTTY < (LOOPY-1) DO
  LOOPCUTTX := 0
  LOOPCUTTY += 1 
 WHILE LOOPCUTTX < (LOOPX-1) DO
  LOOPCUTTX += 1
  Dim DIAMOND as New ROUTE
  DIAMOND.TOOLID = 230
  DIAMOND.NAME = 'DIAMOND'
  DIAMOND.Visible<bool> := True
  DIAMOND.DX = DIADX
  DIAMOND.DY = DIADX
  DIAMOND.DZ = :DZ
  DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTTX-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2
  DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTTY-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2
  DIAMOND.Z := 0
  DIAMOND.AX<deg> = 0
  DIAMOND.AY<deg> = 0
  DIAMOND.AZ<deg> = -45
  DIAMOND._FACEWP = 1
  DIAMOND._RCUT = 0
 END WHILE  
 END WHILE

解决方案说明

通过以下两点调整解决问题:

  • 添加尺寸范围判断,对高度在10.75-15.5英寸之间的对象,强制生成2行孔
  • 将原代码中的DY替换为父对象的CAB.DY,并添加Y轴偏移量补偿子部件(下方小基座)的位置偏差,保证孔位整体居中

修复后的完整代码:

For Each S_DSLAB Part

 IF WINERACKROUTE = NULL THEN
 WINERACKROUTE = 0
 END IF
 
 IF WINERACKROUTE = 0 THEN
 EXIT
 END IF
 
IF !DIADX THEN
 DIADX<MEAS> = 4.25 
 DIADX<STYLE> = 1 
 DIADX<DESC> = 'DIAMOND SIZE' 
END IF
IF !DIAGAP THEN
 DIAGAP<MEAS> = 1 
 DIAGAP<STYLE> = 1 
 DIAGAP<DESC> = 'DIAMOND SPCING' 
END IF
IF !MINBORDER THEN
 MINBORDER<MEAS> = .25 
 MINBORDER<STYLE> = .25 
 MINBORDER<DESC> = 'MINIMUM BORDER' 
END IF

 
 CROSSDIA = SQRT(2*(DIADX^2))
 CROSSGAP = SQRT(2*(DIAGAP^2)) 
  XBORDER = 999
  YBORDER = 999     
  
 ;------------ cut off bad sizes that dont work
  IF CAB.DY >= 15.5 or CAB.DY < 10.75 THEN
  
LOOPX = 0
LOOPY = 0 
  
  
  ;------------ started adding + 2*y to compensate for pedestals being smaller than door counterparts for Y positioning
      
WHILE XBORDER > (CROSSDIA + CROSSGAP)/2 DO 
 LOOPX += 1 
 XBORDER := (  DX - MINBORDER - MINBORDER - (LOOPX*CROSSDIA) - ((LOOPX-1)*CROSSGAP)  )/2
END WHILE 
WHILE YBORDER > (CROSSDIA + CROSSGAP)/2 DO 
 LOOPY += 1 
 YBORDER := (  CAB.DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY-1)*CROSSGAP)  )/2 + (2*Y)
; YBORDER := (  DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY)*CROSSGAP)  )/2
END WHILE 

 LOOPCUTY := 0 
 WHILE LOOPCUTY < LOOPY DO
  LOOPCUTX := 0
  LOOPCUTY += 1 
 WHILE LOOPCUTX < LOOPX DO
  LOOPCUTX += 1
  Dim DIAMOND as New ROUTE
  DIAMOND.TOOLID = 230;136
  DIAMOND.NAME = 'DIAMOND'
  DIAMOND.Visible<bool> := True
  DIAMOND.DX = DIADX
  DIAMOND.DY = DIADX
  DIAMOND.DZ = :DZ
  DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTX-1)*(CROSSDIA+CROSSGAP)
  DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTY-1)*(CROSSDIA+CROSSGAP) - (3*Y)
  DIAMOND.Z := 0
  DIAMOND.AX<deg> = 0
  DIAMOND.AY<deg> = 0
  DIAMOND.AZ<deg> = -45
  DIAMOND._FACEWP = 1
  DIAMOND._RCUT = 0
 END WHILE  
 END WHILE  

 LOOPCUTTY := 0 
 WHILE LOOPCUTTY < (LOOPY-1) DO
  LOOPCUTTX := 0
  LOOPCUTTY += 1 
 WHILE LOOPCUTTX < (LOOPX-1) DO
  LOOPCUTTX += 1
  Dim DIAMOND as New ROUTE
  DIAMOND.TOOLID = 230 ;136
  DIAMOND.NAME = 'DIAMOND'
  DIAMOND.Visible<bool> := True
  DIAMOND.DX = DIADX
  DIAMOND.DY = DIADX
  DIAMOND.DZ = :DZ
  DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTTX-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2
  DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTTY-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2 - (3*Y)
  DIAMOND.Z := 0
  DIAMOND.AX<deg> = 0
  DIAMOND.AY<deg> = 0
  DIAMOND.AZ<deg> = -45
  DIAMOND._FACEWP = 1
  DIAMOND._RCUT = 0
 END WHILE  
 END WHILE  
END IF


;----- isolate off at certain Y heights to force 2 columns of openings
 IF CAB.DY < 15.5 AND CAB.DY >= 10.75 THEN
  
LOOPX = 0
LOOPY = 0
   
      
WHILE XBORDER > (CROSSDIA + CROSSGAP)/2 DO 
 LOOPX += 1 
 XBORDER := (  DX - MINBORDER - MINBORDER - (LOOPX*CROSSDIA) - ((LOOPX-1)*CROSSGAP)  )/2
END WHILE 
WHILE YBORDER > (CROSSDIA + CROSSGAP)/2 DO 
 LOOPY += 1 
 YBORDER := (  :Cab.DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY-1)*CROSSGAP)  )/2 + (2*Y)
; older version:  YBORDER := (  DY - MINBORDER - MINBORDER - (LOOPY*CROSSDIA) - ((LOOPY)*CROSSGAP)  )/2
END WHILE 

 LOOPCUTY := 0 
 WHILE LOOPCUTY < LOOPY DO
  LOOPCUTX := 0
  LOOPCUTY += 1 
 WHILE LOOPCUTX < LOOPX DO
  LOOPCUTX += 1
  Dim DIAMOND as New ROUTE
  DIAMOND.TOOLID = 230;136
  DIAMOND.NAME = 'DIAMOND'
  DIAMOND.Visible<bool> := True
  DIAMOND.DX = DIADX
  DIAMOND.DY = DIADX
  DIAMOND.DZ = :DZ
  DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTX-1)*(CROSSDIA+CROSSGAP)
  DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTY-1.25)*(CROSSDIA+CROSSGAP) - (3*Y)
  DIAMOND.Z := 0
  DIAMOND.AX<deg> = 0
  DIAMOND.AY<deg> = 0
  DIAMOND.AZ<deg> = -45
  DIAMOND._FACEWP = 1
  DIAMOND._RCUT = 0
 END WHILE  
 END WHILE  

 LOOPCUTTY := 0
 WHILE LOOPCUTTY < (LOOPY) DO
  LOOPCUTTX := 0
  LOOPCUTTY += 1 
 WHILE LOOPCUTTX < (LOOPX-1) DO
  LOOPCUTTX += 1
  Dim DIAMOND as New ROUTE
  DIAMOND.TOOLID = 230 ;136
  DIAMOND.NAME = 'DIAMOND'
  DIAMOND.Visible<bool> := True
  DIAMOND.DX = DIADX
  DIAMOND.DY = DIADX
  DIAMOND.DZ = :DZ
  DIAMOND.X := MINBORDER+XBORDER+(LOOPCUTTX-1)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2
  DIAMOND.Y := MINBORDER+YBORDER+(CROSSDIA/2)+(LOOPCUTTY-1.25)*(CROSSDIA+CROSSGAP)+(CROSSDIA+CROSSGAP)/2 - (3*Y)
  DIAMOND.Z := 0
  DIAMOND.AX<deg> = 0
  DIAMOND.AY<deg> = 0
  DIAMOND.AZ<deg> = -45
  DIAMOND._FACEWP = 1
  DIAMOND._RCUT = 0
 END WHILE  
 END WHILE  

END IF

内容的提问来源于stack exchange,提问作者D.Reed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:32:00