このページについて
 
このページは、mura's homeAutoCAD掲示板 で、当方の発言(書込み)がある以下の掲示板の内容です。
http://www.mura.sh/bbs/wwwbbs.cgi?print+200712/07120085.txt
 
タイトルおよび質問内容は上記より引用しています。
 
引用した質問内容は、バックカラーが

   

となっています。
 
当方の発言は、バックカラーが

   

となっています。
 
その他の著作権者の掲載許可を得ていない発言内容は削除(リンクを除く)しています
 
また、当方では、削除部分の正当な著作権保持者を判断出来ませんので、
ご連絡を頂いても、復活させることは出来ません。ご了承下さい。
 
 
掲示板の著作権について
 
掲示板への匿名の書き込みであっても、著作権(著作権法)で保護されています。
また、判例(確定した判決)もあります。
 
裁判所 判例検索システム

ホテルジャンキーズ事件

知的財産裁判例
知的財産裁判例
平成13(ワ)22066  著作権 民事訴訟
平成14年04月15日 東京地方裁判所
全文 控訴
付帯控訴
知的財産裁判例
知的財産裁判例
平成14(ネ)2887  著作権 民事訴訟
平成14年10月29日 東京高等裁判所
全文 確定

ただし、あらかじめ取り決めがある場合は、その取り決めが優先します
 ※たとえば、OKWave の掲示板 (利用規約/第10条(投稿内容の利用権))

 
 
 

ポリラインの方向

ゆきち 2007/12/14(金) 15:45:28

断面図を編集しているのですが、ポリラインの方向が左から右へという作りじゃないとだめだといわれました。
他社からの引継ぎで、最初から作業しているものでないので、ポリラインが右向きだったり左向きだったりしているのです。
指定のレイヤーに入っているポリラインを左から右へ一括で変更することはできるのでしょうか?
アドバイスよろしくお願いします。

ゆり [HOMEPAGE] 2007/12/14(金) 15:59:48

著作権者の許可を得ていないため削除
 
 
 
 
 
 
 
 
 
 

ゆきち 2007/12/14(金) 19:47:18

著作権者の許可を得ていないため削除
 
 
 
 
 
http://www.mura.sh/bbs/wwwbbs.cgi?print+200703/07030027.txt
 

Jo [HOMEPAGE] 2007/12/15(土) 00:30:24

著作権者の許可を得ていないため削除
 

kamegai [HOMEPAGE] 2007/12/15(土) 22:38:44

では、私はVBAで・・・
ライトウェイトポリラインの始終点反転の関数とサンプルプログラムです。

http://www.mura.sh/bbs/wwwbbs.cgi?print+200705/07050072.txt
のBreak4LWPlineで使用していた同様関数のバージョンアップ版です。
特徴・・・ハンドルは保持した状態で変更

>LISP・VBAは初めてなので・・・
とのことなので追加の説明をします。

ライトウェイトポリライン専用、一括で変更ではなくて、
個別に逐一選択確認バージョンです。
反転可能なプロパティは、座標順と各セグメントのふくらみ値と線幅。

プログラムを使用する手順。
1.[ツール]-[マクロ]-[VBA管理]で新規作成。
2.[ツール]-[マクロ]-[Visual Basic エディタ]で統合開発環境(IDE)へ
3.新規作成されたプロジェクトを選択して[挿入]-[標準モジュール]
4.追加された標準モジュール"Module1"をクリックしして開き、
 下記プログラムを貼付
5.AutoCADに戻り[ツール]-[マクロ]-[VBA管理]で”名前を付けて保存”
 次回起動時はこのファイルを[ツール]-[マクロ]-[プロジェクトロード]で読み込みます
6.[ツール]-[マクロ]-[マクロ]でExample_InversLWPolylineを選択して実行します

頻繁に使用するならメニューボタンに
^C^C-vbarun;Example_InversLWPolyline^M
と登録してください。
●注意事項
点スタイルを一時的に変更、正常終了時に元に戻していますので、
異常終了時には手動で戻してください

