三坐标技术贴系列七——逆向工程(数字化)

写在前面的声明
觉得写得差,没用,随便喷,但是如果转载,请一定保证正文的完整,出处作者随便你提不提。
本人蔡司员工,所有文章内的观点仅代表个人观点,如有观点上的偏颇,请参照本人身份。
文章内如带有广告性质,或部分内容涉及过浅,请见谅,恕本人限于某些原因不接受各种提问。

——————————我是华丽的分隔符——————————

逆向工程是一种特殊的测量,特殊在测量时只有工件本身以及测量人员的经验,没有名义值可以用来辅助测量,没有图纸,没有CAD模型,而是通过测量生成理论数据,所以被称为逆向工程。

通常2种情况下要进行逆向工程测量,一是仿制产品,例如仿制进口的叶片,刀具;二是进行模具设计,先用泥塑等生成实物,满意后再将模型数字化。

整个过程通常分两步骤,先通过测量获得大量点坐标值,然后将点云通过软件处理为数字模型。第二步通常用CAD设计软件完成,对测量机来讲,通常只需要完成第一步的工作。

测量的方法也有很多种,最常用的是使用激光扫描,这种方法效率高,量程大,缺点是精度偏低,对测量面的光反射有要求,通常用来做外形的逆向。三坐标则使用接触式探头,精度高,但是效率低,通常用来做局部精细的逆向。还有一种属于破坏性测量,就是用线切割机在特定截面剖开,然后使用工具显微镜等成像工具绘制曲线。

照十年前的观点来看,用万工显不错,反正有钱,买十个八个的,割开,画线,画展开图,然后加工的人也习惯看这个了;但是放到现在,你把画好的展开图交给设计部门,设计部门拿着展开图画网格,取点,再把这些点手工输入到CAD设计软件里,不太现实。于是三坐标逐渐成为了逆向工程的主力。主力归主力,但毕竟需要仿制的东西也不多,所以用这个东西的也没多少人。

测量原理其实很简单,我发现能实际应用的原理都很简单,因为这些原理很简单的实现起来也超麻烦,原理都复杂根本没办法在低成本下实现——我想起当初高中的时候做银镜实验,同样的原理,银镜就比砖红色沉淀更难获得,其实就是个比例和加热温度问题——在保证测力恒定的情况下,记录探针红宝石球心位置,并通过探头的传感器获得当前测量点的受力方向。通过记录这些点位置及方向,就可以获得描述形状的大量原始点数据,再沿受力方向补偿探针半径尺寸,既可得所需数据。

在Calypso软件中,将曲线分为两种,一种是完全自由曲线,一种则是所有点的方向都只有一个旋转自由度。测量的区别只是完全自由曲线(3-D曲线)需要在两侧测量辅助曲线帮助软件判断曲线的方向。

鉴于原理简单,且测力稳定,探头对测力方向的判断等全是由CMM的传感器完成,靠的是自动控制系统,操作人员的影响极小,所以需要注意的地方并不多。但是水平不同的操作人员对同样工件逆向工程得到的结果往往差很多。

注意事项:

一、尽量选用直径小的红宝石探针。不但可以避免曲率变化过大时的干涉,还可以减少探针半径补偿引起的误差。

二、取点密度不宜过密,探头传感器并不能做到完全正确的判断受力方向,点比较疏的时候,微小的方向偏移不会引起过大的误差,但是当密度过于大的时候,会出现补偿后的点顺序混乱而造成曲线拟合错误。

三、扫描速度的影响。速度过快的话,当曲率突然变化的时候,传感器会由于惯性而导致测力的改变;速度过慢则会导致动摩擦力转为静摩擦力,产生爬行。可以使用不同的速度进行多次测量并比较。

四、无论什么种类,多精密的传感器,由高向低的精度要比由低向高好很多,毕竟沿重力反方向运动要加更多的力在力平衡上。

——————————我是华丽的分隔符——————————
8月就要过去了,9月就要来了,又处于失去意识凭惯性生活的状态了。

建国门生活一周小结

说实话,我稍微有点后悔了,这个地方住得不是很爽,让我连续住10个月估计会受不了,希望未来半年能多出差吧。

