コード例 #1
0
ファイル: frmRasterLoad.cs プロジェクト: secondii/Yutai
 private void btnOK_Click(object sender, EventArgs e)
 {
     try
     {
         if (this.CanDo())
         {
             RasterUtil rasterUtil = new RasterUtil();
             if (!(this.m_pOutName is IRasterCatalogName))
             {
                 IRasterWorkspaceEx rasterWorkspaceEx = this.m_pOutName.Open() as IRasterWorkspaceEx;
                 for (int i = 0; i < this.m_pInNames.Count; i++)
                 {
                     IRasterDataset2 rasterDataset2           = (this.m_pInNames[i] as IName).Open() as IRasterDataset2;
                     string          fileNameWithoutExtension =
                         Path.GetFileNameWithoutExtension((rasterDataset2 as IDataset).Name);
                     if ((fileNameWithoutExtension[0] < '0' ? false : fileNameWithoutExtension[0] <= '9'))
                     {
                         fileNameWithoutExtension = string.Concat("A", fileNameWithoutExtension);
                     }
                     if (rasterWorkspaceEx is IWorkspace2)
                     {
                         int    num = 1;
                         string str = fileNameWithoutExtension;
                         try
                         {
                             while (
                                 (rasterWorkspaceEx as IWorkspace2).NameExists[
                                     esriDatasetType.esriDTFeatureClass, str])
                             {
                                 str = string.Concat(fileNameWithoutExtension, "_", num.ToString());
                                 num++;
                             }
                         }
                         catch
                         {
                         }
                         fileNameWithoutExtension = str;
                     }
                     ((IGeometryDefEdit)(new GeometryDef())).SpatialReference_2 =
                         (rasterDataset2 as IGeoDataset).SpatialReference;
                     rasterWorkspaceEx.SaveAsRasterDataset(fileNameWithoutExtension,
                                                           rasterDataset2.CreateFullRaster(), null, "", null, null);
                 }
             }
             else
             {
                 IFeatureClass featureClass = this.m_pOutName.Open() as IFeatureClass;
                 rasterUtil.ToRasterCatalog(this.m_pInNames, featureClass);
             }
         }
     }
     catch (Exception exception1)
     {
         Exception exception = exception1;
         CErrorLog.writeErrorLog(this, exception, "");
         MessageBox.Show(exception.Message);
     }
     this.progressBar1.Visible = false;
 }
コード例 #2
0
    /// <summary>
    ///     Apply the damage to all tilemaps in range. Will penetrate multiple tiles if damage is high enough
    /// </summary>
    public (Vector3 hitPos, Vector3 endHitPos) ApplyDamage(TileManager[] exclude)
    {
        var hits = Physics2D.LinecastAll(StartPos, EndPos);

        Array.Sort(hits, (h1, h2) => h1.distance.CompareTo(h2.distance));
        Debug.DrawLine(StartPos, EndPos, Color.green, 5f);
        var     done      = false;
        Vector2 hitPos    = EndPos;
        Vector2 endHitPos = EndPos;
        Vector2 direction = EndPos - StartPos;

        foreach (RaycastHit2D hit in hits)
        {
            var tileManager = hit.transform.GetComponent <TileManager>();
            if (tileManager is null)
            {
                continue;
            }
            if (exclude.Contains(tileManager))
            {
                continue;
            }
            Vector2 lineStart = hit.point - 0.5f * Direction;
            if (hitPos == EndPos)
            {
                hitPos = lineStart;
            }
            Vector2 lineEnd = EndPos;
            Debug.DrawLine(lineStart, lineEnd, Color.red, 5f);
            var dmgToObject = 0f;
            var line        = RasterUtil.Line(tileManager.PositionToCords(lineStart), tileManager.PositionToCords(lineEnd));
            foreach (Vector3Int cord in line)
            {
                tileManager.DamageTile(cord, BaseDamage, out float damageUsed);
                if (Math.Abs(damageUsed - BaseDamage) < float.Epsilon)
                {
                    done = true;
                    Vector2 localEndPos = tileManager.CordsToPosition(cord);
                    endHitPos = RasterUtil.FindNearestPointOnLine(hitPos, direction,
                                                                  tileManager.transform.TransformPoint(localEndPos));
                    break;
                }

                BaseDamage  -= damageUsed;
                dmgToObject += damageUsed;
            }

            tileManager.Rigidbody2D.AddForceAtPosition(Direction * dmgToObject * 1e-3f, lineStart);

            if (done)
            {
                break;
            }
        }

        return(hitPos, endHitPos);
    }