不具合あれば書き込んでください。長文失礼。
Option Explicit
'
'ライトウェイトポリラインの始終点反転
'  反転可能プロパティ:座標順・各セグメントのふくらみ値と線幅
Public Function InversLWPolyline(LWPolylineObj As AcadLWPolyline) As Boolean
' 引数 ライトウェイトポリライン
'  戻値 正常終了 True
'     エラー  False (コマンドラインにエラーNo)
Dim I           As Long
Dim N           As Long
Dim X           As Long     'X配列番号
Dim Y           As Long     'Y配列番号
Dim CCount      As Long     '頂点の2D座標リスト添字の最大値
Dim Vertices    As Long     '頂点数
Dim Bulge()     As Double   'ふくらみ値リスト  (0 To Vertices - 1)
Dim SWidth()    As Double   'StartWidthリスト (0 To Vertices - 1)
Dim EWidth()    As Double   'EndWidthリスト   (0 To Vertices - 1)
Dim CoordinateX As Double   '仮格納 X座標値
Dim CoordinateY As Double   '仮格納 Y座標値
Dim Coordinates As Variant  '各頂点の2D座標リスト (0 To CCount)
    On Error GoTo ERR:
    InversLWPolyline = False
    Coordinates = LWPolylineObj.Coordinates
    CCount = UBound(Coordinates)
    Vertices = (CCount + 1) / 2   '[1〜
    ReDim Bulge(0 To Vertices - 1)
    ReDim SWidth(0 To Vertices - 1)
    ReDim EWidth(0 To Vertices - 1)
    N = Int(Vertices / 2) - 1
    '2D座標反転リスト作成
    For I = 0 To N
        X = I * 2 + 0
        Y = I * 2 + 1
        CoordinateX = Coordinates(X)
        CoordinateY = Coordinates(Y)
        Coordinates(X) = Coordinates(CCount - (X + 1))
        Coordinates(Y) = Coordinates(CCount - (Y - 1))
        Coordinates(CCount - (X + 1)) = CoordinateX
        Coordinates(CCount - (Y - 1)) = CoordinateY
    Next I
    '各セグメントのふくらみ値と線幅の反転リスト作成
    N = Vertices - 1
    '(1)始点〜終点
    For I = 0 To N - 1
        Bulge(N - 1 - I) = -1 * LWPolylineObj.GetBulge(I)
        LWPolylineObj.GetWidth I, EWidth(N - 1 - I), SWidth(N - 1 - I)
    Next I
    '(2)最後(=閉じている区間)は常にリストの最後
    Bulge(N) = -1 * LWPolylineObj.GetBulge(N)
    LWPolylineObj.GetWidth N, EWidth(N), SWidth(N)
    '各プロパティ変更(反転リストの適用)
    LWPolylineObj.Coordinates = Coordinates
    For I = 0 To Vertices - 1
        LWPolylineObj.SetBulge I, Bulge(I)
        LWPolylineObj.SetWidth I, SWidth(I), EWidth(I)
    Next I
    '終了処理
    LWPolylineObj.Update      '更新
    InversLWPolyline = True   '戻値セット
Exit Function
ERR:
    On Error Resume Next
    'コマンドラインにエラーNo
    ActiveDocument.Utility.Prompt "*エラー(" & ERR.Number & ")* "
    Exit Function
End Function
'ライトウェイト ポリラインの始終点を反転するサンプルプログラム
Public Sub Example_InversLWPolyline()
Dim returnObj     As AcadObject
Dim pointObj      As AcadPoint
Dim Str           As String
Dim Title         As String
Dim Style         As Integer
Dim CurrentPDMODE As Integer
Dim Response      As Long
Dim Point(0 To 2) As Double
Dim basePnt       As Variant
Dim Coordinates   As Variant
    On Error GoTo ERR:
    '点スタイルを記憶
    CurrentPDMODE = ThisDrawing.GetVariable("PDMODE")
    '点スタイルをXにする
    ThisDrawing.SetVariable "PDMODE", 3
SELECTERR:
    Title = "ライトウェイトポリラインを反転"
    Str = "ライトウェイトポリラインを選択してください  " & vbCrLf
    Style = vbOKCancel + vbInformation
    Response = MsgBox(Str, Style, Title)
    If Response = vbOK Then
NEXTSELECT:
        On Error Resume Next
        ActiveDocument.Utility.GetEntity returnObj, basePnt, vbCr & "ライトウェイトポリラインを選択してください: "
        If ERR Then
            On Error GoTo ERR:
            GoTo SELECTERR:
        Else
            On Error GoTo ERR:
            If TypeName(returnObj) = "IAcadLWPolyline" Then
                If Not ActiveDocument.Layers(returnObj.Layer).Lock Then