虽然地处闹市,周围其实生活还算方便,可是懒得自己开伙,那些饭馆的价格就有些偏高了,便宜的就那几家,不能天天吃吧。很近的地方到是有家我最爱的7-11便利店,话说我越来越喜欢这家店了,真的是方便啊,这个礼拜在里面淘到了各种葡萄酒和咖啡粉,超赞。不过,中午的时候里面排队的人真是夸张啊,比国贸那个店还要夸张。

今天晚上去了次沃尔玛,坐地铁三站,建国门上车,永安里,国贸,大望路,出站走300米就到了,超市蛮大,人也不算太多,逛起来感觉还好,不过咖啡几乎只有速溶的,就卖一种咖啡粉还很贵;食品到是很全,不过考虑一下距离和吃饭时间的交通状况,还是算了。

可能是旁边有华侨村的原因,周围老外很多,所以出现了麦当劳里外国人比中国人多的情况,商店卖东西也有了西化的趋势,旁边的赛特超市就几乎全是进口商品。这两天碰上过几次老外,每次想见义勇为的当当翻译,结果发现人家会说中文,虽然口音很怪吧,不过总算能交流,哎。

昨天和今天得了感冒,估计和地势有关系吧,窗户朝南,1公里之内没有任何遮挡,晚上相当的冷,不知道冬天好不好熬过去。

不管怎么样,已经住过来了,闲暇时间不能浪费好地势,逮个秋高气爽的日子我去逛胡同和使馆区,把使馆的旗子都照下来。

三坐标技术贴系列六——Blade软件简介

写在前面的声明
觉得写得差,没用,随便喷,但是如果转载,请一定保证正文的完整,出处作者随便你提不提。
本人蔡司员工,所有文章内的观点仅代表个人观点,如有观点上的偏颇,请参照本人身份。
文章内如带有广告性质,或部分内容涉及过浅,请见谅,恕本人限于某些原因不接受各种提问。

——————————我是华丽的分隔符——————————

前面的软件介绍都很简略,因为我还在这面干活,控制尺度实在很难,多说不如少说,但是对于Blade这个软件,实在是说不出来。

我还算运气好的,我用过一次Blade,我相信绝大部分专业人士都没机会测一次叶片,为什么呢?

我在很多地方都遇上这么一种情况,客户拿了一个零件,直接问我:“你看这个能用三坐标测量么,你给我测一下。”这是个很外行的行为,测什么,名义值是多少,公差如何,都是要先提供出来的。一个正方形,OK,你不用给我图纸,我可以测;齿轮呢?没有图纸我忍了,我拿卡尺卡个外径,数数齿数,把模数给你算出来;叶片呢?您还是饶了我吧。

所以,即使是在我们部门,很多人也没机会拿Blade实际使用一次,不是没有软件,不是没有零件,而是没有图纸。特别声明一下,虽然逆向工程也是测量的一种,不过这并不能归类到叶片的测量中,后面我会专门写一个小文章介绍。

叶片有自己的参数系统,就和齿轮一样,但是,你很难见到整套的成熟产品的叶片参数,因为这个东西很有技术含量,看得到产品看不到参数,你有参数不一定加工出好产品。事实上,很多地方的图纸根本标的不是各种参数,而是叶片的展开图,根本无法同软件的参数值对应上,我强烈怀疑这是仿制的结果。我猜测,当按照理论上求得的叶片参数进行实际使用时,可能还要在某些地方微调,但是由于其他因素的影响——例如材料,加工精度——设计人员往往无法得知问题是否出在设计环节上。

扯远了,回到软件本身,软件和Gear很类似,设定参数(假设你了解所有参数的意思),修改测量策略,评定并生成报告,看着手册2个小时就能学会,问题在于那些参数,而不是软件本身。

——————————我是华丽的分隔符——————————

看着这两天我更新的东西,实在很矛盾,又是测量又是代码的。同样矛盾的还有想法,换份工作?或者干脆不工作了,去上学?或者自费去留学?或者出国当劳工?

qt example – shapedclock

鉴于已经被我改的面目全非了,我也分不清原来是什么样子的了。
要做到透明效果,需要设置2个地方,一是背景色,二是把表盘无关的区域Mask掉。
shapedclock.h
#ifndef SHAPEDCLOCK_H
#define SHAPEDCLOCK_H

