使用Perl脚本增强Alias功能
Posted 参数化studio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Perl脚本增强Alias功能相关的知识,希望对你有一定的参考价值。
Perl 脚本是本身是一种UNIX中的王牌工具,由于Alias本身是Linux软件的历史原因,alias默认支持Perl脚本,本文就通过一个简单的例子,给大家演示如何,利用Perl脚本快速实现点的规则阵列。
Perl脚本的特点:
凝练 Perl脚本的一大优势就是使用最简单的方式解决复杂问题,更夸张的是,很多时候,很长一段代码下来,竟然没有定义一个变量你敢信!
“只读” 下面这段代码大家感受下,perl被戏称为read only便不言自明了。
>#!/usr/bin/perl @lines = perldoc -u -f atan2; foreach (@lines){ s/w<()[^>]+)>?|U$1/g; print; }
难于学习 由于perl语言设计之初的宗旨就是,尽可能的满足程序员的需要,所有对于我们这种普通用户难免显得有点难(是我见过最bug的),但是一劳永逸,大家还是忍忍吧,谁让规则是别人定义的.
Alias中的Perl脚本:
宏 Alias perl脚本可以记录我们绝大部分的操作,并以Perl脚本的显示出来.就像下面这段代码这样
代码显示
selectFunction( "Nothing#23" ); clickWindowButtonXYZ( "Camera", 0, -1791.791687, -5130.841064, 1599.617615 ); clickWindowButtonXYZ( "Camera", 0, 78.293103, 50.000000, 0.000000 ); # from select_item selectFunction( "Nothing#23" ); setIntSymbol( "Component#67", "mo_pick_lights", 0 ); setIntSymbol( "Component#67", "mo_pick_constr_obj", 0 ); setIntSymbol( "Component#67", "mo_pick_curves", 1 ); setIntSymbol( "Component#67", "mo_pick_surfaces", 0 ); setIntSymbol( "Component#67", "mo_pick_others", 0 ); setIntSymbol( "Component#67", "mo_pick_all", 0 ); setIntSymbol( "Component#67", "mo_pick_shells", 0 ); setIntSymbol( "Component#67", "mo_pick_scans", 0 ); setIntSymbol( "Component#67", "mo_pick_meshes", 0 ); setIntSymbol( "Component#67", "mo_pick_surface_type", 2 ); selectFunction( "Component#67" ); initTrace( "Camera", "Component#67", 7480359, -179.182861, -513.081665, 159.965591 ); appendTracePoint( 7480359, -179.183838, -513.082336, 159.962357 ); endTrace(7480359); selectFunction( "SurfaceFillet#18" ); clickWindowButtonXYZ( "Camera", 0, -1791.746979, -5130.839233, 1599.674377 ); clickWindowButtonXYZ( "Camera", 0, -1791.639709, -5130.895386, 1599.610291 ); clickWindowButtonXYZ( "Camera", 0, -1791.770477, -5130.861206, 1599.576111 ); clickWindowButtonXYZ( "Camera", 0, -1791.620636, -5130.880127, 1599.682159 );
Perl脚本的一种操作就是直接用这个记录下的代码直接运行即可,玩过拳皇吧,连招会放吧,没错原理基本上是一样的,还有一个更洋气的名字,宏。使用场景呢,经常我们在项目后期需要做大量的倒角工作。而且有些地方不完全倒完还看不出全部的效果,如何呢,我们需要一遍又一遍的重复?NO NO NO
我们只需要将上框中的记录历史复制到下框即可,然后点击RUN-execute
大功告成,剩下的时间只需要倒一杯水,慢慢收割旁边朋友的羡慕眼神吧,嘻嘻。
参数化设计 Perl脚本的实力当然不止于此,更厉害的来了,Abracadabra~~~
下面我们要让各位看官认识一种奇怪的阵列。
如何?是不是头有点晕,熟悉Alias阵列工具的经过仔细观察,这个阵列是无法用alias直接生成的(请仔细观察!)。
这个阵列其实是一个经典数学问题,而且前人已经给出相关的方程
alpha= n*137.5 r = c*sqrt n
137.5是什么呢,可以理解为一个数学常亮吧,是这个图形能够完美紧致的前提。下图是137.3度和137.6度的结果,是不是瞬间丧失了紧致的美感。
然后就是见证奇迹的时刻了。利用学到的Perl语法,把这个公式编写进去,就得到了下面这个代码。
$height=600;
$width= 600;
$nbr_circles = 100;
$PI = 3.14159265359;
$phi = (sqrt(5)+1)/2 - 1;
# golden ratio
$golden_angle = $phi * 2 *$PI;
# golden angle
$lg_rad = $width * 0.45;
$lg_area = ($lg_rad)*($lg_rad) * $PI;
$sm_area = $lg_area / $nbr_circles;
# Area of our little circles, if they filled the space entirely
$sm_rad = sqrt( $sm_area / $PI );
# This is related to the equation area = pi r squared
$fudge =0.5;
# Fudge factor, since our circles don't actually fill up space entirely.
$adj_sm_diameter = $sm_rad * 2 * $fudge;
$cx = $width/2;
$cy = $height/2;
$gx = 0;
$gy = 0;
for ($i = 1; $i <= $nbr_circles; $i++) {
selectFunction( "Circle" );
$angle = $i*$golden_angle;
$cum_area = $i*$sm_area;
$spiral_rad = sqrt( $cum_area /$PI );
$x = cos($angle) * $spiral_rad;
$y = sin($angle) * $spiral_rad;
clickWindowButtonXYZ( "Camera", 0, $x, $y, 0 );
print "$x - $y
";
$distance =5-sqrt(sqrt(($x-$gx)*($x-$gx) + ($y-$gy)*($y-$gy)));
selectFunction( "Scale" );
sendString( "$distance" );
}
将这个代码键入到INPUT 框中去,然后执行。然后再倒一杯水,再次收割旁人的崇拜目光。慢慢享受啪啪啪一个一个圆的生成。
经过一段时间的使用,认为Perl脚本在alias中的应用还是有很多限制,距离项目实际使用还有一段距离。但是同时Perl脚本的出现为参数化建模指出了一个新的思路,不用将所有参数化相关的问题放在GH中解决。相信经过一段时间的发展,Perl一定会进入我们的数模制作流程,进一步的提高工作效率。最后预祝大家工作顺利。
以上是关于使用Perl脚本增强Alias功能的主要内容,如果未能解决你的问题,请参考以下文章