RETRAY:
                    '始点に点を作成(処理を確認できます)
                    Coordinates = returnObj.Coordinates
                    Point(0) = CDbl(Coordinates(0))
                    Point(1) = CDbl(Coordinates(1))
                    Point(2) = returnObj.Elevation
                    Set pointObj = ThisDrawing.ModelSpace.AddPoint(Point)
                    pointObj.Color = acRed
                    pointObj.Update
                    Str = "" & vbCrLf
                    Str = Str & "反転しますか? (赤点が始点位置です) " & vbCrLf & vbCrLf
                    Str = Str & "" & vbCrLf
                    Str = Str & "はい:反転 / いいえ:終了 / キャンセル:次を選択  " & vbCrLf & vbCrLf
                    Style = vbYesNoCancel + vbInformation
                    Response = MsgBox(Str, Style, Title)
                    If Response = vbYes Then
                        If InversLWPolyline(returnObj) Then
                            '点を移動
                            Erase Coordinates
                            Coordinates = returnObj.Coordinates
                            Point(0) = CDbl(Coordinates(0))
                            Point(1) = CDbl(Coordinates(1))
                            Point(2) = returnObj.Elevation
                            pointObj.Coordinates = Point
                            pointObj.Update
                            Str = "ライトウェイトポリラインの始終点を反転しました。 " & vbCrLf & vbCrLf
                            Str = Str & "次のライトウェイトポリラインを選択しますか? " & vbCrLf & vbCrLf
                            Style = vbYesNo + vbInformation
                        Else
                            Str = "ライトウェイトポリライン反転に失敗しました。 " & vbCrLf & vbCrLf
                            Str = Str & "次のライトウェイトポリラインを選択しますか? " & vbCrLf & vbCrLf
                            Str = Str & "(無視で次のライトウェイトポリラインを選択) " & vbCrLf & vbCrLf
                            Style = vbAbortRetryIgnore + vbQuestion
                        End If
                        Response = MsgBox(Str, Style, Title)
                        If Response = vbYes Then          'はい
                            pointObj.Delete
                            GoTo NEXTSELECT:
                        ElseIf Response = vbNo Then       'いいえ
                        ElseIf Response = vbAbort Then    '中止
                        ElseIf Response = vbIgnore Then   '無視
                            pointObj.Delete
                            GoTo NEXTSELECT:
                        ElseIf Response = vbRetry Then    '再試行
                            pointObj.Delete
                            GoTo RETRAY:
                        End If
                    ElseIf Response = vbCancel Then
                        pointObj.Delete
                        GoTo NEXTSELECT:
                    End If
                    pointObj.Delete
                    On Error GoTo ERR:
                Else
                    Str = "ロック画層にあります  " & vbCrLf
                    Style = vbOKOnly + vbInformation
                    Response = MsgBox(Str, Style, Title)
                    GoTo SELECTERR:
                End If
            Else
                Str = "ライトウェイトポリラインではありません  " & vbCrLf
                Str = Str & "ライトウェイトポリラインを選択してください  " & vbCrLf
                GoTo SELECTERR:
            End If
        End If
    End If
    '点スタイルを復元
    ThisDrawing.SetVariable "PDMODE", CurrentPDMODE
End
ERR:
    On Error Resume Next
    If Not pointObj Is Nothing Then pointObj.Delete
    '点スタイルを復元
    ThisDrawing.SetVariable "PDMODE", CurrentPDMODE
End Sub
 

ゆきち 2007/12/17(月) 10:24:37

著作権者の許可を得ていないため削除
 
 
 
 
 
 
 
 

kamegai [HOMEPAGE] 2007/12/17(月) 11:21:31

>ポリラインの方向が左から右へという作りじゃないとだめだといわれました。
反転の条件は単純に、「始点のX座標値>終点のX座標値 の場合の反転する」として、
下記のプログラムを上記の下に貼り付け、「LayerName = "0"」を
指定レイヤー名に変更してください。
エラー無き場合は、サイレントに処理が終了します。
'ライトウェイト ポリラインの始終点を反転するサンプルプログラム2
Public Sub Example2_InversLWPolyline()
Dim obj         As AcadObject
Dim LayerName   As String
Dim Coordinates As Variant
    On Error GoTo ERR:
    LayerName = "0"
    For Each obj In ActiveDocument.ModelSpace
        If TypeName(obj) = "IAcadLWPolyline" Then
            If obj.Layer = LayerName Then
                Coordinates = obj.Coordinates
                If Coordinates(0) > Coordinates(UBound(Coordinates) - 1) Then
                    If Not InversLWPolyline(obj) Then
                        MsgBox "InversLWPolylineエラー", vbOKOnly + vbCritical, "Example2"
                        Exit Sub
                    End If
                End If
            End If
        End If
    Next