#include <QWidget>

class ShapedClock : public QWidget
{
    Q_OBJECT

public:
    ShapedClock(QWidget *parent = 0);
    QSize sizeHint() const;

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);

private:
    QPoint dragPosition;
};

#endif
shapedclock.cpp
#include <QtGui>

#include "shapedclock.h"

ShapedClock::ShapedClock(QWidget *parent)
    : QWidget(parent, Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowStaysOnTopHint)
      //窗口的种类,Frameless是透明背景必须, staysOnTop是窗口总在最前
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(100);
    //和原来一样的计时器

    move(1100,50);
    //这是我自己加的初始位置

    setAttribute( Qt::WA_TranslucentBackground, true);
    //背景透明

    QAction *quitAction = new QAction(tr("E&xit"), this);
    quitAction->setShortcut(tr("Ctrl+Q"));
    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
    addAction(quitAction);
    //加一个action,快捷键是Ctrl+Q,实现退出功能,我很奇怪的是设定快捷键他的类型是QString,难道可以自动识别?

    setContextMenuPolicy(Qt::ActionsContextMenu);
    setToolTip(tr("Drag the clock with the left mouse button.\n"
                  "Use the right mouse button to open a context menu."));
    setWindowTitle(tr("Shaped Analog Clock"));
    //鼠标悬置的文本提示和标题
}

void ShapedClock::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        dragPosition = event->globalPos() - frameGeometry().topLeft();
        event->accept();
    }
    //当鼠标点下的时候,得到鼠标相对窗口左上角点的相对坐标
}

void ShapedClock::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() & Qt::LeftButton) {
        move(event->globalPos() - dragPosition);
        event->accept();
    }
    //当鼠标移动的时候,用当时鼠标全局位置减去上面的相对坐标得到现在的角点坐标,并移动
}

void ShapedClock::paintEvent(QPaintEvent *)
{
    /* 后面的就和昨天类似了*/

    static const QPoint hourHand[3] = {
        QPoint(5, 8),
        QPoint(-5, 8),
        QPoint(0, -40)
    };
    static const QPoint minuteHand[3] = {
        QPoint(5, 8),
        QPoint(-5, 8),
        QPoint(0, -70)
    };
    static const QPoint secondHand[4] = {
	QPoint(1, 8),
	QPoint(-1, 8),
	QPoint(-1, -90),
	QPoint(1,-90)
    };
    static const QPoint background[4] = {
	QPoint( -100, -100),
	QPoint( -100, 100),
	QPoint( 100, 100),
	QPoint( 100, -100),
    };
    //多了一个画背景

    QColor hourColor(255, 0, 255);
    QColor minuteColor(0, 255, 255, 191);
    QColor secondColor(255, 255, 0);
    QColor BGColor(255, 255, 255, 5);    //这是背景色

    int side = qMin(width(), height());
    QTime time = QTime::currentTime();

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width() / 2, height() / 2);
    painter.scale(side / 200.0, side / 200.0);

    painter.setPen(Qt::NoPen);
    painter.setBrush(BGColor);
    painter.save();
    painter.drawConvexPolygon(background,4);
    painter.restore();
    //画背景

    painter.setPen(Qt::NoPen);
    painter.setBrush(hourColor);

    painter.save();
    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
    painter.drawConvexPolygon(hourHand, 3);
    painter.restore();

    painter.setPen(hourColor);

    for (int i = 0; i < 12; ++i) {
        painter.drawLine(88, 0, 96, 0);
        painter.rotate(30.0);
    }

    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);

    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
    painter.drawConvexPolygon(minuteHand, 3);
    painter.restore();

    painter.setPen(minuteColor);

    for (int j = 0; j < 60; ++j) {
        if ((j % 5) != 0)
            painter.drawLine(92, 0, 96, 0);
        painter.rotate(6.0);
    }
    QPainter painter2(this);
    painter2.setRenderHint(QPainter::Antialiasing);
    painter2.translate(width() / 4, height() / 8 * 5);
    painter2.scale(side / 600.0, side / 600.0);
    painter2.setPen(Qt::NoPen);
    painter2.setBrush(secondColor);
    painter2.save();
    if(time.second()<30)
	painter2.rotate(6.0 * (time.second() + time.msec()/1000.0 ));
    else if(time.second()==30 && time.msec()<550)
	painter2.rotate(180 - 36.0 * time.msec()/100.0);

    painter2.drawConvexPolygon(secondHand,4);
    painter2.restore();

    painter2.setPen(secondColor);
    painter2.rotate(270);
    for (int j = 0; j < 30; ++j) {
	painter2.drawLine(92, 0, 96, 0);
        painter2.rotate(6.0);
    }

    QPainter painter3(this);
    painter3.setRenderHint(QPainter::Antialiasing);
    painter3.translate(width() / 4 * 3, height() / 8 * 3);
    painter3.scale(side / 600.0, side / 600.0);
    painter3.setPen(Qt::NoPen);
    painter3.setBrush(secondColor);
    painter3.save();
    if(time.second()>30)
	painter3.rotate(360 - (6.0 * (time.second()-30 + time.msec()/1000.0 )));
    else if (time.second()==0 && time.msec()<550)
	painter3.rotate(180 + 36.0 * time.msec()/100.0);
    painter3.drawConvexPolygon(secondHand,4);
    painter3.restore();
    painter3.setPen(secondColor);
    painter3.rotate(90);
    for (int j = 0; j < 30; ++j) {
	painter3.drawLine(92, 0, 96, 0);
        painter3.rotate(6.0);
    }
    //这些都和昨天一样了

}

