image thumbnail
from IGES Toolbox by Per Bergström
Extracts the parameter data in an IGES file to Matlab.

transformIGES.m
function ParameterData=transformIGES(ParameterData,R,T)
% TRANSFORMIGES transform the entities from an IGES file in
% ParameterData with a rotation or a reflection and a translation. 
%
% Usage:
%
% ParameterData=transformIGES(ParameterData,R,T)
%
% Input:
%
% ParameterData - Parameter data from IGES file. ParameterData
%                 is the output from IGES2MATLAB.
% R - Rotation matrix or reflection matrix. eye(3) default.
% T - Translation vector. zeros(3,1) default.
%
% Output:
%
% ParameterData - Transformed input parameter data.
%
% ENTITY=R*ENTITY+T
%
% m-file can be downloaded at
% http://www.mathworks.com/matlabcentral/fileexchange/13253-iges-toolbox
%
% written by Per Bergstrm 2009-12-04
%

if nargin<3
    T=zeros(3,1);
    if nargin<2
        R=eye(3);
        if nargin <1
            error('transformIGES must have inputs!');
        end
    end
end

if not(iscell(ParameterData))
    error('ParameterData must be a cell array!');
end

[mR,nR]=size(R);

if or(mR~=nR,mR~=3)
    mR=3;
    nR=3;
    R=eye(3);
elseif or(norm(R'*R-eye(3),'fro')>1e-12,not(or(abs(det(R)-1)<1e-12,abs(det(R)+1)<1e-12)))
    error('R must be a rotation matrix or a reflection matrix');
end

[mT,nT]=size(T);

if or(mT==0,nT==0)
    T=zeros(3,1);
elseif mT<nT
    T=T';
    [mT,nT]=size(T);
end

if or(mT~=3,nT~=1)
    T=zeros(3,1);
end

siz=length(ParameterData);

for i=1:siz
    
    % SURFACES
    
    if ParameterData{i}.type==128
        
        for j=1:(ParameterData{i}.k1+1)
            for k=1:(ParameterData{i}.k2+1)
                ParameterData{i}.p(:,j,k)=R*ParameterData{i}.p(:,j,k)+T;
            end
        end
        
        ParameterData{i}.nurbs.coefs(1:3,:,:)=repmat(ParameterData{i}.nurbs.coefs(4,:,:),3,1).*ParameterData{i}.p;
        [ParameterData{i}.dnurbs,ParameterData{i}.d2nurbs]=nrbDerivativesIGES(ParameterData{i}.nurbs);
        
    elseif ParameterData{i}.type==108
        
        ParameterData{i}.d=ParameterData{i}.d+dot(ParameterData{i}.normal,R'*T);
        
        ParameterData{i}.normal=R*ParameterData{i}.normal;
        
        ParameterData{i}.a=ParameterData{i}.normal(1);
        ParameterData{i}.b=ParameterData{i}.normal(2);
        ParameterData{i}.c=ParameterData{i}.normal(3);
        
        X=R*[ParameterData{i}.x;ParameterData{i}.y;ParameterData{i}.z]+T;
        
        ParameterData{i}.x=X(1);
        ParameterData{i}.y=X(2);
        ParameterData{i}.z=X(3);
        
    elseif ParameterData{i}.type==144
        
        entiall=ParameterData{i}.pts;
        
        if not(ParameterData{entiall}.original)
            if and(ParameterData{entiall}.previous_type==120,ParameterData{entiall}.well)
                
                cp=zeros(3,ParameterData{i}.nurbs.number(1),ParameterData{i}.nurbs.number(2));
                
                for j=1:ParameterData{i}.nurbs.number(2)
                    cp(:,:,j)=R*(ParameterData{i}.nurbs.coefs(1:3,:,j)./repmat(ParameterData{i}.nurbs.coefs(4,:,j),3,1))+repmat(T,1,ParameterData{i}.nurbs.number(1));
                end
                
                ParameterData{i}.nurbs.coefs(1:3,:,:)=repmat(ParameterData{i}.nurbs.coefs(4,:,:),3,1).*cp;
                [ParameterData{i}.dnurbs,ParameterData{i}.d2nurbs]=nrbDerivativesIGES(ParameterData{i}.nurbs);
                
            end
        end
        
        % CURVES
        
    elseif ParameterData{i}.type==126
        
        if not(ParameterData{i}.superior)
            
            for j=1:(ParameterData{i}.k+1)
                ParameterData{i}.p(:,j)=R*(ParameterData{i}.p(:,j))+T;
            end
            
            ParameterData{i}.nurbs.coefs(1:3,:)=repmat(ParameterData{i}.nurbs.coefs(4,:),3,1).*ParameterData{i}.p;
            [ParameterData{i}.dnurbs,ParameterData{i}.d2nurbs]=nrbDerivativesIGES(ParameterData{i}.nurbs);
            
        end
        
    elseif ParameterData{i}.type==110
        
        if not(ParameterData{i}.superior)
            
            ParameterData{i}.p1=R*ParameterData{i}.p1+T;
            ParameterData{i}.x1=ParameterData{i}.p1(1);
            ParameterData{i}.y1=ParameterData{i}.p1(2);
            ParameterData{i}.z1=ParameterData{i}.p1(3);
            
            ParameterData{i}.p2=R*ParameterData{i}.p2+T;
            ParameterData{i}.x2=ParameterData{i}.p2(1);
            ParameterData{i}.y2=ParameterData{i}.p2(2);
            ParameterData{i}.z2=ParameterData{i}.p2(3);
            
        end
        
        % POINTS
        
    elseif ParameterData{i}.type==116
        
        ParameterData{i}.p=R*ParameterData{i}.p+T;
        ParameterData{i}.x=ParameterData{i}.p(1);
        ParameterData{i}.y=ParameterData{i}.p(2);
        ParameterData{i}.z=ParameterData{i}.p(3);
        
    end
end

Contact us at files@mathworks.com