Exit Sub
ERR:
    MsgBox "Exampleエラー", vbOKOnly + vbCritical, "Example2"
End Sub
 

ゆきち 2007/12/17(月) 12:50:19

著作権者の許可を得ていないため削除
 
 
 
 
 
 

kamegai [HOMEPAGE] 2007/12/17(月) 13:42:43

>この下に付け加えるのでしょうか?
え〜と、説明が不十分でしたか。

最後の最後
|ERR:
| On Error Resume Next
| If Not pointObj Is Nothing Then pointObj.Delete
| '点スタイルを復元
| ThisDrawing.SetVariable "PDMODE", CurrentPDMODE
|End Sub
の下に付け加えてください。

そうすれば、
法面などの囲み方向の修正は「Example_InversLWPolyline」
指定レイヤー一括処理は「Example2_InversLWPolyline」
の両方利用できます。

#「LayerName = "0"」の修正を確認してください。

kamegai [HOMEPAGE] 2007/12/17(月) 14:42:49

念のため・・・
最後の最後に付け加えたら、
指定レイヤー一括処理は、
[ツール]-[マクロ]-[マクロ]で"Example2_InversLWPolyline"
を選択して実行します。
"Example_InversLWPolyline"と
"Example2_InversLWPolyline"が表示されるので、
"2"のある方を選択してください。

または、メニューボタンに登録して使用しているのであれば、
^C^C-vbarun;Example_InversLWPolyline^M

^C^C-vbarun;Example2_InversLWPolyline^M
に登録変更してください。

ゆきち 2007/12/18(火) 08:59:30

≪ 解決 ≫

著作権者の許可を得ていないため削除
 
 
 
 
 
 

ちえちゃん 2007/12/18(火) 15:19:13

著作権者の許可を得ていないため削除
 
 

kamegai [HOMEPAGE] 2007/12/18(火) 16:26:43

ゆきちさん、お役に立ったようで安心致しました。

ちえちゃんさんへ。
>指定レイヤが多数ある場合はどうしたらよいでしょうか?
とのことなので、表示オンでロックとフリーズされていない画層の
ライトウェイトポリラインをすべて一括処理します。
処理から除外したい画層は非表示(またはロック・フリーズ)にして下さい。
サイレント処理では味気ないので、処理数を表示するようにしました。
前回同様、最後の最後に付け加えたら、
"Example3_InversLWPolyline"を選択して実行してください。
'ライトウェイト ポリラインの始終点を反転するサンプルプログラム3
'  対象:表示オン&ロック・フリーズされていない画層のLWPolyline
Public Sub Example3_InversLWPolyline()
Dim obj         As AcadObject
Dim Count       As Long
Dim CountAll    As Long
Dim Coordinates As Variant
    On Error GoTo ERR:
    Count = 0
    CountAll = 0
    For Each obj In ActiveDocument.ModelSpace
        If TypeName(obj) = "IAcadLWPolyline" Then
            If ActiveDocument.Layers(obj.Layer).LayerOn And _
               Not ActiveDocument.Layers(obj.Layer).Lock And _
               Not ActiveDocument.Layers(obj.Layer).Freeze Then
                CountAll = CountAll + 1
                Coordinates = obj.Coordinates
                If Coordinates(0) > Coordinates(UBound(Coordinates) - 1) Then
                    If InversLWPolyline(obj) Then
                        Count = Count + 1
                    Else
                        MsgBox "InversLWPolylineエラー", vbOKOnly + vbCritical, "Example3"
                        Exit Sub
                    End If
                End If
            End If
        End If
    Next
    If Count > 0 Then
        ActiveDocument.Utility.Prompt vbCrLf & _
           "InversLWPolyline 全 " & CStr(CountAll) & " 個中 " & CStr(Count) & " 個 反転しました."
    Else
        ActiveDocument.Utility.Prompt vbCrLf & _
           "InversLWPolyline 対象のライトウェイトポリラインはありませんでした."
    End If
    Beep
Exit Sub
ERR:
    MsgBox "Exampleエラー", vbOKOnly + vbCritical, "Example3"
End Sub
 

ちえちゃん 2007/12/18(火) 19:25:12

著作権者の許可を得ていないため削除