void ShapedClock::resizeEvent(QResizeEvent * /* event */)
{
    int side = qMin(width(), height());
    QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side,
                         side, QRegion::Ellipse);
    setMask(maskedRegion);
    //将表盘以外的Mask
}

QSize ShapedClock::sizeHint() const
{
    return QSize(200, 200);
    //默认尺寸
}
main.cpp
#include <QApplication>

#include "shapedclock.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ShapedClock clock;
    clock.show();
    return app.exec();
}
效果图
shapedclock
可执行文件,说明,这次我没有编译静态库的Qt,所以这个只有装了Qt的机器才能用-_-b,静态库的估计要10几M大小吧。
就昨天写的十几行就有2个小BUG,哎-_-b

qt example – analogclock 注释

analogclock.h
#ifndef ANALOGCLOCK_H
#define ANALOGCLOCK_H

#include <QWidget>

//! [0]
class AnalogClock : public QWidget
{
    Q_OBJECT

    public:
	AnalogClock(QWidget *parent = 0);

    protected:
	void paintEvent(QPaintEvent *event);
};
//! [0]

#endif
没什么好注释的-_-b
analogclock.cpp
#include <QtGui>

#include "analogclock.h"

AnalogClock::AnalogClock(QWidget *parent)
: QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(update()));
    timer->start(1000);
    //Qt的计时器类,start设定触发间隔,1000毫秒即一秒timeout一次,将整个widget update一次,即重绘窗口

    setWindowTitle(tr("Analog Clock"));
    resize(200, 200);
    //设定标题及尺寸
}

void AnalogClock::paintEvent(QPaintEvent *)    //重绘的实现
{
    static const QPoint hourHand[3] = {
	QPoint(7, 8),
	QPoint(-7, 8),
	QPoint(0, -40)
    };//时针形状
    static const QPoint minuteHand[3] = {
	QPoint(7, 8),
	QPoint(-7, 8),
	QPoint(0, -70)
    };//分针形状

    QColor hourColor(127, 0, 127);
    QColor minuteColor(0, 127, 127, 191);
    //颜色
    int side = qMin(width(), height());
    QTime time = QTime::currentTime();
    //Qt的时间类,获得当时时间

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width() / 2, height() / 2);
    painter.scale(side / 200.0, side / 200.0);

    painter.setPen(Qt::NoPen);
    painter.setBrush(hourColor);

    painter.save();
    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));    //时针旋转的角度
    painter.drawConvexPolygon(hourHand, 3);    //填充颜色
    painter.restore();

    painter.setPen(hourColor);

    for (int i = 0; i < 12; ++i) {
	painter.drawLine(88, 0, 96, 0);
	painter.rotate(30.0);
    }
    //画表盘时针刻度
    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);    //颜色是在这设定的

    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));    //分针旋转的角度
    painter.drawConvexPolygon(minuteHand, 3);    //填充颜色,用当前的颜色
    painter.restore();

    painter.setPen(minuteColor);

    for (int j = 0; j < 60; ++j) {
	if ((j % 5) != 0)
	    painter.drawLine(92, 0, 96, 0);
	painter.rotate(6.0);
    }
    //画表盘的分针刻度
}
main.cpp
#include <QApplication>

