//---------------------------------------------------------
bool CSG_PointCloud::Assign(CSG_Data_Object *pObject)
{
    if( pObject && pObject->is_Valid() && pObject->Get_ObjectType() == Get_ObjectType() )
    {
        Destroy();

        CSG_PointCloud	*pPointCloud	= (CSG_PointCloud *)pObject;

        Get_History()	= pPointCloud->Get_History();

        for(int iField=0; iField<pPointCloud->m_nFields; iField++)
        {
            _Add_Field(pPointCloud->m_Field_Name[iField]->c_str(), pPointCloud->m_Field_Type[iField]);
        }

        for(int iPoint=0; iPoint<pPointCloud->Get_Count(); iPoint++)
        {
            if( _Inc_Array() )
            {
                memcpy(m_Points[iPoint] + 1, pPointCloud->m_Points[iPoint] + 1, m_nPointBytes - 1);
            }
        }

        return( true );
    }

    return( false );
}
//---------------------------------------------------------
bool CPC_Drop_Attribute::On_Execute(void)
{
	//-------------------------------------------------
	int	*Features	= (int *)Parameters("FIELDS")->asPointer();
	int	nFeatures	=        Parameters("FIELDS")->asInt    ();

	if( !Features || nFeatures <= 0 )
	{
		Error_Set(_TL("You must specify at least one attribute to drop!"));

		return( false );
	}

	//-----------------------------------------------------
	CSG_PointCloud	*pInput		= Parameters("INPUT" )->asPointCloud();
	CSG_PointCloud	*pOutput	= Parameters("OUTPUT")->asPointCloud(), Output;

	if( !pOutput || pOutput == pInput )
	{
		pOutput	= &Output;
	}

	pOutput->Create(pInput);

	//-----------------------------------------------------
	int	i;

	std::set<int>			setCols;
	std::set<int>::iterator it;

	setCols.clear();

	for(i=0; i<nFeatures; i++)
	{
		setCols.insert(Features[i]);
	}

	for(i=0, it=setCols.begin(); it!=setCols.end(); i++, it++)
	{
		pOutput->Del_Field(*it - i);
	}

	//-----------------------------------------------------
	for(i=0; i<pInput->Get_Point_Count() && SG_UI_Process_Set_Progress(i, pInput->Get_Count()); i++)
	{
		pOutput->Add_Point(pInput->Get_X(i), pInput->Get_Y(i), pInput->Get_Z(i));

		for(int j=0, k=0; j<pInput->Get_Attribute_Count(); j++, k++)
		{
			it	= setCols.find(j + 3);

			if( it != setCols.end() )
			{
				k--;
				continue;
			}

			switch (pInput->Get_Attribute_Type(j))
			{
			default:					pOutput->Set_Attribute(k, pInput->Get_Attribute(i, j));		break;
			case SG_DATATYPE_Date:
			case SG_DATATYPE_String:	CSG_String sAttr; pInput->Get_Attribute(i, j, sAttr); pOutput->Set_Attribute(k, sAttr);		break;
			}
		}
	}

	//-----------------------------------------------------
	if( pOutput == &Output )
	{
		CSG_MetaData	History	= pInput->Get_History();
		CSG_String		Name	= pInput->Get_Name   ();

		pInput->Assign(pOutput);

		pInput->Get_History() = History;
		pInput->Set_Name(Name);

		Parameters("OUTPUT")->Set_Value(pInput);
	}
	else
	{
		pOutput->Fmt_Name("%s [%s]", pInput->Get_Name(), _TL("Dropped Attributes"));
	}

	//-----------------------------------------------------
	return( true );
}