主页 > 原创 > Litecad填充(hatch)密度太小/填充太密/填充scale太小的一个解决方法

Litecad填充(hatch)密度太小/填充太密/填充scale太小的一个解决方法

在调用litecad进行绘图时发现,填充hatch的图案太小、太密,大致归纳发现了如下的关系:
scale:填充密度scale的最大值
maxSelectLength:选择的形状的宽度或高度最大值
patLineLength:填充图案(pat文件)线型的最大值
scale = maxSelectLength/patLineLength/3.0

大概 patLineLength 为hatch中的属性LC_PROP_HPL_DASH1…,可以在文本文件中直观看出来。这个关系是并没有找到合理的逻辑意义,但是这个关系造成了填充太密集的问题。即使在scale设置了很大的值,在填充事如果大于上文的scale计算结果,那么最终的LC_PROP_HATCH_SCALE属性就设置为了scale。
试想填充一个10*10像素的矩形,pat文件中有一个线型的定义值为33.3,那么最终的scale只有10/33.3/3.0=0.1。而pat中本身定义的线型就比较大,还用了一个很小的缩放比例,就会显得填充非常密,而事实上,正常绘制的线型不止30这个大小,可能几百甚至上千,最终填充密度非常小(甚至0.00*)会导致填充个数太多,占用大量系统内存而导致程序卡死/崩溃。
虽然不明白为什么litecad作者使用了这个关系式,但这个问题必须避免。
通过修改pat文件尺度、增大图形比例的方式并不合适,其一pat文件不是线性的,不能通过简单的倍数数值改变,其二增大图形比例(如10*10变为1000*1000)的同时填充会填充图案本身会相对变小,效果很不明显。

所以最终决定了如下策略(trick):
利用maxSelectLength值越大scale的值越大这个关系,填充可以选择多个图形填充,而maxSelectLength是所选所有图形的最大宽度或最小宽度,所以可以找一条图层中很长的一条直线在直线的位置绘制一条宽度为0.01的矩形,这样这个矩形和直线重叠就不会显示出来。而填充时选择这个矩形,填充时会找到图形的最大值即直线的长度,这样填充的scale就可以很大,不会被缩减的0.0*(至少可以控制在1以上)。
示例代码如下:
首先选中了需要填充的形状,之后找到两个相对较长的直线(长度是不定的)并比较

HANDLE horLine = lcBlockGetEntByKey(hBlock, HORIZONTAL_LINE20);
HANDLE verLine = lcBlockGetEntByKey(hBlock, VERTICAL_LINE4);

double horLength = lcPropGetFloat(horLine, LC_PROP_LINE_LEN);
double verLength = lcPropGetFloat(verLine, LC_PROP_LINE_LEN);

HANDLE rect;

if (horLength>verLength)
{
 rect = lcBlockAddRect(hBlock, horLength/2.0, 0, horLength, 0.01, 0, FALSE);
}
else
{
 rect = lcBlockAddRect(hBlock, maxLeft, verLength/2.0, 0.01, verLength, 0, FALSE);
}

lcBlockSelectEnt(hBlock, rect, TRUE);

lcBlockAddHatch( hBlock, getPatFile(rockName), getRockTypeId(rockName), 1.0, atan(theta) );
 
lcBlockUnselect( hBlock );

Tags: hatch litecad scale太小

发表评论

邮箱地址不会被公开。 必填项已用*标注