#include "analogclock.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    AnalogClock clock;
    clock.show();
    return app.exec();
}

效果图

analogclock

然后是激动人心的乱改时间,首先添加一个秒针,仿照时针分针就行,不过秒针一般细长一些,再设定个颜色,就灰的吧

    static const QPoint secondHand[3] = {
	QPoint(3, 8),
	QPoint(-3, 8),
	QPoint(0, -90)
    };
    QColor secondColor(99, 99, 99);

再然后是要画出来,就加在最后吧

    painter.setBrush(secondColor);
    painter.save();
    painter.setPen(Qt::NoPen);
    painter.rotate(6.0 * time.second());
    painter.drawConvexPolygon(secondHand,3);
    painter.restore();
效果图
analogclock-11
再然后可以将秒针的移动模拟成机械表
首先将timer的触发间隔改为100
    timer->start(100);
然后把秒针重绘改成
    painter.rotate(6.0 * (time.second() + time.msec()/1000.0 ));
还可以改秒针形状
    static const QPoint secondHand[4] = {
	QPoint(1, 8),
	QPoint(-1, 8),
	QPoint(-1, -90),
	QPoint(1,-90)
    };
    painter.drawConvexPolygon(secondHand,4);
记得有人和我说过,软件这个东西太神奇了,无论什么东西都能模拟出来,我来模拟一下双表盘吧-_-b
首先新建一个painter2
    QPainter painter2(this);
    painter2.setRenderHint(QPainter::Antialiasing);
    painter2.translate(width() / 4, height() / 8 * 5);    //平移到左偏下
    painter2.scale(side / 600.0, side / 600.0);    //绽放比例是刚才的1/3
    painter2.setPen(Qt::NoPen);
    painter2.setBrush(secondColor);
    painter2.save();
    painter2.rotate(6.0 * (time.second() + time.msec()/1000.0 )); //这里都是一样的
    painter2.drawConvexPolygon(secondHand,4);
    painter2.restore();

    painter2.setPen(secondColor);
    for (int j = 0; j < 60; ++j) {
	painter2.drawLine(92, 0, 96, 0);
        painter2.rotate(6.0);
    }
    //画个小表盘

效果图

analogclock-2

实在很丑-_-b,凑乎看吧。

三表盘+逆跳

    QPainter painter2(this);
    painter2.setRenderHint(QPainter::Antialiasing);
    painter2.translate(width() / 4, height() / 8 * 5);
    painter2.scale(side / 600.0, side / 600.0);
    painter2.setPen(Qt::NoPen);
    painter2.setBrush(secondColor);
    painter2.save();
    if(time.second()<30)
	painter2.rotate(6.0 * (time.second() + time.msec()/1000.0 ));
    else if(time.second()==30 && time.msec()<550)
	painter2.rotate(180 - 36.0 * time.msec()/100.0);

    painter2.drawConvexPolygon(secondHand,4);
    painter2.restore();

    painter2.setPen(secondColor);
    painter2.rotate(270);
    for (int j = 0; j < 30; ++j) {
	painter2.drawLine(92, 0, 96, 0);
        painter2.rotate(6.0);
    }

    QPainter painter3(this);
    painter3.setRenderHint(QPainter::Antialiasing);
    painter3.translate(width() / 4 * 3, height() / 8 * 3);
    painter3.scale(side / 600.0, side / 600.0);
    painter3.setPen(Qt::NoPen);
    painter3.setBrush(secondColor);
    painter3.save();
    if(time.second()>30)
	painter3.rotate(360 - (6.0 * (time.second()-30 + time.msec()/1000.0 )));
    else if (time.second()==0 && time.msec()<550)
	painter3.rotate(180 + 36.0 * time.msec()/100.0);
    painter3.drawConvexPolygon(secondHand,4);
    painter3.restore();
    painter3.setPen(secondColor);
    painter3.rotate(90);
    for (int j = 0; j < 30; ++j) {
	painter3.drawLine(92, 0, 96, 0);
        painter3.rotate(6.0);
    }

