Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: leilei4908

[求助] 在调用Form后如何先关闭Form再执行后续程序?

[复制链接]
 楼主| 发表于 2015-9-2 11:53:12 | 显示全部楼层
XYX365 发表于 2015-9-2 10:17
接下来就要考虑“吕”字型的和“回”字形的封闭图形分别添加shape了,两位老师有什么好的建议么?
=>一 ...

现在“吕”已经完成了,但是“回”的,怎么将外面的shape避开里面的“口”?也就是两个shape没有重叠部分
发表于 2015-9-2 12:15:38 | 显示全部楼层
leilei4908 发表于 2015-9-2 11:53
现在“吕”已经完成了,但是“回”的,怎么将外面的shape避开里面的“口”?也就是两个shape没有重叠部分

你怎麼處理"呂"的代碼?
可以貼上來嗎?
 楼主| 发表于 2015-9-2 12:31:02 | 显示全部楼层
XYX365 发表于 2015-9-2 12:15
你怎麼處理"呂"的代碼?
可以貼上來嗎?
  1. axlCmdRegister( "Polygon2Shape" `Polygon2Shape)
  2. procedure( Polygon2Shape()
  3.         axlClearSelSet()
  4.         axlSetFindFilter(?enabled '("noall" "linesegs")        ?onButtons '("noall" "linesegs"))
  5.         axlSingleSelectBox()
  6.         lines_listi = axlGetSelSet()
  7.         axlClearSelSet()
  8.         PathList = list(nil)
  9.         while(lines_listi
  10.                 start = car(car(lines_listi)->startEnd)
  11.                 end = cadr(car(lines_listi)->startEnd)
  12.                 path = list(start end)
  13.                 lines_listi = cdr(lines_listi)
  14.                 closed = 1
  15.                 while(last(path) != list(start) && closed
  16.                         lMatch = setof(x lines_listi (car(x->startEnd) == end || cadr(x->startEnd) == end))
  17.                         if(lMatch then
  18.                                 if(car(car(lMatch)->startEnd) == end then
  19.                                         path = append1(path cadr(car(lMatch)->startEnd))
  20.                                         end = cadr(car(lMatch)->startEnd)
  21.                                 else
  22.                                         path = append1(path car(car(lMatch)->startEnd))
  23.                                         end = car(car(lMatch)->startEnd)
  24.                                 )
  25.                                 lines_listi = remove(car(lMatch) lines_listi)
  26.                         else
  27.                                 closed = nil
  28.                         )
  29.                 )
  30.                 if(closed then
  31.                         Path = axlPathStart(path)
  32.                         PathList = append1(PathList Path)
  33.                 )
  34.         )
  35.         foreach(closedPath PathList
  36.                 axlDBCreateShape(closedPath t "Package Keepout/TOP")
  37.         )
  38.         axlVisibleLayer("Package Keepout/TOP" t)
  39.         axlVisibleUpdate(t)
  40.         axlSetFindFilter(?enabled '("all") ?onButtons '("noall"))
  41. )
  42. axlSetAlias("p2s" "Polygon2Shape")
复制代码
 楼主| 发表于 2015-9-2 12:51:26 | 显示全部楼层
截图201509020902.png
针对这种line画的arc,我的path应该怎样处理?
发表于 2015-9-2 13:16:21 | 显示全部楼层
leilei4908 发表于 2015-9-2 11:53
现在“吕”已经完成了,但是“回”的,怎么将外面的shape避开里面的“口”?也就是两个shape没有重叠部分

现在“吕”已经完成了,但是“回”的,怎么将外面的shape避开里面的“口”?也就是两个shape没有重叠部分
=> "回" 的處理方式可以使用axlPolyOperation()來處理
发表于 2015-9-2 13:26:46 | 显示全部楼层
leilei4908 发表于 2015-9-2 12:51
针对这种line画的arc,我的path应该怎样处理?

Path = axlPathStart(path)
=>這一行只是取線段的開始和結束,所以只是在做Line,
如果要處理arc就必須在加入其他有關arc的參數.
你可以有關axlPath相關函數,


另外你寫的代碼裡面用到兩個while判斷,如果線段很多時,時間就拉長,
你可以在優化他,
或是你可以重新思考一下下面的流程
1.選擇要轉換的line
2.將所有line轉換為path (axlMakeDynamicsPath())
3.將path轉換為poly (axlPolyFromDB())
4.將poly轉換為shape (axlDBCreateShape())
 楼主| 发表于 2015-9-2 17:27:31 | 显示全部楼层
XYX365 发表于 2015-9-2 13:26
Path = axlPathStart(path)
=>這一行只是取線段的開始和結束,所以只是在做Line,
如果要處理arc就必須在 ...

axlMakeDynamicsPath()
这个说明书中举的例子只有一个
Example
Simple r_path segment with a width of 20.
a = axlMakeDynamicsPath(list(list( 10:10 100:100 20)))
针对我这种应该怎么使用?

axlPolyFromDB())
这个说明书中的例子跟我的也不是很相关
Example 1
Create a poly from a via
polyList = axlPolyFromDB(via_dbid, ?layer "ETCH/BOTTOM" ?padType 'ANTI)
Example 2
Create a rectangle poly (one corner at 0,0 with a width 1000 and height of 500) using
r_path method
; note first and last points are the same
         myPath = axlPathStart( list(0:0 1000:0 1000:500 0:500 0:0) 0)
         pathPoly = axlPolyFromDB(myPath )
         poly = car(pathPoly)
         poly->??

能不能举几个相关的例子?
发表于 2015-9-3 06:57:00 | 显示全部楼层
本帖最后由 XYX365 于 2015-9-3 07:22 编辑
leilei4908 发表于 2015-9-2 17:27
axlMakeDynamicsPath()
这个说明书中举的例子只有一个
Example

哈哈,寫程式很辛苦又很有趣吧
以下是我寫的代碼,供你參考
  1. axlSetFindFilter(?enabled list("noall" "linesegs") ?onButtons list("all"))
  2. axlSelect() ;axlSingleSelectPoint()
  3. lLines = axlGetSelSet()
  4. axlClearSelSet()
  5. lPath = nil
  6. rPath = nil
  7. tLayer = "PACKAGE GEOMETRY/ASSEMBLY_TOP"

  8. lLastPoint = cadr(car(lLines)->startEnd) ;取第一個線段的結束位置
  9. lStartXY = car(car(lLines)->startEnd)
  10. lEndXY = cadr(car(lLines)->startEnd)
  11. nWidth = car(lLines)->width
  12. lCenterXY = car(lLines)->xy
  13. nRadius = car(lLines)->radius
  14. bClockwise = car(lLines)->isClockwise
  15. rPath = cons(list(lStartXY lEndXY nWidth lCenterXY nRadius bClockwise) rPath)
  16. lTempLines = cdr(lLines) ;取第二個以後的所有線段

  17. xCount = 1
  18. while(lTempLines && xCount <= length(cdr(lLines))
  19.         lMatchLines = setof(x lTempLines ((car(x->startEnd) == lLastPoint) || (cadr(x->startEnd) == lLastPoint)))
  20.         when(lMatchLines
  21.                 if(car(car(lMatchLines)->startEnd) == lLastPoint then
  22.                         lLastPoint = cadr(car(lMatchLines)->startEnd)
  23.                         lStartXY = car(car(lMatchLines)->startEnd)
  24.                         lEndXY = cadr(car(lMatchLines)->startEnd)
  25.                         nWidth = car(lMatchLines)->width
  26.                         lCenterXY = car(lMatchLines)->xy
  27.                         nRadius = car(lMatchLines)->radius
  28.                         bClockwise = car(lMatchLines)->isClockwise
  29.                         rPath = cons(list(lStartXY lEndXY nWidth lCenterXY nRadius bClockwise) rPath)
  30.                 else
  31.                         lLastPoint = car(car(lMatchLines)->startEnd)
  32.                         lStartXY = cadr(car(lMatchLines)->startEnd) ;要取第二個當作開始
  33.                         lEndXY = car(car(lMatchLines)->startEnd)        ;取第一個當作結束
  34.                         nWidth = car(lMatchLines)->width
  35.                         lCenterXY = car(lMatchLines)->xy
  36.                         nRadius = car(lMatchLines)->radius
  37.                         bClockwise = car(lMatchLines)->isClockwise
  38.                         rPath = cons(list(lStartXY lEndXY nWidth lCenterXY nRadius bClockwise) rPath)
  39.                 )
  40.                 lTempLines = remq(car(lMatchLines) lTempLines) ;移除已處理的線段
  41.         )
  42.         ;加入判斷第二個以上的lines所聯成的shape
  43.         when(cadr(car(rPath)) == car(car(last(rPath))) ;&& cadr(car(rPath)) == cadr(car(last(rPath)))) || (car(car(rPath)) == cadr(car(last(rPath))) && cadr(car(rPath)) == car(car(last(rPath))))
  44.                 rPath = reverse(rPath)
  45.                 lPath = cons(rPath lPath)
  46.                 rPath = nil
  47.                
  48.                 ;========================================
  49.                 ;再取第二個封閉的線段
  50.                 lLastPoint = cadr(car(lTempLines)->startEnd) ;取第一個線段的結束位置
  51.                 lStartXY = car(car(lTempLines)->startEnd)
  52.                 lEndXY = cadr(car(lTempLines)->startEnd)
  53.                 nWidth = car(lTempLines)->width
  54.                 lCenterXY = car(lTempLines)->xy
  55.                 nRadius = car(lTempLines)->radius
  56.                 bClockwise = car(lTempLines)->isClockwise

  57.                 rPath = cons(list(lStartXY lEndXY nWidth lCenterXY nRadius bClockwise) rPath)
  58.                 lTempLines = cdr(lTempLines) ;取第二個以後的所有線段
  59.         )
  60.         xCount++
  61. )


  62. cond(
  63.         (onep(length(lPath))
  64.                 rNewPath = axlMakeDynamicsPath(car(lPath))
  65.                 lPoly1 = axlPolyFromDB(rNewPath ?endCapType 'ROUND)
  66.                 axlDBCreateShape(car(lPoly1) t tLayer)
  67.         )       
  68.         (length(lPath) == 2
  69.                 rNewPath1  = axlMakeDynamicsPath(car(lPath))
  70.                 rNewPath2  = axlMakeDynamicsPath(cadr(lPath))
  71.                 lPoly1 = axlPolyFromDB(rNewPath1 ?endCapType 'ROUND)
  72.                 lPoly2 = axlPolyFromDB(rNewPath2 ?endCapType 'ROUND)
  73.                 dShapePoly1 = car(axlPolyOperation(lPoly1 lPoly2 'ANDNOT))
  74.                 unless(dShapePoly1
  75.                         dShapePoly1 = car(axlPolyOperation(lPoly2 lPoly1 'ANDNOT))
  76.                 )
  77.                 dShapePoly2 = car(axlPolyOperation(lPoly1 lPoly2 'AND))
  78.                 cond(
  79.                         (dShapePoly1 && dShapePoly2
  80.                                 axlDBCreateShape(dShapePoly1 t tLayer)
  81.                                 axlDBCreateShape(dShapePoly2 t tLayer)
  82.                         )
  83.                         (t
  84.                                 axlDBCreateShape(car(lPoly1) t tLayer)
  85.                                 axlDBCreateShape(car(lPoly2) t tLayer)
  86.                         )
  87.                 )
  88.         )
  89. )
  90.        
复制代码


复制代码

 楼主| 发表于 2015-9-7 08:31:35 | 显示全部楼层
XYX365 发表于 2015-9-3 06:57
哈哈,寫程式很辛苦又很有趣吧
以下是我寫的代碼,供你參考

主要是对函数用法不了解,如果是我熟悉的C语言,那就轻松多了
 楼主| 发表于 2015-9-7 09:06:25 | 显示全部楼层
XYX365 发表于 2015-9-3 06:57
哈哈,寫程式很辛苦又很有趣吧
以下是我寫的代碼,供你參考
  1. dShapePoly1 = car(axlPolyOperation(lPoly1 lPoly2 'ANDNOT))
  2. unless(dShapePoly1
  3.         dShapePoly1 = car(axlPolyOperation(lPoly2 lPoly1 'ANDNOT))
  4. )
  5. dShapePoly2 = car(axlPolyOperation(lPoly1 lPoly2 'AND))
  6. cond(
  7.         (dShapePoly1 && dShapePoly2
  8.                 axlDBCreateShape(dShapePoly1 t tLayer)
  9.                 axlDBCreateShape(dShapePoly2 t tLayer)
  10.         )
  11.         (t
  12.                 axlDBCreateShape(car(lPoly1) t tLayer)
  13.                 axlDBCreateShape(car(lPoly2) t tLayer)
  14.         )
  15. )
复制代码

这里不是很理解,能解释下么
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号 )

GMT+8, 2024-4-27 04:25 , Processed in 0.162147 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表