效果图

analogclock-3

我实在有够无聊的-_-b,做这么个难看的东西出来-_-b

三坐标技术贴系列五——Gear软件简介

写在前面的声明
觉得写得差,没用,随便喷,但是如果转载,请一定保证正文的完整,出处作者随便你提不提。
本人蔡司员工,所有文章内的观点仅代表个人观点,如有观点上的偏颇,请参照本人身份。
文章内如带有广告性质,或部分内容涉及过浅,请见谅,恕本人限于某些原因不接受各种提问。

——————————我是华丽的分隔符——————————

Gear是专门用来测量齿轮的软件,同样,这是Zeiss专用,他无法直接与CMM通讯,必须通过Calypso来控制CMM,而Gear实际起的作用是生成齿轮形状与测量方法,并获得测量数据并处理,其他所有工作都是由Calypso完成。

插一段题外话,实际上很多地方不用三坐标来测量齿轮,由于齿轮自身的特点,用标准配置的三坐标测量齿轮有一些困难。齿轮参数复杂,但是极有规律,回转体但又有升程。所以专门的齿轮测量机都是由转台和一根水平方向的测针来组成。三坐标与之相比,在没有转台的情况下需要用旋转探头或者多角度的探针来完成测量。在有转台的情况下,三坐标在原理上可以等同齿轮测量机,但是转台轴由于是后校准(无论是固定转台或者移动式转台)并且在机械结构上可能并不与CMM的Z轴平行,要通过数学找正来补偿。

回到软件本身,齿轮由于历史悠久,所有的参数都得到了标准化,甚至包括测量报告的格式,对于软件这是件好事情,有标准照着做既方便又快捷,也方便使用人员学习。Gear软件有3个选项,分别是直齿、斜齿和伞齿,大同小民,各分成几个模块或者说是步骤。

一、生成齿轮,通过输入模数,分度圆直径,齿数等参数生成齿轮,同时在CAD窗口中会出现齿轮的图形,可以参照实物对比。但是Gear软件没有生成坐标系的功能,所以要在Calypso中将坐标系建到齿轮回转中心。

二、设定参数,包括使用的针号,需要测量的齿数,周向还是径向测量等,如果有转台,还要在里面设定转台旋转的情况。

三、评定,选择报告中需要显示的内容,数字结果,图形,是否显示累积误差一类的。

实在没办法介绍的更详细,齿轮太标准化了,和齿轮打交道多的人估计一看就会用了,估计各家的齿轮软件都不会有什么太特别的地方吧。

——————————我是华丽的分隔符——————————

前些天看期刊杂志,文章都太水了,考虑要不要编点文章贴点公式投投稿-_-b

三坐标技术贴系列四——Umess软件简介

写在前面的声明
觉得写得差,没用,随便喷,但是如果转载,请一定保证正文的完整,出处作者随便你提不提。
本人蔡司员工,所有文章内的观点仅代表个人观点,如有观点上的偏颇,请参照本人身份。
文章内如带有广告性质,或部分内容涉及过浅,请见谅,恕本人限于某些原因不接受各种提问。

——————————我是华丽的分隔符——————————

首先,时光倒流15年。

这是1994年,Win32 Chicago只是一个新玩具,个人PC机上也许有人像现在一样追新,但是绝对没有企业着急在一款新面世的操作软件上开发自己的软件,何况,三坐标在当时已经有十几年的工业应用史了,在当时已经是一种很成熟的工业产品了,当时的操作软件都是在Unix上使用的,或者是专用操作系统,通常这些也是*nix裁剪的,这在现在有个时髦的称呼——嵌入式。

写这么多废话,只是做一个铺垫,这是一款有十年以上历史的老软件,无论用现在的眼光看他是多么的落后,他都是一款曾经极其优秀的软件。

Umess正式名称叫Solution,这是个很大气的名字,我给他一个翻译叫“搞定”,而Umess则是一个缩写,什么什么测量系统什么什么的英文首字母,实在记不住了。

Umess的运行环境为HP出口的Unix——HP UX,熟悉Unix系统的应该知道这是仅存的几个Unix发行版了,由于Umess已停止开发,所以只支持UX11.0及以前的版本(与Umess各版本相对应)。由于Umess只能装在HP UX上,而HP UX又只能装在HP的工作站上,而且不同版本的HP UX也只能装特定型号的工作站上,使得Umess几乎没有办法盗版……成本实在太高。

不知道动机,Umess曾经移植到linux上,你可以在rh6.x到8.x上安装Umess的Linux移植版,但是只有很少几个比较老的版本,我曾经想在新的发行版——例如ubuntu和debian上装,可惜没有成功,linux下的库版本与依赖实在太恶心了,还要改安装脚本。

下面正式介绍Umess。

Umess是一款功能极强极全面的测量软件,Umess在停止开发前与任何当时的测量软件相比都绝不逊色,是名副其实的万能测量软件,同时包含各个选项针对各种特定测量。虽然花哨的东西不多,但是绝对可以满足三坐标测量的要求。

Umess有很多优点,到今天看也是,例如可以做到完全脱离计算机的操作,这和现在的软件完全不同,现在的软件则是可以做到完全脱离机器的操作,这和设计理念,软件技术有关系,随着计算机辅助设计功能的发展,无纸化流程已经开始成为主流,所以现在的测量软件也顺应了这一潮流,而当时的软件则完全是从测量使用者考虑的,完全使用控制面板操作可以提高效率,减少在电脑与机器之间来回浪费的时间。

最大的缺点就是,他要被淘汰了,随着停止开发,HP对老式作站和老系统的不支持,Umess注定要脱离大众的视线了,没有厂家会买没有服务的软件的,所以像其他小缺点都无所谓了,Umess的程序不容易维护,学习周期稍长,操作系统难于掌握,这是几个比较明显的缺点吧。

——————————我是华丽的分隔符——————————

这篇其实几周前就写完了,结果电脑死机,WP的自动保存内码又不对-_-b,一下子影响了心情,重新写完,下周继续更新。

线膨胀系数阿尔法

今天绘SFK做机器验收,环规无论如何调整测量的细节都很稳定的比名义值大2微米+,最终很无奈。

可以确定的影响有,环规500mm尺寸上有单方向0.2摄氏度的温度梯度,会带来0.5至1微米的影响,但是就算用最高温度补偿,也还是大2微米,于是只能猜测是环规的线膨胀系数不呈线性。

现场温度25.8将近26摄氏度,钢的线膨胀系数11.5,于是实测值要减去34微米才得出结果,我感性上宁愿相信影响结果最大的因素是线膨胀系数,只要这个环规的线膨胀系数与理论上不一致,6摄氏度的温差可以很轻松的带来1.5微米以上的影响,

可是我为什么无奈呢,因为我其实知道怎么解决,但是我办不到,解决方法就是找个地方搞出这个环规材料的阿尔法值,就像阿尔法量块似的——阿尔法量块是指将各温度下的线膨胀系数分别测得的量块——算了,明天闪了,这个尾巴就烂在这吧,反正2微米也达到机器标称精度了,客户再不满意就让老外自己来折腾吧。

songs

Leona Lewis – I Will Be

leona lewis是英国新近女歌手的代表人物,出名过程也很有代表性,是选秀节目成就的最成功歌手之一,也许她多次参加选秀节目的经历可以给屡败屡战的小盆友们以信心吧。

这首歌充满了技巧,却表现的极其自然,并没有掩盖感情的表达,当然,淡淡的绝望感也许只是我心镜的一种体现而已。

Natasha Bedingfield – Unwritten

叫Natasha的歌手不计其数,好像我听过的都是只凭一两首歌让人有个印象而已,这个也不例外,Unwritten是首好歌,无论是节选出广告歌的张力十足,还是整首听起来的层次分明感,这都是完美的编曲,可惜歌手并没有超人的实力和运气。

Oasis – The Turning

Oasis是我最喜欢的乐队,也许是之一,我在他们所有专辑里选了十几首放到了手机里当铃声闹钟,并没有这首,而且我发现早期的占了绝大多数,这首歌配器是近期的风格,词曲则有一些早期的感觉,真怀念第一次看Oasis的Unplugged的Don’t look back in anger那种惊艳感。

Ozzy Osbourne - Sympathy For The Devil

虽然Ozzy和猫王在米国其名,但是之前我并不知道,Ozzy这个名字让我想起了huge long hair monster,是不是huge不知道,的确是个long hair monster,歌和人一样怪,也许很多人觉得唱得很烂,但是Ozzy的水平就像太阳一样,那种距离只是看起来比较近一些。

Leona  Lewis – A moment like this

又随机到了她的歌,foobar的随机功能不怎么样啊,这么快就重歌手了,成名曲,其实不太喜欢。

Prince - Little Red Corvette

不知道能不能把Prince归到迷幻音乐的类型中,不过这位多才多艺的歌手真的是很厉害,只可惜80年代的美国乐坛竞争太激烈了,滚石杂志评选100首最伟大英文歌曲排名第50位。

Lene Marlin – How Would It Be

Lene Marlin是我喜欢的女歌手风格,慢慢悠悠的节奏加上天赐的声音,这首歌是其中比较欢快的吧,说起欢快我忽然发现我的收藏里少了点东西,家里那硬盘本来有The Corrs的专辑的,找个地方下载下来。

Turbo – tonight

好吧,这是首韩国歌,以前我本来只是听英文歌曲的,看综艺节目,然后收集了一些金钟国的歌,很man的男人加上这种嗓音……真是无话可说了,岁数并不是太大的金钟国辈份却极高,因为出道早,这首是很久前他还在组合时的歌,虽然不想夸棒子,不过国内那时候的制作水平真是没这么高。

发现随机的歌我都不是太喜欢,随机完挑同歌手喜欢的歌写吧。

莫文蔚 – 突然之间

我高中的同学对我说,莫文蔚那个不叫唱歌,那叫寂寞,好吧。。我串词了,莫文蔚的声音和发声都太特别了,她就是把歌词念一遍都比我唱的好听。

Feist - 1 2 3 4

这首是ipod的广告歌,相信ipod挑歌的实力吧,这是首好歌。

Handel: The Arrival of the Queen of Sheba

听交响乐有益身心健康,真的,极大的舒缓了我不愉快的心情。

AC/DC  - You Shook Me All Night Long

我没听说过这歌手,歌相当震撼,而且肯定很老,我看歌手名字第一反应是直流交流电,歌也很有电。

Tchaikovsky: Piano Concerto No.1 in B flat minor, Op.23 – 1st movement (excerpt)

柴科夫斯基第一钢琴协奏曲,我发誓我喜欢上这首曲子时狼狼还没有出名,我只是单纯的被音乐吸引而已,虽然我最喜欢的交响乐不是这首。

最后友情推荐 – 思念是一种病

所有听过这首歌的人都会认为原唱是张震岳,演绎的十分自然完美,其实这歌是齐秦写的,我第一次听齐秦版笑了出来,因为张震岳版先入为主的概念,听齐秦唱实在太怪了,听几次感觉齐秦大哥也挺可怜的,这词写的。。。绝对是亲身体会啊。

几个小片段

看过的小说也不算少,其实每个小说出彩的地方也不算多,回忆起以前的小说,往往又是那几个情节。

最近一次看的是《紫川》,其实我很不喜欢这个,但是有两个情节每看一次都会起反应,一是紫川秀潜伏过去刺杀叛徒,一边砍,一边喊,紫川家诛杀叛徒无论天涯海角。这让我想起汉朝那位陈汤。还有一段,是紫川秀被女人甩了的时候,帝林劝他:“阿秀,记住,男子汉要坚强,要有尊严,我们生来就是忍受痛苦的。时间会冲淡一切,包括那些刻骨铭心的感情和回忆,只要挺住了,一切都会过去的!”

CCAV6正在放肖申克,这个电影看了很多遍了,记忆深刻的地方也有2个,一是杜弗伦在监狱长的房间放歌剧,二是Red获得假释那一次和假释官说的话,人生就是不断的累积吧。